Consente di giocare a Kick The Can!
Sebbene Moogie sia l'attuale vincitore, se qualcuno può prendere la sua corona, è incoraggiato a farlo
Kick the can è un gioco per bambini. Coinvolgere un difensore e più attaccanti. Oggi non è più un gioco del genere! Il tuo compito è quello di scrivere un robot che lo suona, per vincere, in stile re della collina !
https://en.wikipedia.org/wiki/Kick_the_can
Ci sono alcune differenze chiave in questo gioco. La prima differenza chiave è che il gioco è multiplayer (5v5). La seconda differenza fondamentale è che entrambi i set di robot possono uccidere ed eliminare i giocatori nemici con entrambe le mine e le bombe lanciate! I robot non possono vedere mine (indipendentemente dalla distanza) o giocatori a più di cinque isolati di distanza!
La mappa è un labirinto come segue.
Questo labirinto è generato proceduralmente creando prima un labirinto usando un algoritmo di backtracking ricorsivo di profondità. E quindi posizionando i fori mostrati in (oltre a rendere il labirinto più "imperfetto". Il labirinto è largo 65x65 blocchi e indicizzato zero. Quindi la bandiera blu (lattina) è a 1,1 e la bandiera rossa (lattina) è a 63,63. La squadra blu viene generata a 2,2 e 3,3 4,4 ecc. La squadra rossa viene generata a 62,62 e 61,61, 60,60 ecc. I blocchi in ciano sono robot della squadra blu e i blocchi in magenta sono bot rossi. Il gioco è sempre cinque contro 5. Ogni bot del team utilizzerà il codice (ma potrebbe memorizzare altre variabili di istanza (o creare file locali) per tenere traccia dello stato e differenziare i ruoli.
gameplay
Le miniere possono essere posizionate come puoi vedere in grigio. E le bombe possono essere lanciate fino a una distanza massima di quattro blocchi. Questi viaggiano per un massimo di quattro blocchi attraverso i muri e altri giocatori uccidono solo i nemici che si frappongono sulla tua strada. Dopo ogni passaggio hanno una probabilità del 40% di cadere. Quindi hanno il 100% di possibilità di 1 raggio 60% a 2 raggio 36% a 3 raggio e il 21,6% a 3 raggio Posizionare una miniera o lanciare una bomba richiede munizioni a una squadra. Questo inizia da 0 e può essere aumentato raccogliendo le caselle arancioni. Nota che quattro (4) di queste cache delle munizioni saranno comodamente centrate. I robot sono allineati in una schiera di due rossi e due blu. IE RRRRRBBBBB. Consentire di sventolare la bandiera è permesso, ma attenzione che stare vicino alla bandiera (cioè meno di cinque blocchi) provoca lentezza e consente solo il movimento. ogni tre turni. L'Arena sceglie un antipasto casuale per ogni turno. IO.
Obbiettivo
Programma i tuoi cinque robot (ognuno ha lo stesso file di classe) per navigare con successo nel labirinto e toccare la lattina avversaria facendo attenzione a non rovesciare accidentalmente la propria lattina o calpestare una miniera.
Programmazione
Le voci dell'arena e dei bot sono attualmente in Java, tuttavia esiste un wrapper stdin / out per altre lingue.
Il codice arena verrà reso disponibile ma qui sono i dettagli rilevanti.
Classe Bot
public class YourUniqueBotName extends Bot{
public YourUniqueBotName(int x , int y, int team){
super(x,y,team);
//optional code
}
public Move move(){//todo implement this method
//it should output a Move();
//A move has two paramaters
//direction is from 0 - 3 as such
// 3
// 2-I-0
// 1
// a direction of 4 or higher means a no-op (i.e stay still)
//And a MoveType. This movetype can be
//MoveType.Throw
//MoveType.Mine
//MoveType.Defuse defuse any mine present in the direction given
//MoveType.Move
}
}
Metodi chiave disponibili
Si noti che l'utilizzo di qualsiasi tecnica per modificare o accedere ai dati a cui generalmente non si dovrebbe avere accesso non è consentito e comporterà la squalifica.
Arena.getAmmo()[team];//returns the shared ammo cache of your team
Arena.getMap();//returns an integer[] representing the map. Be careful since all enemies more than 5 blocks away (straight line distance) and all mines are replaced with constant for spaces
//constants for each block type are provided such as Bot.space Bot.wall Bot.mine Bot.redTeam Bot.blueTeam Bot.redFlag Bot.blueFlag
Arena.getAliveBots();//returns the number of bots left
getX();//returns a zero indexed x coordinate you may directly look at (but not change X)
getY();//returns a zero indexed y coordinate (y would work to, but do not change y's value)
//Although some state variables are public please do not cheat by accessing modifying these
Specifiche dell'interfaccia del wrapper StdIn / Out
L'interfaccia è composta da due modalità: inizializzazione e funzionamento.
Durante la modalità di inizializzazione, un singolo frame INIT viene inviato tramite stdout. Le specifiche di questo frame sono le seguenti:
INIT
{Team Membership Id}
{Game Map}
TINI
Dove: {ID iscrizione squadra} è un singolo personaggio: R o B. B che significa squadra blu, R che significa squadra rossa.
{Mappa del gioco} è una serie di righe di caratteri ASCII che rappresentano una riga della mappa. Sono validi i seguenti caratteri ASCII: F = bandiera blu G = bandiera rossa O = spazio aperto W = muro
Il gioco procederà quindi a inviare frame di gioco su stdout a ciascun bot in questo modo:
FRAME
{Ammo}
{Alive Bot Count}
{Bot X},{Bot Y}
{Local Map}
EMARF
Dove:
{Ammo} è una stringa di cifre, il valore sarà 0 o maggiore {Alive Bot Count} è una stringa di cifre, il valore sarà 0 o maggiore {Box X} è una stringa di cifre che rappresenta la coordinata X del bot sulla mappa del gioco. Il valore sarà 0 <= X <Larghezza mappa. {Riquadro Y} è una stringa di cifre che rappresenta la coordinata Y del bot sulla mappa di gioco. Il valore sarà 0 <= Y <Altezza mappa. {Local Map} è una serie di righe di caratteri ASCII che rappresentano l'intera mappa che circonda il bot. Sono validi i seguenti caratteri ASCII: F = bandiera blu G = bandiera rossa O = spazio aperto W = muro R = bot squadra rossa B = bot squadra blu M = miniera A = munizioni
Il controller si aspetta che il bot emetta (su stdout) una risposta a riga singola nel formato:
{Action},{Direction}
Dove:
{Azione} è uno dei seguenti: Sposta Disattiva lancio miniera
{Direzione} è una singola cifra compresa tra 0 e 4 inclusi. (vedi le informazioni sulla direzione in precedenza)
NOTA: tutte le stringhe saranno delimitate dal carattere \ n Fine linea.Questo sarà un torneo di eliminazione. I miei robot campione parteciperanno come riempitori, ma non mi concederò la vittoria. In caso di vittoria di uno dei miei robot, il titolo passa al secondo posto e continuerà fino a quando non ci sarà un bot che non è uno dei miei. Ogni partita è composta da 11 colpi di calcio della lattina. Se nessuna delle due squadre ha vinto una sola partita, entrambe vengono eliminate. Se c'è un pareggio con punteggio diverso da zero, verrà giocata una partita di pareggio. Se rimane un pareggio, entrambi vengono eliminati. I round successivi possono consistere in più partite. Il seeding del torneo si baserà sul numero di voti a partire dal 31/07/16 (la data è soggetta a modifiche).
Ogni partita dura 4096 turni. Una vittoria garantisce un punto. Un pareggio o una perdita concede zero punti. In bocca al lupo!
Sentiti libero di consultare il codice o di criticarlo in questo GitHub Repo.
https://github.com/rjhunjhunwala/BotCTF/blob/master/src/botctf/Arena.java
Nota che non ho interpreti per troppe lingue sul mio computer e potrei aver bisogno di volontari per eseguire la simulazione sul loro computer. Oppure posso scaricare l'interprete linguistico. Assicurati che i tuoi robot.
- Rispondi in un ragionevole lasso di tempo (ad esempio 250 ms)
- Non danneggerà la mia macchina host