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