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

控制台美元掉落游戏开发问题:实现$下落与角色移动兼容

控制台接美元游戏解决方案

核心实现思路

解决你当前问题的关键是采用帧驱动的渲染模式,用二维数组模拟游戏画布,把角色、美元符号的绘制逻辑统一到每一帧的渲染中,同时分离输入处理和游戏逻辑更新,避免两者互相阻塞。

完整改造代码

using System;

class Program
{
    // 游戏区域参数
    private const int GameWidth = 30;
    private const int GameHeight = 20;
    private const int PlayerY = GameHeight - 1; // 角色固定在底部
    private static char[,] _gameCanvas = new char[GameHeight, GameWidth];
    
    // 角色和美元状态
    private static int _playerX = GameWidth / 2;
    private static int _dollarX = new Random().Next(GameWidth);
    private static int _dollarY = 0;
    private static Random _random = new Random();

    static void Main(string[] args)
    {
        Console.WriteLine("Press any key to start.");
        Console.ReadKey();
        Console.CursorVisible = false; // 隐藏光标,避免干扰
        Console.SetWindowSize(GameWidth + 1, GameHeight + 1); // 固定窗口大小

        // 游戏主循环
        while (true)
        {
            HandleInput();
            UpdateGameLogic();
            RenderGame();
            System.Threading.Thread.Sleep(100); // 控制帧率,100ms每帧
        }
    }

    // 处理键盘输入,仅记录移动意图
    private static void HandleInput()
    {
        if (!Console.KeyAvailable) return;
        
        var key = Console.ReadKey(true).Key;
        switch (key)
        {
            case ConsoleKey.LeftArrow:
                if (_playerX > 0) _playerX--;
                break;
            case ConsoleKey.RightArrow:
                if (_playerX < GameWidth - 3) _playerX++; // 角色占3个字符,预留空间
                break;
        }
    }

    // 更新游戏逻辑:美元下落、碰撞检测、重生
    private static void UpdateGameLogic()
    {
        // 美元下落
        _dollarY++;
        
        // 碰撞检测:角色接住美元
        if (_dollarY == PlayerY && _dollarX >= _playerX && _dollarX <= _playerX + 2)
        {
            RespawnDollar();
        }
        // 美元落地未接住,重生
        else if (_dollarY >= GameHeight)
        {
            RespawnDollar();
        }
    }

    // 重新生成美元的位置
    private static void RespawnDollar()
    {
        _dollarX = _random.Next(GameWidth);
        _dollarY = 0;
    }

    // 渲染游戏画面:先填充画布,再一次性输出
    private static void RenderGame()
    {
        // 清空画布
        for (int y = 0; y < GameHeight; y++)
        {
            for (int x = 0; x < GameWidth; x++)
            {
                _gameCanvas[y, x] = ' ';
            }
        }

        // 绘制角色(@@@)
        _gameCanvas[PlayerY, _playerX] = '@';
        _gameCanvas[PlayerY, _playerX + 1] = '@';
        _gameCanvas[PlayerY, _playerX + 2] = '@';

        // 绘制美元符号
        if (_dollarY < GameHeight)
        {
            _gameCanvas[_dollarY, _dollarX] = '$';
        }

        // 将画布输出到控制台
        Console.SetCursorPosition(0, 0);
        for (int y = 0; y < GameHeight; y++)
        {
            for (int x = 0; x < GameWidth; x++)
            {
                Console.Write(_gameCanvas[y, x]);
            }
            Console.WriteLine();
        }
    }
}

关键代码解释

  • 游戏画布:char[,] _gameCanvas作为虚拟画布,所有元素先初始化为空格,再逐一绘制角色和美元,最后一次性输出,彻底解决光标移动的干扰问题。
  • 输入与逻辑分离:HandleInput只处理按键更新角色位置,不触发渲染;UpdateGameLogic负责美元下落和碰撞,两者都在主循环中按帧率执行,互不阻塞。
  • 帧率控制:Thread.Sleep(100)控制每帧间隔,让美元下落速度稳定,同时角色移动响应流畅。
  • 碰撞检测:判断美元是否落到角色所在行,且X坐标在角色的3个字符范围内,满足则重生美元。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:54:24