Witam serdecznie!
Chciałem przekształcić algorytm min max wykorzystany tutaj : http://edu.i-lo.tarnow.pl/inf/utils/002_roz/p012.php
do gry w Cleave ( javadoc : http://www.cs.put.poznan.pl/jpotoniec/gry/).
Potrzebne rzeczy:
Board Game - Klasy wspólne dla wszystkich gier i graczy
Board Game Engine - Silnik rozgrywki, komunikujący się z kolejnymi graczami i dbający o kontrolę czasu
Cleave - Implementacja zasad gry Cleave
Cleave Limited Player - Gracz dla Cleave implementujący własny generator ruchów (dość ograniczony w stosunku do pełnego)
Ogólnie rzecz biorąc - cienki jestem i robię trochę na ślepo ;) Na razie zrobiłem to tak:
public class NaivePlayer extends Player {
int m = 0;
int mmx = -10;
public static void main(String args[]) {
// pusty main, dla exportu do jara
}
//generator randomow
//private Random random=new Random(0xdeadbeef);
//zwracanie nazwy
@Override
public String getName() {
return "Klopsik";
}
// Do algorytmu wchodzimy z planszą, na której ustawione jest pole
// bieżącego gracza. Parametr color przekazuje kolor gracza, a
// parametr mmx przekazuje jego wynik w przypadku wygranej
public int minMax(Board b, Color color) {
// nie jestem pewien czy nie trzeba jakos sklonowac planszy do tych rozpatrywan
int mmx = 0;
int m = 0;
//Trzeba byc na razie PLAYER1, tylko pod niego bedzie trybilo
color = (color == Color.PLAYER1) ? Color.PLAYER2 : Color.PLAYER1;
mmx = (color == Color.PLAYER2) ? 10 : -10; // w jaki sposob dobrac wartosc? wielkosc planszy?
List<Move> moves = b.getMovesFor(getColor());
for (int i = 0; i < moves.size(); i++) {
//ustawienie piona w miejscu i, chyba trzeba wywołać nextMove, ale niwim
m = minMax(b, Color.PLAYER2);
// cofniecie ruchu, undoMove(move) ?
if (((color == Color.PLAYER2) && (m<mmx)) || ((color == Color.PLAYER1) && (m>mmx)))
mmx = m;
}
return mmx;
}
//wykonanie ruchu
@Override
public Move nextMove(Board b) {
int ruch = 0;
List<Move> moves = b.getMovesFor(getColor());
for (int i = 0; i < moves.size(); i++) {
//wykonanie ruchu
m = minMax(b, getColor());
//cofniecie ruchu
if (m > mmx) {
mmx = m;
ruch = i;
}
}
return moves.get(ruch);
//wykonanie losowego ruchu
//return moves.get(random.nextInt(moves.size()));
}
}
Nawet nie testowałem, bo jeszcze nie ma prawa działać.
Pytania:
- Czy zamysł jest dobry i da się ten algorytm w taki sposób przenieść do tej implementacji?
- W jaki sposób zrobić wykonania i cofnięcia ruchu, by było dobrze? :)
- Jak dobrać tu wartości mmx do algorytmu?