MinMax Алгоритм для Tic Tac Toe
Я пытаюсь сделать MinMax для Tic Tac Toe (Всегда компьютер победить), но я не могу заставить его работать. Все преемники просто возвращают 0 (ничья) как счет, и поэтому компьютер всегда выбирает движение в естественном направлении матрицы.
PS: Матрица (класс) - это доска, на которой они играют, которая содержит массив из 9 позиций.
| X | O | X | O |... | как это.
Глобальная переменная, которая обрабатывает плату Tic Tac Toe, называется Main и является экземпляром Matrix.
public void minMax(Matrix p) {
Matrix bestvalue = maxValue(p);
print(bestvalue);
System.out.println(bestvalue.getScore());
main = searchSucessorWithScore(p, bestvalue.getScore());
}
public Matrix maxValue(Matrix p) {
if(endState(p)) { p.setScore(utility(p)); return p; } //always sets score to 0 but the method utility is correct...
Matrix bestmove = new Matrix();
bestmove.setScore(Integer.MIN_VALUE);
LinkedList<Matrix> list = addSucessors(p, plays.PLAY_X);
for(Matrix s : list) {
Matrix move = minValue(s);
if(move.getScore() > bestmove.getScore()) {
bestmove = move;
}
}
return bestmove;
}
public Matrix minValue(Matrix p) {
if(endState(p)) { p.setScore(utility(p)); return p;}
Matrix bestmove = new Matrix();
bestmove.setScore(Integer.MAX_VALUE);
LinkedList<Matrix> list = addSucessors(p, plays.PLAY_O);
for(Matrix s : list) {
Matrix move = maxValue(s);
if(move.getScore() < bestmove.getScore()) { // <
bestmove = move;
}
}
return bestmove;
}
Дополнительные методы:
public LinkedList<Matrix> addSucessors(Matrix k, plays l) {
LinkedList<Matrix> list = new LinkedList<Matrix>();
for(int i=0; i<9; i++) {
if(k.getRow(i).equals(plays.BLANK)) {
Matrix p = k.clone();
p.setRow(i, l);
list.add(p);
}
}
return list;
}
/* RETURNS 0 FOR DRAW, 1 FOR PC WIN, -1 FOR USER WIN */
public int utility(Matrix p) {
for(int i=0; i<9; i=i+3) {
if(main.getRow(i).equals(plays.PLAY_X) && main.getRow(i+1).equals(plays.PLAY_X) && main.getRow(i+2).equals(plays.PLAY_X)) return 1;
if(main.getRow(i).equals(plays.PLAY_O) && main.getRow(i+1).equals(plays.PLAY_O) && main.getRow(i+2).equals(plays.PLAY_O)) return -1;
}
for(int i=0; i<3; i++) {
if(main.getRow(i).equals(plays.PLAY_X) && main.getRow(i+3).equals(plays.PLAY_X) && main.getRow(i+6).equals(plays.PLAY_X)) return 1;
if(main.getRow(i).equals(plays.PLAY_O) && main.getRow(i+3).equals(plays.PLAY_O) && main.getRow(i+6).equals(plays.PLAY_O)) return -1;
}
if(main.getRow(0).equals(plays.PLAY_X) && main.getRow(4).equals(plays.PLAY_X) && main.getRow(8).equals(plays.PLAY_X)) return 1;
if(main.getRow(2).equals(plays.PLAY_X) && main.getRow(4).equals(plays.PLAY_X) && main.getRow(6).equals(plays.PLAY_X)) return 1;
if(main.getRow(0).equals(plays.PLAY_O) && main.getRow(4).equals(plays.PLAY_O) && main.getRow(8).equals(plays.PLAY_O)) return -1;
if(main.getRow(2).equals(plays.PLAY_O) && main.getRow(4).equals(plays.PLAY_O) && main.getRow(6).equals(plays.PLAY_O)) return -1;
return 0;
}
public Matrix searchSucessorWithScore(Matrix p, Integer v) {
for(Matrix s : addSucessors(p, plays.PLAY_X) {
if(s.getScore() == v) return s;
}
return null;
}
Утилита метода правильная, но внутри рекурсии возвращается только 0 даже для матрицы, где есть победитель.
Помогите:D
1 ответ
Недостаточно кода для правильной оценки, но это почти никогда не работает.
Integer v
s.getScore() == v
Вы должны использовать Integer.intValue()