在控制台上无抖动地平滑显示网格

时间:2014-01-01 14:01:19

标签: c# console

我正在制作这款基于pacman游戏机的游戏,其中有一个40x40的主板。董事会上有吃着食物的pacmans和敌人。 pacman由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");
        }

2 个答案:

答案 0 :(得分:3)

如果您只重绘真正改变的字符怎么办?也许使用Console.SetCursorPosition

答案 1 :(得分:1)

首先尝试为棋盘构建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());
    }