无所事事和交叉(井字),子例程查询



所以我正处于我的Noughts和Crosses项目的最后阶段,我非常困住了,我已经完成了移动验证子例程以及仅基于将框中的空格更改为"X"或"O"的子例程, 然而我的代码似乎告诉我,我的代码的某些部分在当前上下文中不存在,我完全感到困惑

代码为:

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string[,] grid = new string[3, 3] {{" "," "," "},
{" "," "," "},
{" "," "," "}};
string board = System.IO.File.ReadAllText("E:\BoardGame.txt");
Console.WriteLine(board);
int player = 0;
var XCoordinate = 0;
var YCoordinate = 0;
int x, y;
GetMoveCoordinates(ref XCoordinate, ref YCoordinate);
if (player == 0)
{                
grid[XCoordinate, YCoordinate] = " X ";
player++;
}
else
{
grid[XCoordinate, YCoordinate] = " O ";
player--;
}            
UpdateGrid(grid, box);
if (player == 1)
{
}
}

public static void GetMoveCoordinates(ref int XCoordinate, ref int YCoordinate)
{
int CommaLocation;
bool GameHasBeenWon = false;
string CoordinatesInput;
string XChar, YChar;
while (GameHasBeenWon == false)
{
try
{
Console.Write("Enter your coordinates: (x,y) ");
CoordinatesInput = Console.ReadLine();
CommaLocation = CoordinatesInput.IndexOf(",".ToString());
XChar = CoordinatesInput.Substring(CommaLocation - 1, CommaLocation);
YChar = CoordinatesInput.Substring(CommaLocation + 1);
XCoordinate = int.Parse(XChar);
YCoordinate = int.Parse(YChar);
}
catch
{
Console.WriteLine("Invalid Input- Please Try Again");
}
}
}

public static bool CheckValidMove(int XCoordinate, int YCoordinate, string[,] Board)
{
if ((XCoordinate >= 1) || (XCoordinate <= 3))
{
if ((YCoordinate >= 1) || (YCoordinate <= 3))
{
if ((Board[XCoordinate, YCoordinate]) == " ")
{
return true;
}
else return false;
}
else return false;
}
else return false;
}

public static void UpdateGrid(string[,] grid, string box)
{
Console.Clear();
for (int x = 0; x < grid.GetLength(0); x++)
{
for (int y = 0; y < grid.GetLength(1); y++)
{
box = box.Replace((x + 1) + "," + (y + 1), grid[y, x]);
}
}
// In the case not required as clearning the console default the cursor back to 0,0, but left in 
// as an example
Console.SetCursorPosition(0, 0);
Console.WriteLine(box);
}
}
}

然而,我似乎遇到的问题在 Main 下,在 if 语句下,代码似乎告诉我 Update(grid,box) 中的框在当前上下文中不存在,但它应该在最后一个子例程中存在?我应该把它作为参考声明还是我错过了什么?另外,如果您有任何关于如何整理代码的提示,我将不胜感激(是的,我会添加win参数,但我想先绘制我的符号)。

网格如下所示:

+---+---+---+
|   |   |   |
+---+---+---+
|   |   |   |
+---+---+---+
|   |   |   |
+---+---+---+

这里有几个错误。首先,以下内容不会编译:

UpdateGrid(grid, box);

正如 Andrew Whitaker 在注释中指出的那样,main 方法中没有"box"变量(您从未声明或初始化过它)。定义该变量是什么并正确初始化它,这将再次编译。

接下来,简要介绍以下内容的风格说明:

while (GameHasBeenWon == false)

不要明确地比较真假 - 正确的方法是

while (!GameHasBeenWon)

下一行要评论有几个错误:

(XCoordinate >= 1) || (XCoordinate <= 3)

这意味着 XCoordinate>= 1 或小于或等于 3,这根本不是你的意思。实际上,按照这个逻辑,任何整数都是有效的,因为它要么大于 1,要么等于 1,要么小于 3,要么等于 3。(想想看 - 像这样的语句可能是假的整数是什么?此外,3 显然不是有效索引,但 0 是。请记住,数组的索引为零。因此,这实际上应该是

(XCoordinate >= 0) && (XCoordinate < 3)

就您的 if 语句而言:

if ((Board[XCoordinate, YCoordinate]) == " ")
{
return true;
}
else return false;

(Board[XCoordinate, YCoordinate]) == " "为真时准确返回true,当该语句为假时准确返回false。你可以做

return (Board[XCoordinate, YCoordinate]) == " ";

事实上,你可以对整个"if"语句这样做。(我现在没有坐在 IDE 前面,所以如果我的语法在这里不完美,我深表歉意)。

return ((XCoordinate >= 0) && (XCoordinate < 3) &&
((YCoordinate >= 0) && (YCoordinate < 3)) &&
((Board[XCoordinate, YCoordinate]) == " "));