Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我能';似乎无法将数组传递给不同的方法,一个用于初始化,一个用于修改?_C# - Fatal编程技术网

C# 我能';似乎无法将数组传递给不同的方法,一个用于初始化,一个用于修改?

C# 我能';似乎无法将数组传递给不同的方法,一个用于初始化,一个用于修改?,c#,C#,我正在创建一个Tic-Tac-Toe游戏,我想有一个绘制网格的方法(DrawGrid)和一个玩家移动的方法(PlayerMove)。在PlayerMove中,我想修改数组,将其中一个框的值更改为“X”或“O”(稍后添加不同的播放器)。框中的值应更改为“X”或“O”,但不是 首先,我将来自PlayerMove的for循环放在Main方法中,但意识到这不起作用,所以我将其放在它自己的方法中,但是我将框中的值的数组保留在Main方法中,但当我尝试通过引用传入时,这不起作用(它不会更改的原因是因为它仍然

我正在创建一个Tic-Tac-Toe游戏,我想有一个绘制网格的方法(
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.没有任何相似之处