我编写了一个简单的 Convay 生命游戏作为 C# 控制台应用程序,供我自己享受。出于美观原因,我想要实现的目标之一是我用来实际托管游戏的阵列位于控制台的中心。也就是说,当窗口控制台打开时,数组在中间是正方形的。然而,当我运行该程序时,我得到的是这样的:
虽然我不是棚子里最锋利的工具,但我想说“居中”并不是描述上述内容的方式。
以下是我计算出的值,以及协调整个工作的显示函数,以尝试实现我的目标:
int gameWindowWidth = 16;
int gameWindowHeight = 16;
int displayPosWidth = (Console.WindowWidth - gameWindowWidth) / 2;
int displayPosHeight = (Console.WindowHeight - gameWindowHeight) / 2;
string displayPosWidthFill = new StringBuilder().Insert(0, " ", displayPosWidth).ToString();
string displayPosHeightFill = new StringBuilder().Insert(0, " ", displayPosHeight).ToString();
static void DisplayGame(char[,] gameWindow, int refreshRate, string displayPosWidthFill, string displayPosHeightFill) {
foreach (char a in displayPosHeightFill) {
Console.WriteLine("");
}
for (int x = 0; x < gameWindow.GetLength(0); x++) {
Console.Write(displayPosWidthFill);
for (int y = 0; y < gameWindow.GetLength(1); y++) {
Console.Write(gameWindow[x, y].ToString() + " ");
}
Console.WriteLine("");
}
Thread.Sleep(refreshRate);
Console.Clear();
}
根据我在文档中读到的内容,Console.WindowWidth 按列计算(我认为这可以很好地转换为字符,即像字符网格),而 Console.WindowHeight 执行相同的操作,但使用行。所以,虽然我可能是个白痴,但我不明白为什么这行不通。我是否错过了明显的原因,或者是否存在源自控制台行为的更根本原因?我需要你的帮助。
你的
for
循环是错误的。您需要外循环迭代高度(即行)和内循环迭代宽度(列)。
将您的
for
块更改为:
for (int y = 0; y < gameWindow.GetLength(1); y++)
{
Console.Write(displayPosWidthFill);
for (int x = 0; x < gameWindow.GetLength(0); x++)
{
Console.Write(gameWindow[x, y].ToString() + " ");
}
Console.WriteLine("");
}
它应该按预期工作。