Java Connect x game Minimax 算法

问题描述

我正在尝试制作一个连接 4 游戏,其中用户可以选择棋盘的尺寸以及必须连接多少个棋子才能获胜。 (所以我们可以有一个 10 x 12 的板,我们必须在其中连接 6 块,例如)。我正在为我的代码使用 MVC 模板,现在正在尝试制作一个使用 minimax 算法的 AI(在单独的 ai 类中)。

现在我的极小极大算法有时会删除我的动作或用自己的动作替换它们。 我认为这是因为我没有复制棋盘,我让 AI 放置并得分,然后我将其删除。但我认为这不适用于递归。

在我的代码中,我使用了以下方法/参数:

-"ourBoard" -> 游戏板(我从模型类中获取

-“连接”-> 赢得比赛所需的连续棋子数量(通常为 4 个)

-"counter" -> 表示轮到谁了。 1 为玩家 2 为 ai

-“玩家”-> 整数 1

-"ai" -> 整数 2

-"depth" -> 极大极小算法的深度(它看到了多少移动)

-"maximizingPlayer" -> 轮到我们的玩家是希望最大化还是最小化

-"model" -> 我需要使用它作为参数来访问模型类中的方法

-"nrCols" -> 棋盘的列数

-"nrRows" -> 棋盘的行数

-"validLocations" -> 一个包含所有列的数组,我们可以在其中放置一块(即那些没有装满的列)

-"isTerminal" -> 游戏是否结束

-"winner" -> 检查玩家是否赢了

我的代码如下:

public int[] minimax(int[][] ourBoard,int connect,int counter,int depth,boolean maximizingPlayer,Model model,int nrCols,int nrRows) {

        int[] validLocations = validLocations(ourBoard,nrCols);

        boolean isTerminal = isTerminalNode(ourBoard,connect,counter,model);
        //int[] result = new int[2];

        if (depth <= 0 || isTerminal) {

            if (isTerminal) {
               if (model.winner(connect,ai,ourBoard)) {
                    return new int[] {-1,(int) 100000000000000000L};
                }
                else if (model.winner(connect,player,ourBoard)) {
                    return new int[]{-1,(int) -100000000000000000L};
                }
                else {
                    return new int[] {-1,0};
                }
            }
            else {
                return new int[] {-1,score(ai,ourBoard,nrRows,nrCols)};
            }
        }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        if (maximizingPlayer) {
            Random rnd = new Random();
            int rand = rnd.nextInt(validLocations.length);
            int column = validLocations[rand];

            int value = (int) -1000000000000000000L;
            for (int col = 0 ; col < validLocations.length ; coL++) {
                int row = aiGetRow(validLocations[col],nrRows);
                ourBoard[row][col] = ai;
                int newscore = minimax(ourBoard,depth-1,false,model,nrCols,nrRows)[1];
                ourBoard[row][col] = 0;
                if (newscore > value) {
                    value = newscore;
                    column = col;
                }
            }
            return new int[]{column,value};
        }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        else { // not maximising player
            Random rnd = new Random();
            int rand = rnd.nextInt(validLocations.length);
            int column = validLocations[rand];

            int value = (int) 1000000000000000000L;
            for (int col = 0 ; col < validLocations.length ; coL++) {
                int row = aiGetRow(validLocations[col],nrRows);
                ourBoard[row][col] = player;
                int newscore = minimax(ourBoard,true,nrRows)[1];
                ourBoard[row][col] = 0;
                if (newscore < value) {
                    value = newscore;
                    column = col;
                }
            }
            return new int[] {column,value};
        }

    }

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)