【问题标题】:How to send copy of array in c# [duplicate]如何在c#中发送数组的副本[重复]
【发布时间】:2018-06-09 15:23:32
【问题描述】:
  • 所以,我正在尝试使用 AI 制作简单的控制台井字游戏。
  • 当前板子状态存储在多维数组中。
  • 要检查 AI 的最佳动作是什么,我使用递归。
  • 函数“CheckMove”改变棋盘位置,然后调用自身查看它的位置。
  • 但问题是,如果我在被调用函数中更改板状态,它也会在调用者内部发生变化。

如何避免这种情况? 简化代码:

static void Main()
    {
        int[] board = { 1 };
        CheckMove(board);
        //board = 2
    }

    static void CheckMove(int[] board)
    {
        board[0] = 2;
    }

完整代码(WIP):

enum Sym
{
    E, X, O
}

class Program
{
    static void Main(string[] args)
    {
        Sym[,] board = new Sym[3,3];
        int x, y;
        while (End(board) == 2)
        {
            Display(board);

            Console.WriteLine("Make your move - column: ");
            x = Convert.ToInt32(Console.ReadLine())-1;
            Console.WriteLine("Make your move - row: ");
            y = Convert.ToInt32(Console.ReadLine())-1;

            board[y, x] = Sym.X;

            int[,] chances = new int[3, 3];

            for (int i = 0; i < 3; i++)
                for (int j = 0; j < 3; j++)
                {
                    chances[i, j] = CheckMove(board, i, j, true);
                }
        }
        Display(board);
        Console.WriteLine("GG");
        Console.WriteLine("____________________________________________________________");

        Console.ReadLine();
    }

    static void Display(Sym[,] board) //Displays whole board
    {
        for (int i = 0; i < 3; i++)
        {
            Console.WriteLine($"{board[i,0]} {board[i,1]} {board[i,2]}");
        }
    }

    static int End(Sym[,] board) //Chcecks if the game shall end (-1 player won) (0 tie) (1 cpu won) (2 game in progress)
    {
        bool Full = true;

        for (int i = 0; i < 3; i++)
        { //This part is currently broken
            if (board[i, 0] == Sym.E || board[i, 1] == Sym.E || board[i, 2] == Sym.E) Full = false;
            if (board[i, 0] == board[i, 1] && board[i, 1] == board[i, 2] && board[i, 0] == Sym.X) return -1;
            if (board[0, i] == board[1, i] && board[1, i] == board[2, i] && board[0, i] == Sym.X) return -1;
            if (board[i, 0] == board[i, 1] && board[i, 1] == board[i, 2] && board[i, 0] == Sym.O) return 1;
            if (board[0, i] == board[1, i] && board[1, i] == board[2, i] && board[0, i] == Sym.O) return 1;
        }
        if (board[0, 0] == board[1, 1] && board[1, 1] == board[2, 2] && board[0, 0] == Sym.X) return -1;
        if (board[0, 0] == board[1, 1] && board[1, 1] == board[2, 2] && board[0, 0] == Sym.O) return 1;
        if (board[2, 0] == board[1, 1] && board[1, 1] == board[0, 2] && board[2, 0] == Sym.X) return -1;
        if (board[2, 0] == board[1, 1] && board[1, 1] == board[0, 2] && board[2, 0] == Sym.O) return 1;

        if (Full == true) return 0;
        return 2;
    }

    static int CheckMove(Sym[,] board, int a, int b, bool cpuTurn) //Check how good subjected move is
    {
        if (board[a, b] == Sym.E)
            if (cpuTurn == true) board[a, b] = Sym.O;
            else board[a, b] = Sym.X;
        else return 0;

        if (End(board) != 2) return End(board);

        int Value = 0;

        for (int m = 0; m < 3; m++)
            for(int n = 0; n < 3; n++)
            {
                Value += CheckMove(board, m, n, !cpuTurn);
            }
        return Value;
    }
}

【问题讨论】:

  • 只是将你的数组复制到一个新数组中?

标签: c# arrays


【解决方案1】:

据我所知,

中的 2D 数组 Sym[,] 有问题
static int CheckMove(Sym[,] board, int a, int b, bool cpuTurn)

方法;因为 board2D 数组,所以像 board.ToArray() 这样的典型解决方案不起作用(它们甚至不编译)。试试Clone() board 实例:

// Let's rename board into value...
static int CheckMove(Sym[,] value, int a, int b, bool cpuTurn) {
  // ... in order to preserve all the other code:
  // we are now working with the copy of the passed board
  Sym[,] board = value.Clone() as Sym[,];

  // Your code from CheckMove here
  ... 
} 

由于Symenum(即一个value 类型),shallow 复制就足够了

【讨论】:

    猜你喜欢
    • 2022-08-16
    • 2012-09-28
    • 2013-05-17
    • 2017-01-20
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多