C# 在控制台上平滑显示网格,无抖动

C# 在控制台上平滑显示网格,无抖动,c#,console,C#,Console,我正在制作这个基于pacman控制台的游戏,其中有一个40x40的板。船上有吃东西的吃豆人和敌人。pacman由0表示,敌人由#表示。每当位置改变时,显示函数就会被调用,在当前逻辑中,每秒钟清除整个控制台并重新打印电路板上的每个元素。。但这样一来,每当整个棋盘被展示出来时,就会有这些乱七八糟的动作。请告诉我一个更好的方法来实现帕克曼和敌人的平稳移动,理想情况下,我应该只改变pacman和敌人的位置,但我需要清除控制台,以便在同一地点显示网格,否则它将继续向下滚动。显示功能的代码如下: publi

我正在制作这个基于pacman控制台的游戏,其中有一个40x40的板。船上有吃东西的吃豆人和敌人。pacman由0表示,敌人由#表示。每当位置改变时,显示函数就会被调用,在当前逻辑中,每秒钟清除整个控制台并重新打印电路板上的每个元素。。但这样一来,每当整个棋盘被展示出来时,就会有这些乱七八糟的动作。请告诉我一个更好的方法来实现帕克曼和敌人的平稳移动,理想情况下,我应该只改变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.Clear();
对于(int i=0;i<40;i++)
{
对于(int j=0;j<40;j++)
{
bool packFound=false;
bool enmFound=假;
foreach(myVers.packmans中的Packman元素)
{
if(element.x==i&&element.y==j)
{
packFound=true;
打破
}
}
foreach(myVers.enemys中的Packman元素)
{
if(element.x==i&&element.y==j)
{
enmFound=真;
打破
}
}
if(packFound==true)
{
Console.Write('0');
myVers.board[i,j]='';
}
else if(enmFound==true)
{
myVers.board[i,j]='';
控制台。写(“#”);
}
其他的
{
Console.Write(myVers.board[i,j]);
}
}
Console.Write('\n');
}
//Console.Write(“\n日志计数”+myVers.foodCount+”\n”);
}

如果只重新绘制真正改变的字符,会怎么样?也许使用

时,如果只重新绘制真正改变的字符会怎么样?也许可以使用尝试先为电路板构建
字符串
,然后一次性将整个内容传递到控制台。仍然执行清除操作

这将是以下人员的工作:

公共静态无效显示()
{
var boardStr=新的StringBuilder();
对于(int i=0;i<40;i++)
{
对于(int j=0;j<40;j++)
{
bool packFound=false;
bool enmFound=假;
foreach(myVers.packmans中的Packman元素)
{
if(element.x==i&&element.y==j)
{
packFound=true;
打破
}
}
foreach(myVers.enemys中的Packman元素)
{
if(element.x==i&&element.y==j)
{
enmFound=真;
打破
}
}
if(packFound==true)
{
董事会追加(“0”);
myVers.board[i,j]='';
}
else if(enmFound==true)
{
myVers.board[i,j]='';
boardStr.追加(“#”);
}
其他的
{
boardStr.Append(myVers.board[i,j].ToString());
}
}
boardStr.Append(“\n”);
}
//Console.Write(“\n日志计数”+myVers.foodCount+”\n”);
Console.Clear();
Console.Write(boardStr.ToString());
}

首先尝试为电路板构建
字符串
,然后一次性将整个内容传递到控制台。仍然执行清除操作

这将是以下人员的工作:

公共静态无效显示()
{
var boardStr=新的StringBuilder();
对于(int i=0;i<40;i++)
{
对于(int j=0;j<40;j++)
{
bool packFound=false;
bool enmFound=假;
foreach(myVers.packmans中的Packman元素)
{
if(element.x==i&&element.y==j)
{
packFound=true;
打破
}
}
foreach(myVers.enemys中的Packman元素)
{
if(element.x==i&&element.y==j)
{
enmFound=真;
打破
}
}
if(packFound==true)
{
董事会追加(“0”);
myVers.board[i,j]='';
}
else if(enmFound==true)
{
myVers.board[i,j]='';
boardStr.追加(“#”);
}
其他的
{
boardStr.Append(myVers.board[i,j].ToString());
}
}
boardStr.Append(“\n”);
}
//Console.Write(“\n日志计数”+myVers.foodCount+”\n”);
Console.Clear();
Console.Write(boardStr.ToString());
}

也试过了,但还是有一些混蛋。Marko的解决方案就是…也尝试过了,但还是有一些混蛋。Marko的解决方案是可行的。。
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());
    }