C++剪刀石头布游戏指针传参统计胜负值异常问题求助
问题原因与解决方法
看起来你这几个问题都是C++新手容易踩的典型坑,我来一步步帮你拆解和解决:
核心问题分析
1. 未初始化的局部变量导致垃圾值
在main函数中,你定义的userWins、compWins、numTies三个统计变量没有初始值:
int userWins; int compWins; int numTies;
C++的局部变量默认不会被初始化为0,它们会保留内存里的随机垃圾值。如果后续代码没有正确覆盖这些值,输出时就会出现-416437631、32769这类奇怪的数字。
2. Winner函数中的致命语法错误
你在winner函数第一行写的代码完全不符合预期:
*U = userWin *C = compWins;
编译器会把它解析为:
*U = (userWin * C) = compWins;
这不仅没有把compWins的值赋给*C,还会错误计算userWin(这里你还拼错了,应该是userWins)和指针C的乘积,导致*C(也就是main里的compWins)始终保留初始垃圾值。
3. 类成员与局部变量的混淆
从代码结构看,userWins、compWins、numTies应该是rps类的成员变量,但你在main里又定义了同名局部变量,还通过指针传递类成员的值。这种重复定义很容易导致逻辑混乱,比如统计值更新和输出的不是同一组变量。
一步步解决方法
1. 初始化局部变量
先给main里的统计变量初始化为0,从根源上杜绝垃圾值:
int userWins = 0; int compWins = 0; int numTies = 0;
2. 修复Winner函数的赋值逻辑
把错误的一行拆成独立的赋值语句,修正拼写错误,还要调整赋值顺序(先更新统计值,再同步到指针变量):
void winner(int* U, int* C, int* T) { // 先进行胜负判断,更新类成员的统计值 if(compChoice == userChoice){ std::cout << "It's a tie!\n"; numTies++; } else if(userChoice == 'P' && compChoice == 'R'){ std::cout << "You win! Paper covers rock.\n"; userWins++; } // 其他胜负判断分支保持不变... // 再把更新后的统计值同步到指针指向的变量 *U = userWins; *C = compWins; *T = numTies; std::cout << "\n"; }
3. 简化逻辑:直接使用类成员变量(推荐)
其实你完全不需要用指针传参这么麻烦,既然userWins、compWins、numTies是rps类的成员,直接让winner修改类成员,results函数直接输出类成员即可,避免传参错误:
修改winner函数(去掉指针参数):
void winner() { if(compChoice == userChoice){ std::cout << "It's a tie!\n"; numTies++; } else if(userChoice == 'P' && compChoice == 'R'){ std::cout << "You win! Paper covers rock.\n"; userWins++; } // 其他胜负判断分支... std::cout << "\n"; }
修改main函数(去掉局部统计变量):
int main(){ rps obj; char char1('y'); std::cout << "THIS IS A GAME OF ROCK, PAPER, SCISSORS!\n"; do{ obj.player(); obj.computer(); obj.winner(); // 无需传参 std::cout << "Enter y to play again or anything else to quit: "; std::cin >> char1; std::cout << "\n"; }while(char1 == 'y' || char1 == 'Y' ); obj.results(); // ... }
确保results函数输出类成员:
void rps::results() { std::cout << "Here are the results... \n"; std::cout << "YOU: " << userWins << "\n"; std::cout << "COMPUTER: " << compWins << "\n"; std::cout << "TIES: " << numTies << "\n"; }
总结
你的问题主要是语法错误+未初始化变量+逻辑顺序错误导致的,按照上面的步骤修改后,统计结果应该就能正常显示了。
内容的提问来源于stack exchange,提问作者odnal
相关产品推荐
相关产品推荐

