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
相关产品推荐
相关产品推荐

