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