KOTH asimmetrico: cattura il gatto
AGGIORNARE : I file gist vengono aggiornati (comprese le nuove invii) in quanto 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 cat, il thread catcher può essere trovato qui .
Il controller può essere scaricato qui .
Questo è un KOTH asimmetrico: ogni sottomissione è o 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 metti 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 catcher o cat devi ciascuno di implementare completamente una classe Java (ci sono già alcuni esempi primitivi) e metterlo nel players
pacchetto (e aggiornare l'elenco di gatti / catcher nella classe Controller), ma puoi anche 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, la tua richiesta sarà squalificata. 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 richiede 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 inviare 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 191962 8 flawr
StupidFill 212688 9 flawr
Achilles 77214 6 The E
Agamemnon 74896 5 The E
CloseCatcher 54776 4 randomra
ForwordCatcher 93814 7 MegaTom
Dijkstra 47558 2 TheNumberOne
HexCatcher 48644 3 randomra
ChoiceCatcher 43834 1 randomra
RandCat 77490 9 flawr
StupidRightCat 81566 6 flawr
SpiralCat 93384 5 CoolGuy
StraightCat 80930 7 CoolGuy
FreeCat 106294 3 randomra
RabidCat 78616 8 cain
Dijkstra's Cat 115094 1 TheNumberOne
MaxCat 98400 4 Manu
ChoiceCat 113612 2 randomra
main.Controller
, chiamare getCatchers()
e simulare / sabotare le risposte dei catturatori con i loro takeTurn
metodi?