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:

  1. Czy zamysł jest dobry i da się ten algorytm w taki sposób przenieść do tej implementacji?
  2. W jaki sposób zrobić wykonania i cofnięcia ruchu, by było dobrze? :)
  3. Jak dobrać tu wartości mmx do algorytmu?