【问题标题】:Having trouble changing int variable value (Tic Tac Toe)更改 int 变量值时遇到问题(井字游戏)
【发布时间】:2021-06-18 15:17:07
【问题描述】:

这是 playerTurn 方法。

public static void playerTurn(int player) 
{
    if (player == 1)
    {
        player = 2;
   }
    else if(player == 2) { player = 1; }
}

为什么调用 playerTurn 方法时播放器不会改变。我尝试更改播放器 1 的初始值并弄乱 if else 语句,但它没有用。我还是 C# 的新手,所以我可能在其他地方做错了,但我不确定还有什么可以尝试的。

static void Main(string[] args) //MAIN METHOD
{
    int player = 1;
    int inputNum;

    int turns = 0;

    Console.WriteLine("Player1: X");
    Console.WriteLine("Player2: O");
    Console.WriteLine("\n");
    SetField();

    openMessage(player);

    string input = Console.ReadLine();


    if (int.TryParse(input, out inputNum))
    {
        inputNum = int.Parse(input);
        turns++;
    }
    else 
    {
        Console.WriteLine("Please enter a valid input!");
    }

    switch (player) 
    {
        case 1:switch (inputNum) 
            { 
                case 1: playField[0, 0] = playerSign(player); break;
                case 2: playField[0, 1] = playerSign(player); break;
                case 3: playField[0, 2] = playerSign(player); break;
                case 4: playField[1, 0] = playerSign(player); break;
                case 5: playField[1, 1] = playerSign(player); break;
                case 6: playField[1, 2] = playerSign(player); break;
                case 7: playField[2, 0] = playerSign(player); break;
                case 8: playField[2, 1] = playerSign(player); break;
                case 9: playField[2, 2] = playerSign(player); break;
            }
            break;

        case 2:
            switch (inputNum)
            {
                case 1: playField[0, 0] = playerSign(player); break;
                case 2: playField[0, 1] = playerSign(player); break;
                case 3: playField[0, 2] = playerSign(player); break;
                case 4: playField[1, 0] = playerSign(player); break;
                case 5: playField[1, 1] = playerSign(player); break;
                case 6: playField[1, 2] = playerSign(player); break;
                case 7: playField[2, 0] = playerSign(player); break;
                case 8: playField[2, 1] = playerSign(player); break;
                case 9: playField[2, 2] = playerSign(player); break;
            }
            break;
    }

    SetField();

    Console.WriteLine(player);
    playerTurn(player);

    //player 1 turn end
    Console.WriteLine(player);
    openMessage(player);

    Console.ReadKey();
}

【问题讨论】:

  • 您将player 的副本传递给playerTurn,因此您正在修改副本。
  • 您应该阅读值类型引用类型之间的区别。忽略任何关于“哦,值类型在堆栈上”的内容,专注于两个类型分组之间的赋值有何不同

标签: c# methods tic-tac-toe


【解决方案1】:

参数是按值传递给这个方法的。因此它只获取该值的副本。返回新值。此外,您可以简化 playerTurn 方法:

public static int playerTurn(int player)
{
    return 3 - player; // Switches player from 1 to 2 or vice-versa.
}

3 - 2 = 13 - 1 = 2。 调用它

player = playerTurn(player);

您可以通过一些数学以更简单的方式获取索引:

playField[(inputNum - 1) / 3, (inputNum - 1) % 3] = playerSign(player);

/ 执行整数除法,将结果截断为下一个较小的整数。 % 产生这个除法的余数。

而且没有必要打开player,因为这两种情况是相同的。这允许您将 31 行代码替换为一行。


另请注意,您的游戏没有循环。因此,它会在第一个玩家移动后停止。

【讨论】:

  • 当您编写像return 3 - player; 这样的代码时,这是一个放置像//switches player from 1 to 2 or vice-versa 这样的评论的好地方。一年后,当您查看代码时,如果没有注释,它可能会让人头疼
  • @Flydog57:很好的建议!完成。
【解决方案2】:

这个方法:

public static void playerTurn(int player) 
    {
        if (player == 1)
        {
            player = 2;
        }
        else if(player == 2) { player = 1; }
    }

获取传入的任何内容的副本并修改副本。您需要做的是通过引用传递值:

public static void playerTurn(ref int player)
    ...

这样,传入 playerTurn 方法的任何变量都会被直接修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多