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

石头剪刀布游戏中Player1与Player2分数变量无法递增问题

石头剪刀布游戏分数无法递增的问题排查与修复

核心问题:分数计算逻辑从未执行

在main函数的循环中,当玩家输入有效选择(0/1/2)时,代码执行了continue语句——这会直接跳过循环体剩余的所有代码(包括关键的gamelogic(Pl1choice, Pl2choice);调用),导致分数更新逻辑完全没机会运行,所以Player1和Player2的分数始终保持初始值0。

修复方法

调整输入验证逻辑,移除错误的continue,确保有效输入时能执行分数计算:

// 替换原输入验证代码
if (Pl1choice < 0 || Pl1choice > 2)
{
    printf("You entered an invalid number so you have to restart the game.\n");
    break;
}
// 有效输入才执行胜负判断
gamelogic(Pl1choice, Pl2choice);

游戏胜负逻辑完全颠倒

gamelogic函数中的条件判断不仅存在运算符优先级错误,还完全颠倒了胜负规则:

  • 原逻辑中,玩家1选布(1)赢石头(0)时,反而给玩家2加分;
  • 运算符优先级问题导致Pl2choice == 0 && Pl1choice == 1 || Pl1choice == 2等价于(Pl2choice==0 && Pl1choice==1) || Pl1choice==2,即只要玩家1选剪刀(2),不管电脑选什么,都会给玩家2加分。

修复后的gamelogic函数

按照石头剪刀布的正确规则(石头赢剪刀,布赢石头,剪刀赢布)重构逻辑:

int gamelogic(int Pl1choice, int Pl2choice)
{
    // 平局处理
    if (Pl1choice == Pl2choice)
    {
        return 0;
    }
    // 玩家1获胜的情况
    if ((Pl1choice == 0 && Pl2choice == 2) || 
        (Pl1choice == 1 && Pl2choice == 0) || 
        (Pl1choice == 2 && Pl2choice == 1))
    {
       Player1++;
       return 1;
    }
    // 剩余情况均为玩家2获胜
    Player2++;
    return 2;
}

随机数生成重复问题

generatearandomnumber函数中每次调用srand(time(NULL)),由于循环迭代速度远快于秒级时间更新,会导致多次生成相同的随机数。应将随机数种子初始化放在main函数开头,只执行一次:

int main()
{
    srand(time(NULL)); // 仅初始化一次随机数种子
    printf("Hey! You are the player no.1 and Computer is Player no.2\n");
    // ... 剩余代码
}

同时删除generatearandomnumber中的srand(time(NULL)):

void generatearandomnumber(void)
{
    Pl2choice = rand() % 3;
}

修复后的完整代码

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

// Globally declared variables here
int Pl1choice, Pl2choice;
int Player1 = 0, Player2 = 0;

// Declarations of the functions here
void generatearandomnumber(void);
void Player1choicedisp(void);
int gamelogic(int Pl1choice, int Pl2choice);
void pl1choices(int Pl1choice);
void pl2choices(int Pl2choice);

int main()
{
    srand(time(NULL));
    printf("Hey! You are the player no.1 and Computer is Player no.2\n");
    for (int i = 1; i <= 3; i++)
    {
        Player1choicedisp();
        scanf("%d", &Pl1choice);
        generatearandomnumber();
        pl1choices(Pl1choice);
        pl2choices(Pl2choice);

        // 输入验证
        if (Pl1choice < 0 || Pl1choice > 2)
        {
            printf("You entered an invalid number so you have to restart the game.\n");
            break;
        }

        gamelogic(Pl1choice, Pl2choice);
    }

    if(Player1 > Player2)
    {
        printf("Winner is Player1\n");
    }
    else if(Player1 == Player2)
    {
        printf("Its a tie\n");
    }
    else
    {
        printf("Winner is Player2\n");
    }
    printf("Scores :-\n");
    printf("Player1 = %d\n", Player1);
    printf("Player2 = %d\n", Player2);
    return 0;
}

void generatearandomnumber(void)
{
    Pl2choice = rand() % 3;
}

void Player1choicedisp(void)
{
    printf("Enter your choice for the Rock/Paper/scissors\n");
    printf("Enter 0 for ROCK\n");
    printf("Enter 1 for PAPER\n");
    printf("Enter 2 for SCISSORS\n");
}

int gamelogic(int Pl1choice, int Pl2choice)
{
    if (Pl1choice == Pl2choice)
    {
        return 0;
    }
    if ((Pl1choice == 0 && Pl2choice == 2) || 
        (Pl1choice == 1 && Pl2choice == 0) || 
        (Pl1choice == 2 && Pl2choice == 1))
    {
       Player1++;
       return 1;
    }
    Player2++;
    return 2;
}

void pl1choices(int Pl1choice)
{
    switch(Pl1choice)
    {
        case 0:
            printf("Player 1 chose ROCK\n");
            break;
        case 1:
            printf("Player 1 chose PAPER\n");
            break;
        case 2:
            printf("Player 1 chose SCISSORS\n");
            break;
    }
}

void pl2choices(int Pl2choice)
{
    switch(Pl2choice)
    {
        case 0:
            printf("Player 2 chose ROCK\n");
            break;
        case 1:
            printf("Player 2 chose PAPER\n");
            break;
        case 2:
            printf("Player 2 chose SCISSORS\n");
            break;
    }
}

内容的提问来源于stack exchange,提问作者SWAYAM DALAL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:34:52