.NET Core控制台程序中如何获取C#随机生成的玩家X/Y最后位置
问题分析
你的代码里藏着一个关键逻辑错误:每次循环(除了按Q退出时)都会重新随机生成playerX和playerY的值,这就导致你每次按键移动时,都是在一个全新的随机位置上做加减操作,而不是基于上一次的位置更新。
为什么你会觉得Y值“正确”?其实只是巧合——比如你连续按W/S时,每次循环先重置X和Y为随机数,然后修改Y值,最后退出时Y是最后一次随机数+1/-1;但X值因为你没去修改它,所以停留在最后一次随机生成的值,看起来就像是“随机值”。
解决方案
把随机初始化playerX和playerY的代码移到do-while循环外面,只在程序启动时生成一次初始随机位置。之后每次按键只修改对应的X或Y值,不再重置整个位置。
修正后的代码如下:
// 初始化随机数生成器 Random r = new Random(); // 仅在程序启动时生成一次初始随机位置 int playerX = r.Next(0, 1000); int playerY = r.Next(0, 1000); ConsoleKeyInfo targetPos; do { targetPos = Console.ReadKey(true); Console.WriteLine(" "); switch (targetPos.Key) { case ConsoleKey.D: playerX++; // 可选:限制X在地图范围内(0-999,对应1000px的边界) playerX = Math.Clamp(playerX, 0, 999); Console.WriteLine("Right - Position X: {0} ", playerX); Console.WriteLine(); break; case ConsoleKey.A: playerX--; playerX = Math.Clamp(playerX, 0, 999); Console.WriteLine("Left - Position X: {0} ", playerX); Console.WriteLine(); break; case ConsoleKey.S: playerY--; playerY = Math.Clamp(playerY, 0, 999); Console.WriteLine("Down - Position Y: {0} ", playerY); Console.WriteLine(); break; case ConsoleKey.W: playerY++; playerY = Math.Clamp(playerY, 0, 999); Console.WriteLine("Up - Position Y: {0} ", playerY); Console.WriteLine(); break; case ConsoleKey.Q: Console.WriteLine("\nLast Position X: {0}", playerX); Console.WriteLine("\nLast Position Y: {0}", playerY); Environment.Exit(0); break; } Console.WriteLine(targetPos.Key.ToString()); } while (targetPos.Key != ConsoleKey.Escape);
额外优化提示
- 我添加了
Math.Clamp方法来限制X/Y的范围在0到999之间,避免位置超出1000px×1000px的地图边界,这个可以根据你的实际需求选择保留或移除。 - 如果你确实需要每次按键前都先随机生成新位置,再移动,那不要在循环开头统一重置,而是在对应按键的case里单独生成随机值,比如:
case ConsoleKey.D: playerX = r.Next(0, 1000); // 仅在按D时重置X的随机值 playerX++; Console.WriteLine("Right - Position X: {0} ", playerX); break;
内容的提问来源于stack exchange,提问作者Bernardo Medeiros
相关产品推荐
相关产品推荐

