hansdhc 2024-01-03 10:08 采纳率: 0%
浏览 7

c语言取石子游戏遇到的奇怪bug

请问一下为什么case2为什么不能输出玩家输赢


#include <stdio.h>
#include <process.h>
#include <windows.h>
//设置石头数目
int total=10;
void Set()
{
    int n;
    char ch;
    printf("当前石子总数:%d\n",total);
    printf("是否重新设置(Y/N)?");
    scanf("%c",&ch);
    if (ch == 'Y' || ch == 'y')
    {
        printf("请输入石子总数:");
        while(1)
        {
            scanf("%d",&n);
            if(n <= 0)
            {
                printf("石子数大于0,请重新输入:");
            }else
                break;
        }
        total = n;
        system("cls");
        printf("设置成功!\n");
        printf("当前石子总数:%d\n",total);
        printf("按任意键返回上一层...");
        getchar();
        getchar();

    }
}
void color(short x)    //自定义函根据参数改变颜色
{
    if(x>=0 && x<=15)//参数在0-15的范围颜色
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);    //只有一个参数,改变字体颜色
    else//默认的颜色白色
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void PrintfGetStone()
{
color(2);
printf("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
printf("           ___________                                                                                                                                                                                                                       \n");
printf("          /           |              ___________                                                                                                                        ___________                                                          \n");
printf("         /    ________|             /   _____   \\               ____                ________              ___                                    ____________          /   _____   \\                                                       \n");
printf("        /    /                     /   /    \\    \\            |    |              /         \\           |    |             ____________         /            \\        /   /    \\    \\            取   石   子   游   戏                \n");
printf("       /    /                     /   /      \\    \\      _____|____|_____        /    ______|      _____|____|_____        /           \\       /              \\      /   /      \\    \\                                                 \n");
printf("       |    |                    |   /________\\   /      |               |      |     \\           |               |       /   ________  \\     /       ___      \\    |   /________\\   /                                                  \n");
printf("       |    |      _________     |               /       |_______________|      |     \\_______    |_______________|      /   |        |  \\    |      /   \\      |   |               /                                                     \n");
printf("       |    |     |        |     |    __________/             |    |            \\             \\         |    |          |    |        |   |   |     /     \\     |   |    __________/                                                      \n");
printf("       |    \\     |________|     |   \\                        |    |             \\________    |         |    |          |    |        |   |   |     |     |     |   |   \\                         游戏说明:每次只能取1到3颗石头         \n");
printf("       \\    \\        /    /      \\    \\                       |    |                     |    |         |    |          |    |        |   |   |     |     |     |   \\    \\                                取到最后一颗石头的人输       \n");
printf("        \\    \\______/    /        \\    \\_________             |    |_____         _______|    |         |    |_____     \\    |________|   /   |     |     |     |    \\    \\_________                                                  \n");
printf("         \\              /          \\             \\             \\         \\      |             /          \\         \\     \\               /    |     |     |     |     \\             \\                                              \n");
printf("          \\____________/            \\_____________\\             \\_________\\     |____________/            \\_________\\     \\_____________/     |_____|     |_____|      \\_____________\\                                             \n");
printf("                                                                                                                                                                                                                                             \n");
printf("                                                                                                                                                                                                                                             \n");
printf("                                                                                                                                                                                                                                             \n");
printf("                     1设置(调整石头总数)     2开始游戏(双人模式)       3三人模式            4人机对战              5退出游戏                                                                                                             \n");
printf("                                                                                                                                                                                                                                             \n");
printf("                                                                                                                                                                                                                                             \n");
printf("                                                                                                                                                                                                                                             \n");
printf("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
}
int main() {
    int choice;
    int m=1;
    while(m){
            system("cls");
        PrintfGetStone();
        scanf("%d",&choice);
        getchar();
            switch (choice) {
        case 1:
            Set(&total);
            break;
        case 2:
            while (total > 0) {
                system("cls");
                int GetStone;
                printf("当前剩余石子个数:%d\n", total);
                printf("玩家A:");
                scanf("%d", &GetStone);
                if (GetStone < 1 || GetStone > 3) {
                    printf("输入无效,请重新输入。\n");
                    continue;
                }
                total -= GetStone;
                if (total <= 0) {
                    printf("玩家A输");
                    break;
                }
                printf("当前剩余石子个数:%d\n", total);
                printf("玩家B:");
                scanf("%d", &GetStone);
                if (GetStone < 1 || GetStone > 3) {
                    printf("输入无效,请重新输入。\n");
                    continue;
                }
                total -= GetStone;
                if (total <= 0) {
                    printf("玩家B输");
                    break;
                }
            }
            break;
        case 3:
            while (total > 0) {
                system("cls");
                int GetStone;
                printf("当前剩余石子个数:%d\n", total);
                printf("玩家A:");
                scanf("%d", &GetStone);
                if (GetStone < 1 || GetStone > 3) {
                    printf("输入无效,请重新输入。\n");
                    continue;
                }
                total -= GetStone;
                if (total <= 0) {
                    printf("玩家A输");
                    break;
                }
                printf("当前剩余石子个数:%d\n", total);
                printf("玩家B:");
                scanf("%d", &GetStone);
                if (GetStone < 1 || GetStone > 3) {
                    printf("输入无效,请重新输入。\n");
                    continue;
                }
                total -= GetStone;
                if (total <= 0) {
                    printf("玩家B输");
                    break;
                }
                printf("当前剩余石子个数:%d\n", total);
                printf("玩家C:");
                scanf("%d", &GetStone);
                if (GetStone < 1 || GetStone > 3) {
                    printf("输入无效,请重新输入。\n");
                    continue;
                }
                total -= GetStone;
                if (total <= 0) {
                    printf("玩家C输");
                    break;
                }
            }
        case 5:
            printf("退出游戏。\n");
            m=0;
            break;
        default:
            printf("输入无效。\n");
            break;
    }
    }

    return 0;
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-03 12:04
    关注

    【以下回答由 GPT 生成】

    问题出现在扫描ch的输入语句上,即scanf("%c", &ch);。该语句会在输入ch之前自动读取上一次输入留下的换行符,导致实际输入的字符并不是用户预期的字符。

    要解决这个问题,可以在scanf("%c", &ch);语句前添加一行getchar();,用来读取上一次输入留下的换行符。修改后的代码如下:

    void Set()
    {
        int n;
        char ch;
        printf("当前石子总数: %d\n", total);
        printf("是否重新设置(Y/N)?");
        getchar(); // 添加这一行
        scanf("%c", &ch);
        if (ch == 'Y' || ch == 'y')
        {
            printf("请输入石子总数:");
            while (1)
            {
                scanf("%d", &n);
                if (n <= 0)
                {
                    printf("石子数大于0,请重新输入:");
                }
                else
                    break;
            }
            total = n;
            system("cls");
            printf("设置成功!\n");
            printf("当前石子总数: %d\n", total);
            printf("按任意键返回上一层...");
            getchar();
            getchar();
        }
    }
    

    通过在scanf语句前添加getchar()来读取换行符,可以保证接下来的scanf语句可以正确读取用户输入的字符,修复了这个问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 1月3日