C# 我能';似乎无法将数组传递给不同的方法,一个用于初始化,一个用于修改?
我正在创建一个Tic-Tac-Toe游戏,我想有一个绘制网格的方法(C# 我能';似乎无法将数组传递给不同的方法,一个用于初始化,一个用于修改?,c#,C#,我正在创建一个Tic-Tac-Toe游戏,我想有一个绘制网格的方法(DrawGrid)和一个玩家移动的方法(PlayerMove)。在PlayerMove中,我想修改数组,将其中一个框的值更改为“X”或“O”(稍后添加不同的播放器)。框中的值应更改为“X”或“O”,但不是 首先,我将来自PlayerMove的for循环放在Main方法中,但意识到这不起作用,所以我将其放在它自己的方法中,但是我将框中的值的数组保留在Main方法中,但当我尝试通过引用传入时,这不起作用(它不会更改的原因是因为它仍然
DrawGrid
)和一个玩家移动的方法(PlayerMove
)。在PlayerMove
中,我想修改数组,将其中一个框的值更改为“X”或“O”(稍后添加不同的播放器)。框中的值应更改为“X”或“O”,但不是
首先,我将来自PlayerMove
的for循环放在Main方法中,但意识到这不起作用,所以我将其放在它自己的方法中,但是我将框中的值的数组保留在Main方法中,但当我尝试通过引用传入时,这不起作用(它不会更改的原因是因为它仍然指向原始数组,如果是,如何使它使两个实例都指向新数组?)。然后,我尝试通过在主方法之外声明一个字段/属性并在另一个方法中初始化来解决此问题。然后,我传入了arr并在另一个方法中更改了数组中的一些值(或只是一个值)
public static void Main(string[] args)
{
Console.WriteLine("Welcome to Tic-Tac-Toe. Player 1 = X and Player 2 = O");
string[] arr = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; //**each char for each square in the grid - defining array**
int player = 1; //**player is set to 1 in the beginning to allow for error checking (now set to 2 because of iteration - test)**
string answer; //**user input**
bool win = false; //**win condition**
bool error = false; //**validating user input**
while (win == false) //**loop for each player's turn**
{
DrawGrid(ref arr);
//Console.WriteLine("");
//Console.WriteLine("|{0}|{1}|{2}|\n|{3}|{4}|{5}|\n|{6}|{7}|{8}|", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8]);
//**put iterating player turns here**
Console.WriteLine("");
Console.WriteLine("Player {0}'s turn. Enter a number slot", player);
answer = Console.ReadLine();
if (error == false)
{
PlayerMove(ref answer, ref arr); //make player move
}
else
{
continue;
}
//DrawGrid(ref arr);
}
}
//string[] arr;
private static void DrawGrid(ref string[] arr)
{
//char[] arr = new char[9];
//string[] arr = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
Console.WriteLine("|{0}|{1}|{2}|\n|{3}|{4}|{5}|\n|{6}|{7}|{8}|", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8]);
}
private static void PlayerMove(ref string answer, ref string[] arr) //**make whole new class for this method?**
{
for (int i = 0; i > 8; i++) //make player move
{
if (answer == arr[i])
{
arr[i] = "X";
}
}
}
带有
**
的注释是为了理解我的代码。其他注释是我试图解决问题的代码的不同部分。对于PlayerMove方法中的循环条件,无法进行迭代
初始值i=0,而第一次启动时i>8的条件始终为false,请将PlayerMove方法更改为:
private static void PlayerMove(ref string answer, ref string[] arr)
{
for (int i = 0; i <= 8; i++) //make player move
{
if (answer == arr[i])
{
arr[i] = "X";
}
}
}
private static void PlayerMove(参考字符串应答,参考字符串[]arr)
{
for(int i=0;ifor)PlayerMove方法中的循环条件使其无法迭代
初始值i=0,而第一次启动时i>8的条件始终为false,请将PlayerMove方法更改为:
private static void PlayerMove(ref string answer, ref string[] arr)
{
for (int i = 0; i <= 8; i++) //make player move
{
if (answer == arr[i])
{
arr[i] = "X";
}
}
}
private static void PlayerMove(参考字符串应答,参考字符串[]arr)
{
for(int i=0;i@Rashid的答案是正确的。您的for循环条件是错误的。但我想补充几点:
- 通过ref传递是完全不必要的。只有值类型需要ref关键字,而数组不是值类型。您始终可以在不使用ref关键字的情况下更改数组的内容,但不能使其指向其他数组
- 另一件事是“else continue”部分。当执行到达那里时,它只进入while条件,无论如何它都会这样做
- 还有一个我最讨厌的问题:永远不要将布尔表达式与真或假进行比较。
If(a==true)
与If(a)
相同If(a==false)
与If(!a)
相同
下面的代码可以正常工作:
publicstaticvoidmain(字符串[]args)
{
Console.WriteLine(“欢迎来到Tic-Tac-Toe.Player 1=X和Player 2=O”);
string[]arr=新字符串[]{“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”};//网格定义数组中每个正方形的每个字符
int player=1;//player在开始时设置为1,以允许进行错误检查(由于迭代-测试,现在设置为2)**
字符串应答;//用户输入**
bool win=false;//win条件**
bool error=false;//正在验证用户输入**
while(!win)//循环每个玩家的回合**
{
牵引格栅(arr);
控制台。写线(“”);
WriteLine(“轮到玩家{0},输入一个数字槽”,玩家);
answer=Console.ReadLine();
如果(!错误)
{
玩家移动(回答,arr);//使玩家移动
}
}
}
私有静态void DrawGrid(字符串[]arr)
{
Console.WriteLine(“{0}{1}{2}}{124n}{3}{4}{5}{124n}{6}{7}{8}{124n]”,arr[0],arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8]);
}
private static void PlayerMove(string-answer,string[]arr)//为这个方法创建一个全新的类**
{
for(int i=0;i@Rashid的答案是正确的。您的for循环条件是错误的。但我想补充几点:
- 通过ref传递是完全不必要的。只有值类型需要ref关键字,而数组不是值类型。您始终可以在不使用ref关键字的情况下更改数组的内容,但不能使其指向其他数组
- 另一件事是“else continue”部分。当执行到达那里时,它只进入while条件,无论如何它都会这样做
- 还有一个我最讨厌的问题:永远不要将布尔表达式与真或假进行比较。
If(a==true)
与If(a)
相同If(a==false)
与If(!a)
相同
下面的代码可以正常工作:
publicstaticvoidmain(字符串[]args)
{
Console.WriteLine(“欢迎来到Tic-Tac-Toe.Player 1=X和Player 2=O”);
string[]arr=新字符串[]{“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”};//网格定义数组中每个正方形的每个字符
int player=1;//player在开始时设置为1,以允许进行错误检查(由于迭代-测试,现在设置为2)**
字符串应答;//用户输入**
bool win=false;//win条件**
bool error=false;//正在验证用户输入**
while(!win)//循环每个玩家的回合**
{
牵引格栅(arr);
控制台。写线(“”);
WriteLine(“轮到玩家{0},输入一个数字槽”,玩家);
answer=Console.ReadLine();
如果(!错误)
{
玩家移动(回答,arr);//使玩家移动
}
}
}
私有静态void DrawGrid(字符串[]arr)
{
Console.WriteLine(“{0}{1}{2}}{124n}{3}{4}{5}{124n}{6}{7}{8}{124n]”,arr[0],arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8]);
}
private static void PlayerMove(string-answer,string[]arr)//为这个方法创建一个全新的类**
{
对于(inti=0;i),这与统一monobhavior
implementation.没有任何相似之处