Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 帮助我实现MinMax_Java_Algorithm_Implementation_Minmax - Fatal编程技术网

Java 帮助我实现MinMax

Java 帮助我实现MinMax,java,algorithm,implementation,minmax,Java,Algorithm,Implementation,Minmax,我一直在尝试为一个简单的游戏实现一个minMax算法(稍后将尝试alphabeta剪枝)……我看过很多伪代码和教程,但我就是无法让它工作 一点帮助将不胜感激:) 以下是相关的类…(为了清晰起见,删除了实现) 类板{//存储板状态,不可变 棋盘游戏移动(移动m);//在播放“移动m”后生成新棋盘 List nextMoves(Move m);//生成所有可能的移动,需要上一个移动来决定下一个移动的有效性 布尔isTerminal();//电路板处于终端状态? } 职业移动{//存储所玩的位置和从该

我一直在尝试为一个简单的游戏实现一个minMax算法(稍后将尝试alphabeta剪枝)……我看过很多伪代码和教程,但我就是无法让它工作

一点帮助将不胜感激:)

以下是相关的类…(为了清晰起见,删除了实现)

类板{//存储板状态,不可变
棋盘游戏移动(移动m);//在播放“移动m”后生成新棋盘
List nextMoves(Move m);//生成所有可能的移动,需要上一个移动来决定下一个移动的有效性
布尔isTerminal();//电路板处于终端状态?
}
职业移动{//存储所玩的位置和从该移动中获得的分数
}
这是我的最小-最大实现…有人能指出我做错了什么吗?多谢各位

private Move bestMove = null; // field variable

private int maxMove(Board board, Move prevMove, int myScore, int oppnScore) {
    out("maxMove " + board );
    if(board.isTerminal()) {
        return myScore - oppnScore;
    }
    int mx = Integer.MIN_VALUE;
    for(Move nxtMove: board.nextMoves(prevMove)) {
        int k = minMove(board.playMove(nxtMove),
                        nxtMove,
                        myScore + nxtMove.score,
                        oppnScore);
        if(k > mx) {
            mx = k;
            bestMove = nxtMove;
        }
    }
    return mx;
}

private int minMove(Board board, Move prevMove, int myScore, int oppnScore) {
    if(board.isTerminal()) {
        return myScore - oppnScore;
    }
    out("minMove " + board );
    int mn = Integer.MAX_VALUE;
    for(Move nxtMove: board.nextMoves(prevMove)) {
        int k = maxMove(board.playMove(nxtMove),
                        nxtMove,
                        myScore,
                        oppnScore + nxtMove.score);
        if(k < mn) {
            mn = k;
            bestMove = nxtMove;
        }
    }
    return mn;
}
private Move bestMove=null;//字段变量
私有int maxMove(单板、移动前移动、int myScore、int oppnScore){
输出(“maxMove”+板);
if(board.isTerminal()){
返回myScore-oppncore;
}
int mx=整数.MIN_值;
对于(移动nxtMove:board.nextMoves(移动前)){
int k=minMove(board.playMove(nxtMove)),
nxtMove,
myScore+nxtMove.score,
oppnScore);
如果(k>mx){
mx=k;
bestMove=nxtMove;
}
}
返回mx;
}
私有int minMove(单板、移动前移动、int myScore、int oppnScore){
if(board.isTerminal()){
返回myScore-oppncore;
}
输出(“minMove”+板);
int mn=整数的最大值;
对于(移动nxtMove:board.nextMoves(移动前)){
int k=maxMove(board.playMove(nxtMove)),
nxtMove,
我的核心,
oppnScore+nxtMove.score);
if(k

编辑:游戏简介如下,你面前有一定数量的不同面值的硬币。你和另一名玩家轮流从另一侧(左侧或右侧)取出一枚硬币。硬币的面额表示你在那一步中得到的分数。某些硬币有特殊的含义,比如选择X意味着你将跳过一个回合,或者Y意味着你将获得一个回合。你的目标是获得比对手更多的分数。

我只看到一个错误:你不记得在给定的棋盘状态下选择哪个回合,所以你计算了很多次,算法变得很慢。或者速度不是你的问题?

我想我不太清楚游戏规则,但看起来你的最终状态不太对劲

您返回的是球员之间的分数差异。这意味着一个玩家想要最大化这个值(与对手的最大差异),而另一个玩家想要最小化这个值(他试图获得尽可能接近对手的分数)。这真的不像任何真正的游戏会有什么作为它的目标

我想你想要的是得分最高的球员获胜。因此,您可以检查myScore>oppScore,并相应地返回1,0和-1。这意味着第一个玩家想要最大化回报(即,他试图使回报为1-他获胜),而对手则试图最小化回报(即,如果回报为-1,他获胜)。如果赢不了,他们宁愿打0(平局)


另外,为什么需要
prevMove
来生成下一步?
棋盘
是否有关于游戏当前状态的所有信息(即剩余硬币)

也许告诉我们一些游戏规则会有帮助。游戏的目的是什么?尽可能多地得分?比对手多得分?@MAK,比对手多得分。速度不是问题。这是不正确的,它选择了错误的(如非最佳)移动(有时是无效的移动)。我需要
prevMove
,因为如果上一个移动移除了
X
硬币,这意味着我需要选择2个硬币,而不仅仅是一个。否则我就选一枚硬币。@st0le:我明白了。我本来会把它作为一个标志放在
板上的
,但我想保持
prevMove
也行。@MAK,你的观察似乎是正确的,我会试试并报告。@MAK,不,问题似乎出在
bestMove
的赋值中,它选择了比当前状态提前3-4步的移动。@st0le:您是否已将终端检查更改为返回-1,0,+1?
private Move bestMove = null; // field variable

private int maxMove(Board board, Move prevMove, int myScore, int oppnScore) {
    out("maxMove " + board );
    if(board.isTerminal()) {
        return myScore - oppnScore;
    }
    int mx = Integer.MIN_VALUE;
    for(Move nxtMove: board.nextMoves(prevMove)) {
        int k = minMove(board.playMove(nxtMove),
                        nxtMove,
                        myScore + nxtMove.score,
                        oppnScore);
        if(k > mx) {
            mx = k;
            bestMove = nxtMove;
        }
    }
    return mx;
}

private int minMove(Board board, Move prevMove, int myScore, int oppnScore) {
    if(board.isTerminal()) {
        return myScore - oppnScore;
    }
    out("minMove " + board );
    int mn = Integer.MAX_VALUE;
    for(Move nxtMove: board.nextMoves(prevMove)) {
        int k = maxMove(board.playMove(nxtMove),
                        nxtMove,
                        myScore,
                        oppnScore + nxtMove.score);
        if(k < mn) {
            mn = k;
            bestMove = nxtMove;
        }
    }
    return mn;
}