在控制台上平滑显示网格,没有抖动



我正在制作这个基于吃豆人控制台的游戏,其中有一个 40x40 的板。棋盘上有吃豆人和敌人在吃食物。吃豆人用 0 表示,敌人用 # 表示。每次位置发生变化时,都会调用显示函数,在当前逻辑中,每秒清除整个控制台并重新打印板上的每个元素。但是这样,每当显示整个板时,都会有这些混蛋。请告诉我一种更好的方法来实现paacman和敌人的平稳运动,理想情况下我应该只改变pacman和敌人的位置,但我需要清除控制台才能在同一位置显示网格,否则它只会继续向下滚动。显示功能的代码如下:

public static void display()
        {
            Console.Clear();
            for (int i = 0; i < 40; i++)
            {
                for (int j = 0; j < 40; j++)
                {
                    bool packFound = false;
                    bool enmFound = false;
                    foreach (Packman element in myVers.packmans)
                    {
                        if (element.x == i && element.y == j)
                        {
                            packFound = true;
                            break;
                        }
                    }
                    foreach (Packman element in myVers.enemys)
                    {
                        if (element.x == i && element.y == j)
                        {
                            enmFound = true;
                            break;
                        }
                    }
                    if (packFound == true)
                    {
                        Console.Write('0');
                        myVers.board[i, j] = ' ';
                    }
                    else if (enmFound == true)
                    {
                        myVers.board[i, j] = ' ';
                        Console.Write('#');
                    }
                    else
                    {
                        Console.Write(myVers.board[i, j]);
                    }
                }
                Console.Write('n');
            }
            //Console.Write("nFood Count " + myVers.foodCount + "n");
        }

如果你只重绘真正改变的角色怎么办?也许使用 Console.SetCursorPosition

首先尝试为开发板构建String,然后一次将整个内容传递给控制台。 仍然执行清除操作。

这将是一项工作: String Builder

public static void display()
    {
        var boardStr = new StringBuilder();
        for (int i = 0; i < 40; i++)
        {
            for (int j = 0; j < 40; j++)
            {
                bool packFound = false;
                bool enmFound = false;
                foreach (Packman element in myVers.packmans)
                {
                    if (element.x == i && element.y == j)
                    {
                        packFound = true;
                        break;
                    }
                }
                foreach (Packman element in myVers.enemys)
                {
                    if (element.x == i && element.y == j)
                    {
                        enmFound = true;
                        break;
                    }
                }
                if (packFound == true)
                {
                   boardStr.Append("0");
                    myVers.board[i, j] = ' ';
                }
                else if (enmFound == true)
                {
                    myVers.board[i, j] = ' ';
                    boardStr.Append("#");
                }
                else
                {
                    boardStr.Append(myVers.board[i, j].ToString());
                }
            }
            boardStr.Append("n");
        }
        //Console.Write("nFood Count " + myVers.foodCount + "n");
        Console.Clear();
        Console.Write(boardStr.ToString());
    }

最新更新