Dcumentation

- added docs for TrisAi
- fixed errors in docs
This commit is contained in:
2023-12-15 16:28:01 +01:00
parent a310a013c4
commit 7aeb7b0c56
3 changed files with 55 additions and 7 deletions

View File

@@ -11,8 +11,8 @@ import java.util.function.Function;
/**
* Una classe che risolve problemi utilizzando l'algoritmo A*.
* @author Berack96
* @param State la classe degli stati in cui si trova il problema da risolvere
* @param Action la classe di azioni che si possono compiere da uno stato e l'altro
* @param State - la classe degli stati in cui si trova il problema da risolvere
* @param Action - la classe di azioni che si possono compiere da uno stato e l'altro
*/
public class AStar<State, Action> {

View File

@@ -8,9 +8,9 @@ import java.util.function.Function;
* Algoritmo MiniMax per i giochi a due concorrenti.
*
* @author Berack96
* @param <State> la classe degli stati in cui si trova il problema da risolvere
* @param <Action> la classe di azioni che si possono compiere da uno stato e l'altro
* @param <Player> la classe che indica il giocatore, essa serve da dare in input alla funzione di gain
* @param State - la classe degli stati in cui si trova il problema da risolvere
* @param Action - la classe di azioni che si possono compiere da uno stato e l'altro
* @param Player - la classe che indica il giocatore, essa serve da dare in input alla funzione di gain
*/
public class MiniMax<State, Action, Player> {
@@ -45,7 +45,7 @@ public class MiniMax<State, Action, Player> {
*
* @param state lo stato corrente
* @param player il giocatore che deve fare la mossa
* @param lookahead quante mosse guardare nel futuro
* @param lookahead quante mosse consecutive guardare nel futuro
* @return la migliore mossa localmente
*/
public Action next(State state, int lookahead, Player player) {

View File

@@ -7,13 +7,27 @@ import java.util.function.BiFunction;
import java.util.function.Function;
/**
* Classe che viene usata per giocare a Tris.
* Questa classe permette dato una classe Tris di giocare contro una AI.
*
* @author Berack96
*/
public class TrisAi {
/**
* Funzione che permette di far vedere quali azioni sono disponibili dato uno stato della partita.
* Essa richiama la già esistente funzione dalla classe Tris
*/
public static final Function<Tris, Tris.Coordinate[]> ACTIONS = tris -> tris.availablePlays();
/**
* Funzione che permette l'avanzamento della partita. Siccome e' solo una funzione temporanea,
* ovvero che la partita vera e propria non deve andara avanti, viene restituita una nuova istanza del gioco.
*/
public static final BiFunction<Tris, Tris.Coordinate, Tris> TRANSITION = (tris, coord) -> new Tris(tris, coord);
/**
* Funzione euristica che permette di controllare, dato uno stato, quanto sia favorevole o meno al giocatore
* passato in input.
*/
public static final BiFunction<Tris, Tris.Symbol, Integer> GAIN = (tris, player) -> {
var count = 0;
@@ -36,6 +50,17 @@ public class TrisAi {
return count;
};
/**
* Questo metodo restituisce un valore in base ai simboli passati, con valore positivo se
* sono uguali al primo parametro in input, altrimenti negativo:
* - Se ho 3 simboli uguali -> 100
* - Se ho 2 simboli uguali e uno vuoto -> 10
* - Se ho un solo simbolo e 2 vuoti -> 1
*
* @param symbol il simbolo da testare
* @param values i successivi simboli a cui assegnare un valore
* @return un punteggio in base alle combinazioni dei simboli e al fatto che siano uguali al primo parametro
*/
static int value(Tris.Symbol symbol, Tris.Symbol...values) {
var totE = 0;
var totO = 0;
@@ -64,15 +89,38 @@ public class TrisAi {
private Tris tris;
private MiniMax<Tris, Tris.Coordinate, Tris.Symbol> minimax;
/**
* Crea una istanza dell'AI collegata al gioco passato in input.
* Questa AI non giocherà in automatico ma solo quando lo si
* ritiene opportuno attraverso il metodo {@link #playNext()}.
*
* @param tris il gioco a cui aggiungere una AI
*/
public TrisAi(Tris tris) {
this.minimax = new MiniMax<>(TRANSITION, ACTIONS, GAIN);
this.tris = Objects.requireNonNull(tris);
this.minimax = new MiniMax<>(TRANSITION, ACTIONS, GAIN);
}
/**
* L'AI farà una mossa sul gioco collegato ad essa.
* Equivale chiamare {@link #playNext(int)} con input 2
*/
public void playNext() {
this.playNext(2);
}
/**
* L'AI farà una mossa sul gioco collegato ad essa.
* Questo metodo permette di passare in input il lookahead
* in modo da limitare lo spazio delle possibili mosse che
* l'AI andrà ad osservare per scegliere la sua azione.
* Un valore basso e la mossa sarà "peggiore", un valore alto e
* per trovare una mossa ci impiegherà più tempo.
* NOTA: Il valore del lookahead è un valore esponenziale, quindi
* se si mette 5 rispetto a 4, ci impiegherà un tempo almeno doppio.
*
* @param lookahead quante mosse consecutive può osservare
*/
public void playNext(int lookahead) {
var myself = tris.getNextPlaySymbol();
var action = minimax.next(this.tris, lookahead, myself);