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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:47:51