首页 > 解决方案 > 如何在 Java 中打印井字游戏的继任者?

问题描述

我最近一直在研究井字游戏人工智能作为一个副项目。到目前为止,我已经成功地创建了一个随机生成计算机动作的游戏原型,使用户赢得了大约 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 天了。

标签: javaartificial-intelligencegame-theory

解决方案


 board newBoard = orig;

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

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


推荐阅读