Minimax algorithm
現在、 forを実装しようとしていTic Tac Toe
ます。現在のバージョンでは、コンピューターが失敗する場合がいくつかありますが、その理由はよくわかりません。たとえば、私が (人間のプレイヤーとして) 左上隅の x で開始すると、コンピューターは左下隅の ao で反応します (もちろん、これは彼が負けることと同じです)。プログラム全体はMVC-Design
.
質問: Minimax アルゴリズムを正しく修正しましたか? または (そうでない場合) 「悪い」動きの原因は何ですか?
コードは次のとおりです: (正しいことをテストしたいくつかのメソッドのコードは省略しました)
package tictactoe;
import java.util.*;
public class AIMinimax {
Game game;
Cell[][] cell = new Cell[3][3];
int[] bestMove;
public AIMinimax(Game game) {
this.game=game;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cell[i][j]=game.getCell(i,j);
}
}
}
//Calculates the best move.
private int minimax(Cell player)
{
//Computer tries to maximize the bestscore, Player tries to minimize the bestscore.
int bestScore = 0;
if(player==Cell.CIRCLE) bestScore=-1;
if(player==Cell.CROSS) bestScore=+1;
int currentScore;
List<int[]> moves = identifyMoves();
if(moves.isEmpty() || hasWon(Cell.CROSS) || hasWon(Cell.CIRCLE))
{
//System.out.println(hasWon(Cell.CROSS));
//System.out.println(hasWon(Cell.CIRCLE));
//System.out.println(moves.isEmpty());
currentScore=evaluate();
bestScore=currentScore;
}
else
{
for (int[] move : moves) {
if (player==Cell.CIRCLE)
{
cell[move[0]][move[1]]=Cell.CIRCLE;
currentScore=minimax(Cell.CROSS);
if(currentScore>bestScore)
{
bestScore=currentScore;
bestMove = move;
}
}
else if(player==Cell.CROSS)
{
cell[move[0]][move[1]]=Cell.CROSS;
currentScore=minimax(Cell.CIRCLE);
if(currentScore<bestScore )
{
bestScore=currentScore;
bestMove=move;
}
}
cell[move[0]][move[1]]=Cell.EMPTY;
if((player==Cell.CIRCLE&&bestScore==1)||(player==Cell.CROSS&&bestScore==-1))
{
return bestScore;
}
}
}
System.out.println(bestScore);
return bestScore;
}
//Compute all possible next moves.
//@return List of int[2] arrays where int[0] indicates the column and int [1] indicates the row.
private List<int[]> identifyMoves(){}
//Evaluates the current board.
// -1 if the player wins, +1 if the computer wins, 0 for a draw
//No other values needed as the depth of the minimax algorithm is maximal.
private int evaluate() {
int result=0;
if(hasWon(Cell.CIRCLE)) result=1;
if(hasWon(Cell.CROSS)) result=-1;
return result;
}
//return true if the player has won and false if the other player won or there is
// a draw.
public boolean hasWon(Cell player){}
//Returns the next move for the computer as a int[2] where int[0] indicates the column and
//int[1] indicates the row.
public int[] nextMove(Cell player)
{
int minimaxResult= minimax(player);
return bestMove
}
}
package tictactoe;
public enum Cell {
EMPTY,
CROSS,
CIRCLE;
}
ゲーム クラスは、Cell[][] 配列内のフィールドを表し (AIMinimax と同じ方法)、AIMinimax のインスタンスを作成し、これに対して nextMove を呼び出して、コンピューターが行う次の Move を生成します。デフォルトでは、Human Player が常に開始されます。
前もって感謝します!