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

C#新手求助:基础骰子游戏中do-while循环无法按预期终止

解决你的C#骰子游戏do-while循环终止问题

嘿,作为C#新手能写出这样的游戏框架已经很棒了!咱们一步步解决你的循环问题,顺便帮你优化几个容易踩的小坑:

1. 循环条件的逻辑错误

你想要的是只要玩家或怪物其中一方生命值归0就终止循环,那反过来想:循环应该继续的条件是双方都还有生命值(都>0)。

你原来写的while ((liv >= 0) || (mitLiv >= 0))逻辑完全反了——这个条件意味着「只要有一方生命值≥0,循环就继续」,而游戏里总有至少一方生命值是≥0的,所以循环永远停不下来!

正确的循环条件应该是:

} while (liv > 0 && mitLiv > 0);

这样只有当双方都活着的时候,循环才会继续执行;只要任意一方生命值≤0,循环就终止。

2. 生命值修改没生效的隐形Bug

你代码里有几处只计算了生命值变化,但没把新值赋值给变量!比如:

  • 掷出1的时候:Console.WriteLine("dit liv er " + (mitLiv - 2)); 这里只是计算了mitLiv-2,但没把结果存回mitLiv,所以玩家生命值根本没减少
  • 掷出6的时候:Console.WriteLine("monsterets liv er nu " + (liv - 2)); 同样的问题,怪物生命值也没真正减少

这也是循环停不下来的关键原因——生命值数值根本没变化,循环条件永远满足!

修正方式是用赋值运算符:

// 掷出1的情况
mitLiv -= 2; // 直接把mitLiv减去2后存回去
Console.WriteLine("dit liv er " + mitLiv);

// 掷出6的情况
liv -= 2;
Console.WriteLine("monsterets liv er nu " + liv);

3. Random对象的优化

你把Random rnd = new Random();放在了do-while循环内部,每次循环都会创建一个新的Random实例。由于Random默认用系统当前时间做种子,循环执行速度快的话,多个Random实例会拿到相同的种子,导致生成的随机数重复。

应该把Random的创建移到循环外面,比如Main方法开头:

static void Main(string[] args) {
    Random rnd = new Random(); // 只创建一次
    int liv; //monsterets liv
    int mitLiv; //dit liv
    // ... 剩下的代码
}

4. 结尾胜负判断的修正

你原来的结尾判断逻辑有问题:

if (liv >= 0) {
    Console.WriteLine("Du har vundet!! monsteret er død :)");
}
if (mitLiv >= 0) {
    Console.WriteLine("du har desværre tabt! :(");
}

如果玩家赢了(怪物liv≤0),此时玩家的mitLiv肯定也是≥0的,会同时输出赢和输的信息。

应该改成互斥的判断:

if (liv <= 0) {
    Console.Clear();
    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine("Du har vundet!! monsteret er død :)");
} else if (mitLiv <= 0) {
    Console.Clear();
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("du har desværre tabt! :(");
}

修改后的完整代码

static void Main(string[] args) {
    Random rnd = new Random(); // 移到循环外,只初始化一次
    int liv; //monsterets liv
    int mitLiv; //dit liv
    Console.ForegroundColor = ConsoleColor.Yellow;
    Console.WriteLine("Velkommen til monster terning spil. du vinder spillet ved at dræbe monsteret.");
    Console.WriteLine("Indtast hvor mange liv monsteret skal have");
    liv = Convert.ToInt32(Console.ReadLine()); // her læser den monsterets liv
    Console.Clear();
    Console.WriteLine("hvor mange liv skal du have?");
    mitLiv = Convert.ToInt32(Console.ReadLine()); // her læser den mit liv
    Console.Clear();
    Console.WriteLine("du har givet monsteret {0} liv og dig selv {1} i liv", liv, mitLiv);
    Console.WriteLine("tryk på en knap for at komme videre");
    Console.ReadKey();
    Console.Clear();
    Console.WriteLine("tryk på en knap for at slå med terningen");//spillet går igang
    Console.ReadKey();
    
    do {
        int dice = rnd.Next(1, 7); //den generer et random tal mellem 1-6
        if (dice == 1) {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("du slog {0}. Critical hit! monster slår 2 gange", dice);
            mitLiv -= 2; // 正确赋值生命值
            Console.WriteLine("dit liv er " + mitLiv);
            Console.WriteLine("tryk på en knap for at slå igen");
            Console.ReadKey();
        }
        if (dice == 2) {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("du slog {0} monsteret slog tilbage", dice);
            Console.WriteLine("du har mistet et liv. dit liv er " + --mitLiv);
            Console.WriteLine("tryk på en knap for at slå igen");
            Console.ReadKey();
        }
        if (dice == 3) {//hvis tallet er 2 eller 3 gør følgende
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("du slog {0} monsteret slog tilbage", dice);
            Console.WriteLine("du har mistet et liv. dit liv er " + --mitLiv);
            Console.WriteLine("tryk på en knap for at slå igen");
            Console.ReadKey();
        }
        if (dice == 4) {
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("du slog {0} du ramte monsteret 1 gang", dice);
            Console.WriteLine("monsterets liv er nu " + --liv);
            Console.WriteLine("tryk på en knap for at slå igen");
            Console.ReadKey();
        }
        if (dice == 5) {
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("du slog {0} du ramte monsteret 1 gang", dice);
            Console.WriteLine("monsterets liv er nu " + --liv);
            Console.WriteLine("tryk på en knap for at slå igen");
            Console.ReadKey();
        }
        if (dice == 6) {
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("du slog {0} Critical Hit! du slog monsteret 2 gange", dice);
            liv -= 2; // 正确赋值生命值
            Console.WriteLine("monsterets liv er nu " + liv);
            Console.WriteLine("tryk på en knap for at slå igen");
            Console.ReadKey();
        }
    } while (liv > 0 && mitLiv > 0); // 修正后的循环条件

    // 修正后的胜负判断
    if (liv <= 0) {
        Console.Clear();
        Console.ForegroundColor = ConsoleColor.Green;
        Console.WriteLine("Du har vundet!! monsteret er død :)");
    } else if (mitLiv <= 0) {
        Console.Clear();
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("du har desværre tabt! :(");
    }
}

内容的提问来源于stack exchange,提问作者Mathias Clausen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:32:40