如何在 java 中打印出 Tic Tac Toe 的后继者?

How do I print out successors for Tic Tac Toe in java?

我最近一直在研究 Tic-Tac-Toe 人工智能,作为一个副项目。到目前为止,我已经成功地创建了一个随机生成计算机移动的游戏工作原型,使用户在大约 90% 的时间内获胜。然而,我试图通过极小极大算法让计算机无敌。在使用极小极大算法时,我需要为董事会寻找继任者,这就是我遇到的问题

这是我目前的职能:

public static ArrayList<board> successors(board aBoard) {

    board orig = aBoard;
    ArrayList<board> succ = new ArrayList<board>();

    for(int i = 0; i < 9; i++) {
        int row = i / 3;
        int col = i % 3;

        if(!orig.gameBoard[row][col].filled) {
            System.out.println(row);
            System.out.println(col);
            System.out.println("Row: " + row + " Column: " + col);
            board newBoard = orig;
            //newBoard.gameBoard[row][col].filled = true;
            //newBoard.gameBoard[row][col].index = 2;
            succ.add(newBoard);
        }


    }

    System.out.println("Number of successors: " + succ.size());


    int emptyIndex = 0;
    for(int i = 0; i < succ.size(); i++) {
        //find the empty index
    //  System.out.println(emptyIndex / 3);
    //  System.out.println(emptyIndex % 3);
    //  System.out.println(succ.get(i).gameBoard[emptyIndex / 3][emptyIndex % 3].index + "\n");
        while(succ.get(i).gameBoard[emptyIndex / 3][emptyIndex % 3].index != 0) {
            emptyIndex++;
            //System.out.println(emptyIndex + " is a good index");
        }

        System.out.println("Empty Index " + emptyIndex);
        System.out.println("i: " + i);

        succ.get(i).gameBoard[emptyIndex / 3][emptyIndex % 3].index = 2;
        succ.get(i).gameBoard[emptyIndex / 3][emptyIndex % 3].filled = true;




    }

    return succ;
}

它最初得到的后继者数量是正确的,只是输出是关闭的。例如,我最初的第一步如下:

https://imgur.com/a/T3lv0YZ

但结果应该包括计算机可以做出的所有可能的移动。相反,它输出:

https://imgur.com/a/EfEL5ll

我做错了什么?我已经尝试解决这个问题 2 天了。

 board newBoard = orig;

newBoard 将指向 orig,因此对 newBoard 所做的所有更改也将对 orig 进行,反之亦然。当 AI 在 newBoard 上移动时,也会移动到原始板上,因为它们都指向同一个对象。

您需要创建一个与原始板相同的新板对象,然后在将其添加到数组列表之前对其进行更改。复制棋盘状态时,注意不要复制 类 和数组等引用,而是使用新实例。