In questa sfida, devi progettare una specie di organismi monocellulari per combattere fino alla morte nell'arena della capsula di Petri. L'arena è rappresentata da una griglia rettangolare, in cui ogni cella occupa uno spazio:
.....x....
...x...o..
...x.c..o.
.......o..
attributi
Ogni cella ha tre attributi. Quando si specifica la specie cellulare all'inizio del gioco, si assegnano 12 punti tra questi attributi.
- Hit Point (HP): se l'HP di una cella scende a zero, muore. Le nuove celle hanno HP completi.
- Quando una cellula muore, lascia un cadavere che può essere mangiato da altre cellule per ottenere energia.
- Una cella non può riguadagnare HP persi, ma può creare una nuova cella con HP completi dividendola.
- Energia : la maggior parte delle azioni che una cellula può compiere richiede energia. Riposando attivamente, una cellula può recuperare energia persa fino al massimo delle specie.
- È probabile che una specie cellulare con meno di 5 energie fallisca, perché non può dividersi per creare nuove cellule.
- Una cellula non può recuperare energia oltre il valore massimo della sua specie.
- Una cella appena creata ha un valore di energia iniziale copiato dal suo genitore (e un valore massimo dettato dalle specifiche della sua specie).
- Acidità : se una cellula sceglie di esplodere, il livello di acidità della cellula viene utilizzato nel calcolo del danno alle cellule adiacenti.
Azioni
Ad ogni turno, ogni cella può compiere un'azione:
Sposta: la cella si sposta di uno spazio in qualsiasi direzione (N / S / E / W / NE / NW / SE / SW) al costo di 1 energia.
- Una cellula non può spostarsi in uno spazio occupato da un'altra cellula vivente.
- Una cella non può spostarsi fuori dalla griglia.
- Passare a un cadavere cellulare distrugge il cadavere.
Attacco: una cellula attacca una cellula adiacente, infliggendo da 1 a 3 danni, spendendo da 1 a 3 punti energia.
- Una cellula può attaccare in qualsiasi direzione (N / S / E / W / NE / NW / SE / SW).
- È legale attaccare le cellule amiche.
Dividi: la cellula divide e crea una nuova cellula su uno spazio adiacente, al costo di 5 energia.
- Una cella può dividersi in qualsiasi direzione (N / S / E / W / NE / NW / SE / SW).
- La nuova cella ha HP completi secondo le specifiche della cella originale.
- La nuova cella ha la stessa energia della sua cella madre dopo aver sottratto il costo di divisione. (Ad esempio, una cellula madre con un iniziale 8 punti energia sarà ridotta a 3 energia e produrrà una cellula figlio con 3 energia).
- Una nuova cella non può agire fino al tuo prossimo turno.
- Una cellula non può dividersi in uno spazio occupato da una cellula vivente, ma può dividersi in uno spazio occupato da un cadavere di cellule morte (questo distrugge il cadavere).
Mangia: una cellula mangia un cadavere cellulare adiacente, guadagnando 4 energie.
- Una cellula può mangiare in qualsiasi direzione (N / S / E / W / NE / NW / SE / SW).
Riposo: una cellula non fa nulla per un turno, riguadagnando 2 energie.
Esplosione: quando una cella ha 3 o meno HP e più energia di HP, può scegliere di esplodere, infliggendo danni a tutte e otto le celle adiacenti.
- Il danno a ogni cella adiacente è
(exploding cell HP) + (explodng cell acidity)
- Una cellula esplosa muore e lascia un cadavere, così come qualsiasi cellula uccisa nell'esplosione.
- Il danno a ogni cella adiacente è
Protocollo
Impostare
Il programma verrà eseguito con la stringa BEGIN
fornita su stdin. Il tuo programma deve scrivere in stdout un elenco separato da spazi di 3 numeri interi non negativi, che rappresentano HP, energia e acidità per le tue specie cellulari: ad es 5 6 1
. I numeri devono essere pari a 12. L'acidità può essere 0
, se lo si desidera. (Anche altri attributi possono essere zero, ma farlo perde funzionalmente il gioco!)
Inizi con una cella, nell'angolo nord-ovest o sud-est, uno spazio lontano da entrambi i bordi. La cella iniziale ha HP ed energia completi.
Ogni cellula agisce
Ad ogni turno, il tuo programma verrà invocato una volta per ogni cellula viva della tua squadra (tranne le celle appena create in questo turno) in modo che la cellula possa agire. Il programma viene fornito con dati su stdin che includono lo stato della capsula di Petri e informazioni su questa particolare cella:
10 4
..........
..xx.c....
...c...o..
......o...
6 3 5 7
I primi due numeri indicano la larghezza e l'altezza dell'arena: qui c'è un'arena 10 per 4.
- Le
o
cellule sono tue; lex
cellule sono i tuoi nemici. (Questo è sempre vero; ogni giocatore vede sempre le proprie celle comeo
.) - Gli
.
spazi sono vuoti. - Gli
c
spazi rappresentano corpi cellulari commestibili.
I numeri dopo la riga vuota rappresentano le informazioni su questa cella:
- I primi due numeri sono
x,y
coordinate, indicizzate da0,0
in alto a sinistra (quindi6 3
qui si riferisce allao
cella più a sud ). - Il terzo numero è l'HP della cella; il quarto numero è l'energia della cellula.
Il tuo programma dovrebbe generare (su stdout) un'azione. Negli esempi seguenti, useremo N
come esempio di direzione, ma può essere qualsiasi direzione legale per quell'azione ( N
/ S
/ E
/ W
/ NE
/ NW
/ SE
/ SW
). Tutto l'output del programma non fa distinzione tra maiuscole e minuscole, ma gli esempi useranno maiuscole. Qualsiasi azione di output che non è valida (sia perché ha sintassi non valida o tenta un'azione illegale) viene ignorata e si traduce nella cella REST
ing (e quindi guadagnando 2 energia).
MOVE N
DIVIDE N
EAT N
ATTACK N 2
- il numero rappresenta la forza dell'attacco (1 - 3)REST
EXPLODE
Il turno del tuo team consiste nel dare a tutte le tue cellule l'opportunità di agire, una per una. Tutte le tue cellule agiscono prima che agiscano le cellule dell'avversario. Quando tutte le tue cellule agiscono, il tuo turno termina e inizia il turno del tuo avversario. Una volta che tutte le celle del tuo avversario agiscono, il tuo turno ricomincia. Durante il tuo turno, ogni cellula ha la priorità di agire in base alla sua età: le cellule più vecchie della tua squadra agiscono prima delle cellule più giovani.
Esempio
Ecco come potrebbe comportarsi un programma. L'input dallo stdin è indicato qui con le >
frecce iniziali (separate dall'input effettivo da uno spazio di chiarimento) e l'output sullo stdout ha <
frecce.
> BEGIN
< 5 6 1
Quindi, il programma viene nuovamente richiamato:
> 10 4
> ..........
> .o........
> ........x.
> ..........
>
> 1 1 5 6
< DIVIDE SE
Dopo il turno del tuo avversario (che ha deciso di farlo DIVIDE W
con la singola cella iniziale), il tuo programma viene invocato due volte, una volta per ogni cella:
> 10 4
> ..........
> .o........
> ..o....xx.
> ..........
>
> 1 1 5 1
< MOVE E
Per la seconda invocazione nel tuo turno:
> 10 4
> ..........
> ..o.......
> ..o....xx.
> ..........
>
> 2 2 5 1
< MOVE SE
Nota che questa seconda cella vede lo stato della scheda aggiornato in base al movimento dell'altra cella all'inizio del tuo turno. Nota anche che questa cella è stata creata con 1 energia, perché la cellula madre aveva 6 energia quando ha eseguito la divisione nell'ultimo turno (quindi il 6 originale, meno il costo di divisione di 5 energie, ha creato una cella figlio con 1 energia).
Ora il tuo turno è finito e inizia il turno del tuo avversario. Le due celle avversarie avranno la possibilità di agire, e quindi inizierà il tuo prossimo turno.
Vittoria
Puoi vincere:
- Distruggere tutte le celle opposte, o
- Avere più celle del tuo avversario dopo che ogni giocatore ha completato 150 turni
Il punteggio si baserà sul numero di vittorie in 100 partite l'una contro l'altra. Nella metà delle simulazioni, il tuo programma potrà iniziare per primo.
Le partite a pareggio (cioè esattamente lo stesso numero di celle dopo 150 turni, o le uniche cellule rimanenti vengono uccise insieme in un'esplosione) non vengono conteggiate nei totali delle vincite di entrambi i giocatori.
Altre informazioni
- Il tuo programma non dovrebbe tentare di mantenere lo stato (oltre a usare lo stato della capsula di Petri): gli organismi monocellulari non hanno una memoria molto buona e reagiscono al mondo momento per momento. In particolare, la scrittura su un file (o altro archivio dati), la comunicazione con un server remoto o l'impostazione delle variabili di ambiente sono esplicitamente vietate.
- Gli invii verranno eseguiti / compilati su Ubuntu 12.04.4.
- Le specifiche dei 100 giochi con punteggio non sono ancora confermate, ma probabilmente coinvolgeranno più dimensioni di arena (ad esempio, 50 piste su una piccola arena e 50 piste su una più grande arena). Per un'arena più grande, posso aumentare il numero massimo di turni per garantire che possa svolgersi una battaglia adeguata.
risorse
Ecco il codice del driver che esegue la simulazione, scritto per Node.js, chiamato da node petri.js 'first program' 'second program'
. Ad esempio, potrebbe sembrare un pitting di una cella scritta in Python contro una cella scritta in Java node petri.js 'python some_cell.py' 'java SomeCellClass'
.
Inoltre, capisco che leggere e analizzare più righe sullo stdin può essere un dolore enorme, quindi ho redatto alcune celle campione complete in diverse lingue su cui sei libero di costruire, revisionare completamente o ignorare del tutto.
- Cella Java
- Python cell
- Cella JavaScript (da utilizzare con Node.js)
Naturalmente sei libero di scrivere una cella in una lingua diversa; queste sono semplicemente tre lingue per le quali ho deciso di scrivere il codice boilerplate come aiuto per risparmiare tempo.
In caso di problemi con il driver, sentitevi liberi di chiamarmi nella chat room che ho creato per questa sfida . Se non hai una reputazione sufficiente per la chat, lascia un commento.
'node c:/cell/cell_template.js'
per ogni argomento, proprio come dovresti specificare'java CellTemplate'
per il codice Java. Lo chiarirò nel testo della sfida. Se hai ancora problemi, noi (e chiunque altro abbia problemi tecnici) possiamo continuare questa discussione in una chat room che ho appena creato .