In un mondo desolato e devastato dalla guerra, dove le città sono state invase da delinquenti e ladri, la civiltà si è reinventata sotto forma di piccole cooperative isolate, industriali, sparse in tutto il paesaggio precedentemente disabitato. L'esistenza di queste comunità dipende da squadre di operai mercenari chiamati "scrappers", che cercano nel territorio selvaggio i materiali preziosi da vendere alle cooperative. Poiché questi materiali sono diventati sempre più scarsi, la demolizione è diventata una professione sempre più difficile e pericolosa. I fragili lavoratori umani sono stati per lo più sostituiti con stand-in robot remoti, chiamati "robot", e un mercenario tipico ha più probabilità di essere un abile programmatore che un saldatore armato. Poiché la presenza umana nella demolizione è diminuita, anche il rispetto tra i gruppi mercenari è diminuito. I robot sono attrezzati non solo per raccogliere rottami, ma anche per difenderli e in alcuni casi lo prendono con la forza. I programmatori di robot lavorano instancabilmente elaborando nuove strategie per superare in astuzia gli scrappers rivali, risultando in robot sempre più aggressivi e un altro pericolo per gli umani che si avventurano fuori dalle mura delle loro comunità.
(sì, il logo viene ritagliato in modo esilarante)
Benvenuto in Scrappers!
Questa è una versione iniziale di Scrappers in cui non sono state implementate la raccolta e le fabbriche di rottami. Fondamentalmente è uno "sparatutto".
Sei un programmatore mercenario incaricato di creare un programma per condurre i tuoi robot in remoto alla vittoria su gruppi di scrapper rivali. I tuoi robot sono macchine simili a ragni costituiti da generatori di potenza e scudo nel loro nucleo, circondati da molte appendici dotate di strumenti di presa, taglio e attacco. Il generatore di corrente è in grado di produrre 12 unità di potenza (unità di elaborazione) per tick (unità di tempo di uno scrapper). Hai il controllo di come questo potere viene distribuito tra i tre bisogni primari di un robot: movimento, scudi e potenza di fuoco.
I robot Scrapper sono macchine eccezionalmente agili e possono facilmente spostarsi sopra, sotto e intorno agli ostacoli che incontrano. Pertanto, la collisione non è qualcosa che il tuo programma ha bisogno di prendere in considerazione. Sei libero di allocare tutti, alcuni o nessuno dei 12pu disponibili per il tuo bot per il movimento, a patto che ti occupi di numeri interi. Allocare 0pu alle funzioni di movimento di un bot lo renderebbe immobile. Allocare 2pu consentirebbe a un bot di spostare 2 unità di distanza (du) per tick, 5pu comporterebbe 5du / tick, 11pu comporterebbe 11du / tick e così via.
I generatori di scudi dei tuoi robot proiettano una bolla di energia deflettiva attorno al loro corpo. Uno scudo può deviare fino a 1 danno prima di scoppiare, lasciando così il robot esposto fino a quando il suo generatore di scudo non sviluppa abbastanza potenza per far scattare lo scudo in posizione. Sei libero di allocare tutti, alcuni o nessuno dei 12pu disponibili per il tuo bot verso lo scudo. Allocare 0pu allo scudo di un bot significa che non genererà mai uno scudo. Allocare 2pu consentirebbe a un bot di generare un nuovo scudo 2 su 12 tick o una volta ogni 6 tick. 5pu comporterebbe una rigenerazione dello scudo 5 su ogni 12 tick e così via.
Costruendo una carica nei loro laser di saldatura, i tuoi robot possono sparare raggi dannosi su brevi distanze con una precisione assoluta. Come la generazione di scudi, la velocità di fuoco dei tuoi robot dipende dalla potenza assegnata ai loro laser. Allocare 0pu ai laser di un bot significa che non sparerà mai. Allocare 2pu consentirebbe a un bot di sparare 2 su ogni 12 tick e così via. Il laser di un robot viaggerà fino a quando non incontra un oggetto o si disperde nell'inutilità, quindi sii consapevole del fuoco amico. Sebbene i tuoi robot siano abbastanza precisi, non sono perfetti. Dovresti aspettarti una precisione di +/- 2,5 gradi di varianza. Mentre il raggio laser viaggia, le sue particelle vengono deviate in modo incrementale dall'atmosfera fino a quando il raggio diventa effettivamente innocuo con una distanza sufficiente. Un laser infligge 1 danno a distanza del punto in bianco e il 2,5% in meno di danni a ogni lunghezza del bot che percorre.
I robot Scrapper sono abbastanza autonomi da gestire le funzioni di base, ma fanno affidamento su di te, il loro programmatore, per renderli utili come gruppo. Come programmatore, puoi emettere i seguenti comandi per ogni singolo bot:
- SPOSTA: specifica le coordinate verso le quali si sposterà un bot.
- OBIETTIVO: identificare un robot a cui puntare e sparare quando l'allocazione di potenza lo consente.
- POTENZA: ridistribuire il potere tra movimento, scudi e potenza di fuoco.
Dettagli tecnici del gioco
Esistono tre programmi che devi conoscere. Il motore di gioco è il sollevatore pesante e fornisce un'API TCP che i programmi giocatore connettersi. Il programma del lettore è ciò che scriverai, e ho fornito alcuni esempi con i binari qui . Infine, il Renderer elabora l'output del Game Engine per produrre una GIF della battaglia.
Il motore di gioco
Puoi scaricare il motore di gioco da qui . All'avvio del gioco, inizierà l'ascolto sulla porta 50000 (attualmente non configurabile) per le connessioni dei giocatori. Una volta che riceve due connessioni giocatori, invia il messaggio PRONTO ai giocatori e inizia il gioco. I programmi del giocatore inviano i comandi al gioco tramite l'API TCP. Al termine del gioco, viene creato un file JSON chiamato scrappers.json (anche attualmente non configurabile). Questo è ciò che il renderer utilizza per creare una GIF del gioco.
L'API TCP
I programmi del giocatore e il motore di gioco comunicano passando le stringhe JSON terminate da una riga indietro e la quarta su una connessione TCP. Esistono solo cinque diversi messaggi JSON che possono essere inviati o ricevuti.
Messaggio pronto
Il messaggio PRONTO viene inviato dal gioco ai programmi del giocatore e viene inviato una sola volta. Questo messaggio indica al programma del giocatore qual è il suo ID giocatore (PID) e fornisce un elenco di tutti i robot nel gioco. Il PID è l'unico modo per determinare quali robot sono amici o nemici. Maggiori informazioni sui campi bot di seguito.
{
"Type":"READY", // Message type
"PID":1, // Player ID
"Bots":[ // Array of bots
{
"Type":"BOT",
"PID":1,
"BID":1,
"X":-592,
...
},
...
]
}
Messaggio Bot
Il messaggio BOT viene inviato dal gioco ai programmi del giocatore e viene inviato quando gli attributi di un bot cambiano. Ad esempio, quando si proiettano gli scudi o si modificano le condizioni di salute, viene inviato un messaggio BOT. L'ID Bot (BID) è unico solo all'interno di un determinato giocatore.
{
"Type":"BOT", // Message type
"PID":1, // Player ID
"BID":1, // Bot ID
"X":-592, // Current X position
"Y":-706, // Current Y position
"Health":12, // Current health out of 12
"Fired":false, // If the Bot fired this tick
"HitX":0, // X position of where the shot landed
"HitY":0, // Y position of where the shot landed
"Scrap":0, // Future use. Ignore.
"Shield":false // If the Bot is currently shielded.
}
Sposta messaggio
Il messaggio MOVE è un comando dal programma del giocatore al gioco (ma pensalo come un comando a un bot). Basta identificare il bot che si desidera spostare e le coordinate. Si presume che tu stia comandando il tuo bot, quindi non è necessario alcun PID.
{
"Cmd":"MOVE",
"BID":1, // Bot ID
"X":-592, // Destination X coordinate
"Y":-706, // Destination Y coordinate
}
Messaggio di destinazione
Il messaggio TARGET dice a uno dei tuoi robot di scegliere come target un altro bot.
{
"Cmd":"TARGET",
"BID":1, // Bot ID
"TPID":0, // The PID of the bot being targeted
"TBID":0, // The BID of the bot being targeted
}
Messaggio di alimentazione
Il messaggio POWER rialloca la 12pu disponibile per il tuo bot tra movimento, potenza di fuoco e scudi.
{
"Cmd":"POWER",
"BID":1, // Bot ID
"FPow":4, // Set fire power
"MPow":4, // Set move power
"SPow":4, // Set shield power
}
La competizione
Se sei abbastanza coraggioso da esplorare le terre selvagge, entrerai in un torneo a doppia eliminazione contro i tuoi pari mercenari. Si prega di creare una risposta per l'invio e incollare il codice o fornire un collegamento a un repository git, gist, ecc. Qualsiasi lingua è accettabile, ma si dovrebbe presumere che io non sappia nulla della lingua e includa le istruzioni per l'esecuzione del programma. Crea tutti gli invii che desideri e assicurati di dare loro i nomi!
I programmi del giocatore campione saranno inclusi nel torneo, quindi consiglio vivamente di testare il bot contro di loro. Il torneo avrà inizio circa due settimane dopo che avremo ricevuto quattro proposte di programma uniche. In bocca al lupo!
--- Winner's Bracket ---
** Contestants will be randomly seeded **
__________________
|___________
__________________| |
|___________
__________________ | |
|___________| |
__________________| |
|________________
__________________ | |
|___________ | |
__________________| | | |
|___________| |
__________________ | |
|___________| |
__________________| |
|
--- Loser's Bracket --- |___________
|
___________ |
|___________ |
___________| |___________ |
| | |
___________| | |
|___________ |
___________ | | |
|___________ | |___________|
___________| |___________| |
| |
___________| ___________|
Altre informazioni importanti
- Il gioco funziona a 12 tick / secondo, quindi non riceverai messaggi più frequentemente di circa 83 millisecondi circa.
- Ogni bot ha un diametro di 60du. Lo scudo non occupa spazio aggiuntivo. Con una precisione del +/- 2,5%, le probabilità di colpire un bot a una certa distanza sono rappresentate da questo grafico:
- Il decadimento del danno laser sulla distanza è rappresentato da questo grafico:
- La precisione di un robot e il decadimento laser si combinano per calcolare il danno medio per colpo. Cioè, il danno medio che un bot causerà quando spara da una certa distanza. Il danno per colpo è rappresentato da questo grafico:
- Il laser di un robot ha origine a metà strada tra il centro del robot e il suo bordo. Pertanto, impilare i tuoi robot si tradurrà in fuoco amico.
- I robot nemici generano circa 1440du di distanza.
- Il gioco termina se passano 120 tick (10 secondi) senza subire danni.
- Il vincitore è il giocatore con il maggior numero di robot, quindi la maggior parte della salute al termine del gioco.
Comprensione dell'immagine renderizzata
- Il giocatore 1 è rappresentato da cerchi e il giocatore 2 da esagoni.
- Il colore di un bot rappresenta la sua allocazione di potenza. Più rosso significa che più potenza è stata assegnata al fuoco. Più blu significa più scudo. Più verde significa più movimento.
- Il "buco" nel corpo di un robot rappresenta un danno. Più grande è il buco, maggiore è il danno subito.
- I cerchi bianchi che circondano un robot sono lo scudo. Se un bot ha uno scudo alla fine del turno, viene mostrato. Se lo scudo è stato fatto esplodere subendo danni, non viene mostrato.
- Le linee rosse tra i robot rappresentano gli scatti effettuati.
- Quando un robot viene ucciso, viene mostrata una grande "esplosione" rossa.