KOTH asimmetrico: cattura il gatto
AGGIORNAMENTO : I file gist vengono aggiornati (comprese le nuove invii) poiché Controller.java non ha rilevato eccezioni (solo errori). Ora rileva errori ed eccezioni e li stampa anche.
Questa sfida consiste in due thread, questo è il thread catcher, il thread cat può essere trovato qui .
Il controller può essere scaricato qui .
Questo è un KOTH asimmetrico: ogni invio è un gatto o un ricevitore . Ci sono giochi tra ogni coppia di ciascuno un gatto e un ricevitore. I gatti e i cacciatori hanno classifiche separate.
Catcher
C'è un gatto su una griglia esagonale. Il tuo compito è prenderlo il più velocemente possibile. Ad ogni giro, puoi posizionare un secchio d'acqua su una cella della griglia per impedire al gatto di poterci andare. Ma il gatto non è (forse) così stupido e ogni volta che si posiziona un secchio, il gatto si sposterà in un'altra cella della griglia. Poiché la griglia è esagonale, il gatto può andare in 6 direzioni diverse. Il tuo obiettivo è circondare il gatto con secchi d'acqua, più veloce è, meglio è.
Gatto
Sai che il ricevitore vuole catturarti mettendo secchi d'acqua intorno a te. Certo che cerchi di evadere, ma dato che sei un gatto pigro (come i gatti) fai esattamente un passo alla volta. Ciò significa che non puoi stare nello stesso posto in cui ti trovi, ma devi spostarti in uno dei sei punti circostanti. Ogni volta che vedi che il ricevitore ha messo un nuovo secchio d'acqua, vai in un'altra cella. Certo che cerchi di evadere il più a lungo possibile.
Griglia
La griglia è esagonale, ma poiché non abbiamo strutture di dati esagonali, prendiamo una 11 x 11
matrice quadrata 2d e imitiamo il "comportamento" esagonale che il gatto può muovere solo in 6 direzioni:
La topologia è toroidale, ciò significa che se passi su una cella "esterna" dell'array, verrai trasferito nella cella corrispondente sull'altro lato dell'array.
Gioco
Il gatto inizia in una determinata posizione nella griglia. Il ricevitore può fare la prima mossa, quindi il gatto e il suo ricevitore si alternano fino a quando il gatto viene catturato. Il numero di passaggi è il punteggio per quel gioco. Il gatto cerca di ottenere un punteggio il più grande possibile, il ricevitore cerca di ottenere un punteggio il più basso possibile. La somma media di tutti i giochi a cui hai partecipato sarà il punteggio della tua presentazione. Esistono due classifiche separate, una per il gatto, una per i cacciatori.
controllore
Il controller dato è scritto in Java. Come un catcher o un gatto ognuno di essi deve implementare ciascuno una classe Java (ci sono già alcuni esempi primitivi) e inserirlo nel players
pacchetto (e aggiornare l'elenco di gatti / catcher nella classe Controller), ma è anche possibile scrivere funzioni aggiuntive all'interno di quella classe. Il controller viene fornito con ogni due esempi funzionanti di semplici classi gatti / catcher.
Il campo è un array 11 x 11
2D int
che memorizza i valori degli stati correnti delle celle. Se una cella è vuota, ha valore 0
, se c'è un gatto ha valore -1
e se c'è un bucket c'è un 1
.
Ci sono alcune funzioni che puoi usare: isValidMove()
/ isValidPosition()
sono per verificare se la tua mossa (gatto) / posizione (ricevitore) è valida.
Ogni volta che è il tuo turno, la tua funzione takeTurn()
viene chiamata. L'argomento contiene una copia della griglia corrente e ha metodi come read(i,j)
per leggere la cella (i,j)
, oltre a isValidMove()/ isValidPosition()
verificare la validità della tua risposta. Questo gestisce anche il wrapping della topologia toroidale, il che significa che anche se la griglia è solo 11 x 11, è ancora possibile accedere alla cella (-5,13).
Il metodo dovrebbe restituire una int
matrice di due elementi, che rappresentano possibili mosse. Per i gatti sono questi {-1,1},{0,1},{-1,0},{1,0},{0,-1},{1,-1}
che rappresentano la posizione relativa di dove il gatto vuole andare, e i raccoglitori restituiscono le coordinate assolute di dove vogliono posizionare un secchio {i,j}
.
Se il tuo metodo produce una mossa non valida, il tuo invio verrà squalificato. La mossa è considerata non valida, se a destinazione è già un bucket o la mossa non è consentita / destinazione già occupata (come un gatto) o se esiste già un bucket / gatto (come un catcher). Puoi verificarlo prima con le funzioni indicate.
Il tuo invio dovrebbe funzionare abbastanza velocemente. Se il metodo impiega più di 200 ms per ogni passaggio, verrà anche squalificato. (Preferibilmente molto meno ...)
I programmi sono autorizzati a memorizzare informazioni tra i passaggi.
Inseriti
- Puoi fare tutte le richieste che desideri.
- Si prega di non modificare in modo significativo gli invii già inviati.
- Per favore, ogni invio in una nuova risposta.
- Ogni invio dovrebbe preferibilmente avere un nome univoco.
- L'invio deve consistere nel codice della tua classe e in una descrizione che ci dice come funziona l'invio.
- È possibile scrivere la riga
<!-- language: lang-java -->
prima del codice sorgente per ottenere l'evidenziazione automatica della sintassi.
punteggio
Tutti i gatti competeranno contro tutti i cacciatori lo stesso numero di volte. Proverò ad aggiornare frequentemente i punteggi attuali, i vincitori saranno determinati quando l'attività sarà diminuita.
Questa sfida è ispirata a questo vecchio gioco flash
Grazie a @PhiNotPi per il test e il feedback costruttivo.
Punteggi attuali (100 partite per accoppiamento)
Name Score Rank Author
RandCatcher 191674 8 flawr
StupidFill 214246 9 flawr
Achilles 76820 6 The E
Agamemnon 74844 5 The E
CloseCatcher 54920 4 randomra
ForwordCatcher 94246 7 MegaTom
Dijkstra 46500 2 TheNumberOne
HexCatcher 48832 3 randomra
ChoiceCatcher 43828 1 randomra
RandCat 77928 7 flawr
StupidRightCat 81794 6 flawr
SpiralCat 93868 5 CoolGuy
StraightCat 82452 9 CoolGuy
FreeCat 106304 3 randomra
RabidCat 77770 8 cain
Dijkstra's Cat 114670 1 TheNumberOne
MaxCat 97768 4 Manu
ChoiceCat 113356 2 randomra