https://en.wikipedia.org/wiki/Connect_Four
Qualcuno ricorda il gioco a 2 giocatori connect 4? Per quelli che non lo facevano era una tavola 6x7 che stava in verticale su una superficie. L'obiettivo di connect 4 è quello di ben 4! La connessione viene conteggiata se è orizzontale, diagonale o verticale. Metti i tuoi pezzi sul tabellone inserendo un pezzo nella parte superiore di una colonna dove cade nella parte inferiore di quella colonna. Le nostre regole cambiano 3 cose in connect 4.
- Modifica n. 1 La vincita è definita come il giocatore con il maggior numero di punti. Ottieni punti collegando 4 come nelle regole - ne parleremo più avanti.
- Modifica n. 2 Hai 3 giocatori per round.
- Modifica n. 3 La dimensione della scheda è 9x9.
punteggio:
Il punteggio si basa su quanti ne ottieni di fila. Se hai un gruppo di 4 in una riga ottieni 1 punto. Se hai un gruppo 5 in una riga ottieni 2 punti, 6 in una riga 3 e così via.
Esempi:
Nota o
e x
vengono sostituiti con #
e ~
rispettivamente, per un migliore contrasto
Esempio di tabellone vuoto: (tutti gli esempi sono tabelloni di dimensioni standard per 2 giocatori)
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | | | | | | |
1 |_|_|_|_|_|_|_|
Se lasciamo cadere un pezzo nel coll d
, atterrerà sul posto 1d
.
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | | | | | | |
1 |_|_|_|#|_|_|_|
Se ora lasciamo cadere di nuovo un pezzo nel coll d
, questo atterrerà sul posto 2d
. Ecco alcuni esempi di 4 posizioni di fila:
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | |~| | | |
3 | | |~|#| | | |
2 | |~|#|~| |#| |
1 |~|#|~|#|_|#|_|
In questo caso x
ottiene 1 punto in diagonale ( 1a 2b 3c 4d
).
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | |#| | | |
3 | | | |#| | | |
2 | | | |#| | | |
1 |_|~|_|#|~|_|~|
In questo caso, o
ottiene 1 punto in verticale ( 1d 2d 3d 4d
).
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | |#|#|#|#| |
1 |_|_|~|~|~|~|~|
In questo caso o
ottiene 2 punti in orizzontale ( 1c 1d 1e 1f 1g
) e x
ottiene 1 punto in orizzontale ( 2c 2d 2e 2f
).
a b c d e f g
6 | | |#| | | | |
5 | | |#| | | | |
4 | | |#| | | | |
3 | | |#| | |~| |
2 |~| |#| | |#|~|
1 |~|_|#|~| |~|~|
Questa volta x
ottiene 3 punti per un 6 di fila ( 1c 2c 3c 4c 5c 6c
).
Input Output
Avrai accesso alla scheda tramite un array 2d. Ogni posizione verrà rappresentata con un int
ID giocatore rappresentativo. Avrai anche il tuo ID giocatore passato alla tua funzione. Fai la tua mossa restituendo in quale coll che vuoi far cadere il tuo pezzo. Ogni round 3 giocatori saranno scelti per giocare. Alla fine del gioco, tutti i giocatori avranno giocato un numero pari di partite.
Per il momento verranno eseguiti 100.000 round (nota che questo richiede molto tempo, potresti voler ridurlo per test di inversione rapida). Complessivamente il vincitore è il giocatore con il maggior numero di vittorie.
Il controller si trova qui: https://github.com/JJ-Atkinson/Connect-n/tree/master .
Scrivere un bot:
Per scrivere un bot è necessario estendere la Player
classe. Player
è estratto e ha un metodo per implementare, int makeMove(void)
. In makeMove
deciderai in quale coll che vuoi far cadere il tuo pezzo. Se hai scelto un coll non valido (es. Coll non esiste, coll è già pieno), il tuo turno verrà saltato . Nella Player
classe hai molti utili metodi di supporto. Segue un elenco di quelli più importanti:
boolean ensureValidMove(int coll)
: Restituisce vero se il coll è sul tabellone e il coll non è ancora pieno.int[] getBoardSize()
: Restituisce un array int in cui[0]
è il numero di colonne ed[1]
è il numero di righe.int[][] getBoard()
: Restituisce una copia della scheda. Si dovrebbe accedere in questo modo:[coll number][row number from bottom]
.- Per trovare il resto, guarda la
Player
lezione. EMPTY_CELL
: Il valore di una cella vuota
Dal momento che questo sarà multi-thread, ho anche incluso una random
funzione se ne hai bisogno.
Debug del tuo bot:
Ho incluso alcune cose nel controller per rendere più semplice il debug di un bot. Il primo è Runner#SHOW_STATISTICS
. Se questo è abilitato, vedrai una stampa dei gruppi di giocatori giocati, incluso un conteggio delle vincite del bot. Esempio:
OnePlayBot, PackingBot, BuggyBot,
OnePlayBot -> 6
PackingBot -> 5
BuggyBot -> 3
Draw -> 1
Puoi anche fare un gioco personalizzato con la connectn.game.CustomGame
classe, puoi vedere i punteggi e il vincitore di ogni round. Puoi anche aggiungerti al mix con UserBot
.
Aggiungi il tuo bot:
Per aggiungere il tuo bot all'allineamento, vai al PlayerFactory
blocco statico e aggiungi la seguente riga:
playerCreator.put(MyBot.class, MyBot::new);
Altre cose da notare:
- Le simulazioni sono multi-thread. Se vuoi disattivarlo, vai a
Runner#runGames()
e commenta questa riga (.parallel()
). - Per modificare il numero di giochi, impostare
Runner#MINIMUM_NUMBER_OF_GAMES
a proprio piacimento.
Aggiunto in seguito:
- La comunicazione tra i robot non è consentita.
Correlati: Gioca a Connect 4!
================================
Quadro di valutazione: (100000 partite)
MaxGayne -> 22662
RowBot -> 17884
OnePlayBot -> 10354
JealousBot -> 10140
Progressive -> 7965
Draw -> 7553
StraightForwardBot -> 7542
RandomBot -> 6700
PackingBot -> 5317
BasicBlockBot -> 1282
BuggyBot -> 1114
FairDiceRoll -> 853
Steve -> 634
================================
Player
classe per vedere tutti i metodi disponibili.
ensureValidMove
(a meno che la tua strategia non passi naturalmente in questo turno).