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

C#实现石头剪刀布游戏时陷入无限循环的问题求助

C#实现石头剪刀布游戏时陷入无限循环的问题求助

兄弟,我一眼就看到你代码里的几个小问题,正是它们导致了无限循环,咱们一个个捋清楚:

1. 最关键的问题:ToUpper()没有赋值,输入验证永远不通过

C#里的字符串是不可变类型,调用player.ToUpper()的时候,它不会直接修改原来的player变量,而是返回一个新的大写字符串。你现在只写了player.ToUpper();,等于白调用,原player还是你输入的小写/混合大小写,所以内层循环的判断条件player != "ROCK" && player != "PAPER" && player != "SCISSORS"永远为真,自然会一直让你输入,陷入死循环。

解决方法很简单,把这行改成:

player = player.ToUpper();

每次输入后都把大写后的结果赋值回player,这样判断的时候就能匹配上了。

2. 外层循环没有终止条件

你初始化了playagain = true,但整个while(playagain)循环里完全没修改过这个变量的值!哪怕你正常玩完一局,循环也会一直重复下去。你得在每局结束后问问用户要不要继续,然后更新playagain的值,比如加这段代码在switch结束后:

Console.WriteLine("要不要再来一局?(输入Y继续,其他退出)");
string continueInput = Console.ReadLine().ToUpper();
playagain = continueInput == "Y";

3. 电脑的选择只生成了一次

你把int computer = random.Next(1,4);写在了外层循环外面,意思是整个程序运行期间,电脑只会选一次石头/剪刀/布,每局都用同一个选择,这显然不符合游戏逻辑。得把这行移到while(playagain)循环的内部,每局开始都重新生成一个随机数。

4. 输入逻辑的位置不合理

你现在第一次输入是在循环外面,之后进入外层循环才做验证,其实应该把输入+验证的逻辑都放到外层循环内部,这样每局开始都让用户重新输入,体验更合理。

最后给你修改后的完整代码参考:

using System;

Random random = new Random();
bool playagain = true;
string player = "";

while (playagain)
{
    // 每局重新生成电脑的选择
    int computer = random.Next(1, 4);
    
    // 输入验证:直到用户输入正确的选项
    Console.WriteLine("Enter, ROCK,PAPER,SCISSORS : ");
    player = Console.ReadLine();
    player = player.ToUpper();
    
    while (player != "ROCK" && player != "PAPER" && player != "SCISSORS")
    {
        Console.WriteLine("输入有误,请重新输入ROCK、PAPER或SCISSORS : ");
        player = Console.ReadLine();
        player = player.ToUpper();
    }

    switch (computer)
    {
        case 1:// computer = rock
            if (player.Equals("ROCK"))
            {
                Console.WriteLine("Computer : Rock");
                Console.WriteLine("It's a tie !");
            }
            else if (player.Equals("PAPER"))
            {
                Console.WriteLine("Computer : ROCK");
                Console.WriteLine("You lose !");
            }
            else
            {
                Console.WriteLine("Computer : SCISSORS");
                Console.WriteLine("You win !");
            }
            break;
        case 2:// computer = paper
            if (player.Equals("ROCK"))
            {
                Console.WriteLine("Computer : PAPER");
                Console.WriteLine("You lose !");
            }
            else if (player.Equals("PAPER"))
            {
                Console.WriteLine("Computer : PAPER");
                Console.WriteLine("It's  a tie  !");
            }
            else// player = scissors
            {
                Console.WriteLine("Computer : PAPER");
                Console.WriteLine("You win !");
            }
            break;
        case 3: // computer = scissors
            if (player.Equals("ROCK"))
            {
                Console.WriteLine("Computer : SCISSORS");
                Console.WriteLine("You win !");
            }
            else if (player.Equals("PAPER"))
            {
                Console.WriteLine("Computer : SCISSORS");
                Console.WriteLine("You lose  !");
            }
            else // player = scissors
            {
                Console.WriteLine("Computer : SCISSORS");
                Console.WriteLine("It's a tie  !");
            }
            break;
    }

    // 询问是否继续游戏
    Console.WriteLine("想再玩一局吗?(Y/N)");
    string response = Console.ReadLine()?.ToUpper() ?? "N";
    playagain = response == "Y";
}

另外你说把输入提示移到主循环外没用,那是因为核心问题是ToUpper()没赋值,不管提示放哪里,只要输入的字符串没转成大写,验证就永远通不过,自然还是无限循环啦。

备注:内容来源于stack exchange,提问作者Indective

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 08:50:28