Gioca una partita a Meta tic-tac-toe!
Questo è un torneo King of the Hill di Meta tic-tac-toe. Le regole di Meta tic-tac-toe sono le seguenti:
Si applicano tutte le regole regolari del tic-tac-toe.
Ci sono nove schede organizzate per creare una scheda madre. Così:
0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8
la scheda 0 si riferisce alla scheda in alto a sinistra, la scheda 1 si riferisce alla scheda in alto al centro ... in questo modo
0|1|2 ----- 3|4|5 ----- 6|7|8
Se dico tavola 3, tessera 4, significa che la tessera centrale della tavola in mezzo a sinistra.
Hai il permesso di muoverti solo in una delle schede più piccole.
Se vinci una delle carte più piccole, l' intera tavola conta come tessera.
Se una delle schede viene riempita prima che uno dei due bot lo abbia vinto, conta come tessera di nessuno.
Chi vince la scheda madre vince!
Tuttavia, c'è una svolta importante. Diciamo che vado nel board 7, riquadro 2. Ciò significa che nel tuo turno, puoi solo entrare nel board 2. Quindi diciamo che vai nel board 2, riquadro 5. Ora nel mio turno, posso solo andare nel board 5. Diciamo che la scheda 1 è piena. (Non ci sono più posti rimanenti, o uno di noi ha già vinto la tavola 1) Ora se vado nella tavola 5, tessera 1, puoi andare in una qualsiasi delle carte che desideri.
Queste regole possono essere considerate come:
- Devi giocare nel tabellone corrispondente alla posizione giocata dal giocatore precedente.
- Se X gioca nel tabellone 2, tessera 5; O deve giocare nel tabellone 5
- Se il tabellone bersaglio è pieno (un pareggio) o ha già un vincitore, la mossa successiva non è vincolata.
- Una tavola con un vincitore non può essere giocata, anche con una mossa libera.
Se questo è un po 'confuso, puoi provarlo online qui. (assicurati di passare da "vittorie prima tessera" a "3 tessere di fila")
Ora ecco le regole della sfida.
Devi scrivere un bot per giocare a questo gioco.
Bot 1 è Xs, e deve iniziare per primo. Verrà chiamato con questi argomenti della riga di comando (senza gli elementi tra parentesi):
X (whose turn) --------- (board 0) --------- (board 1) --------- (board 2) --------- (board 3) --------- (board 4) --------- (board 5) --------- (board 6) --------- (board 7) --------- (board 8) --------- (master board) xx (last move)
Il primo personaggio rappresenta chi è il bot. In questo caso, il bot 1 gioca come X. Le successive 9 righe si riferiscono alle 9 schede. L'undicesima riga si riferisce alla scheda madre. La "xx" è l'ultima mossa. Ora, il bot1 deve stampare due numeri tra 0 e 8. Il numero 1 è la scheda in cui si sta muovendo il robot e il numero 2 è la tessera in detta scheda. Il controller terrà traccia di questa mossa. Diciamo che il bot 1 stampa 38. Ora la scheda avrà questo aspetto:
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | |
e bot2 verrà chiamato con questi argomenti:
O --------- --------- --------- --------X --------- --------- --------- --------- --------- --------- 38
Ora il bot 2 deve muoversi nella scheda 8 (perché il bot1 ha inserito una x nella tessera 3). Diciamo che bot2 stampa 84. Ora la scheda è simile a questa.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || |O| ----- || ----- || ----- | | || | | || | |
ora bot1 verrà chiamato con questi argomenti:
X --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- 84
Ora bot1 deve spostarsi nella scheda 4. Tuttavia, bot1 è un piccolo bot cattivo e decide di spostarsi nella scheda 3. Stampa "30". La scheda non cambia affatto. Il robot principale ne tiene traccia. Ora bot2 verrà chiamato con questi argomenti:
O --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- xx
Ora il bot 2 può andare dove vuole (tranne 38 e 84, ovviamente). Questo continua fino a quando qualcuno vince 3 delle master board di fila. Quindi, c'è un secondo matchup in cui bot2 è X e inizia per primo.
Questo si ripete fino a quando ogni singolo bot ha suonato ogni altro bot.
punteggio
Il punteggio funziona in questo modo:
Il vincitore di ogni partita ottiene 100 + number of open spots
punti. In questo modo, è più prezioso se il tuo bot vince rapidamente. Ogni volta che il tuo bot fa una mossa non valida, perde 1 punto. Se dopo 250 round, nessuno dei due bot ha vinto, ogni bot perde 10 punti e si passa al round successivo.
Tutto verrà inserito in una directory che contiene
Il bot del controller. Questo è un programma C ++ che ho scritto. Puoi vedere il codice sorgente del bot del controller qui. Per favore fatemi sapere se vedete qualcosa che non va bene con il controller.
Un file di testo chiamato
instructions.txt
Questo file avrà un aspetto simile al seguente:[Total number of bots that are competing] [bot1Name] [bot1 command to run] [bot2Name] [bot2 command to run] ...
Una cartella per ogni bot. Questa cartella conterrà il tuo programma (sia esso uno script o un file binario) e UN file di testo chiamato
data.txt
che il tuo bot può leggere e scrivere come vuole.
Specifiche tecniche e chiarimenti sulle regole
Qualsiasi bot che tenti di leggere / scrivere qualcosa da qualsiasi parte non all'interno della sua cartella verrà espulso dal gioco.
Il tuo programma deve essere in grado di funzionare su un macbook che esegue Yosemite. Le lingue attualmente supportate sono python (2.7.9 e 3.4.2), C / C ++, goal-C, perl, ruby, bash, PHP, Java, C #, javascript e Haskell. Ce ne sono molti di più, ma questi sono solo quelli a cui riesco a pensare in questo momento. Aggiungerò più col passare del tempo. Se vuoi competere in una lingua specifica, inviami un messaggio o un commento e, se possibile, lo aggiungerò all'elenco.
Se una tavola viene vinta, ma c'è ancora spazio, non puoi ancora muoverti in uno dei punti aperti.
Nota che la directory di lavoro del tuo invio sarà la directory che contiene il controller e tutti gli altri bot, NON la directory che contiene il tuo bot.
Si prega di inviare insieme al codice bot del controller il comando corretto per compilare (se applicabile) ed eseguire il bot. Gran parte di questo sarà fatto dal terminale OS X, che è abbastanza simile a un terminale Linux.
I robot devono completarsi in meno di un secondo. Sfortunatamente, non sono abbastanza competente da aggiungere un timer al bot del controller. Tuttavia, cronometrerò manualmente i robot.
Risultati!
Bene, avevo ragione. Ho dimenticato di far controllare il bot del controller per vedere se il MasterBoard è pieno. Se la MasterBoard è piena, OGNI mossa non è valida, ma continua a chiamare i robot, motivo per cui c'erano così tante mosse non valide. L'ho risolto ora. Ecco i risultati ufficiali con la versione più recente di tutti i robot.
Bot 1, goodRandBot, has 1 wins and made 0 illegal moves, for a total of 133 points.
Bot 2, naiveBot, has 3 wins and made 48 illegal moves, for a total of 361 points.
Bot 3, depthBot, has 5 wins and made 0 illegal moves, for a total of 664 points.
Bot 4, middleBot, has 1 wins and made 20 illegal moves, for a total of 114 points.
With 4 bots, This program took 477.471 seconds to finish.
Depth Bot è il campione in carica! Almeno, per ora.
XXX000---
trasmesso il vincitore di una scheda ? o è un "nessuno lo capisce nonostante O lo abbia vinto per primo"?