You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:18:49