# Robocode

«Build the best, destroy the rest!»
(Motto di Robocode)
Robocode è un progetto open source il cui scopo è insegnare la programmazione in Java divertendo.
L'apprendimento avviene attraverso un gioco che consiste nel programmare un robot e farlo competere in un'arena contro altri robot, identici ma programmati differentemente.
Il giocatore è il programmatore del robot e influenza indirettamente il gioco realizzando l'intelligenza artificiale del proprio robot.

## Storia

Robocode è stato creato da un ricercatore del campus IBM di Cambridge, Mat Nelson. Pubblicato il 27 luglio 2001 utilizzando il laboratorio di ricerca AlphaWorks che rende il tutto disponibile agli utenti.
Robocode è sviluppato dal 2006 da Flemming N. Larsen sotto Common Public License, una licenza per software open source pubblicata da IBM.

## Aspetti didattici

Lo scopo primario di Robocode è di insegnare la programmazione in Java: il giocatore affronta lo sviluppo di algoritmi che consentano ai robot di mostrare un'abilità intelligente all'interno del dominio specifico di Robocode. I giocatori alle prime armi imparano le conoscenze basilari, come ereditarietà, polimorfismo, gestione degli eventi, classi, mentre i più esperti testano concetti quali pattern matching, algoritmi di ricerca ottimizzati, reti neurali.
Il motore grafico che realizza la simulazione delle battaglie offre la possibilità di "vedere" gli effetti degli algoritmi ideati; in questo modo il giocatore partecipa attivamente alla costruzione della conoscenza. Quest'approccio è utilizzato anche in LOGO, un linguaggio di programmazione orientato alla grafica.
Anche se Robocode non è un simulatore ideale, la sua semplicità l'ha reso popolare. Inoltre è possibile comparare il proprio lavoro con quello di migliaia di Robocoders (sviluppatori di robot). Per eseguire in tutta sicurezza il codice dei robot programmati da altre persone, Robocode è stato realizzato come una sandbox e tutti i robot hanno restrizioni nell'uso della macchina in cui sono eseguiti.
È da rilevare che in Robocode non sono presenti sangue, persone o riferimenti politici. Le battaglie avvengono per il divertimento intrinseco nelle competizioni.

## Che cosa è Robocode

Robocode è un simulatore di battaglia tra robot, portabile su tutte le piattaforme che supportano Java. Nella simulazione la programmazione degli aspetti fisici è ridotta all'essenziale e diviene invece fondamentale il legame tra percezione e azione.

### Caratteristiche tecniche

In Robocode dei carri armati (i robot) combattono in una battaglia che avviene in un rettangolo chiamato arena di dimensioni variabili e circondato da mura. La dimensione dell'arena è di 800x600 pixel ma può essere modificata; i robot hanno dimensione fissa di 36x45 pixel.
Una battaglia consiste in un numero di round prefissato dall'utente. Il vincitore della battaglia è il robot che, al termine di tutti i round, ha ottenuto il punteggio più alto. Un round termina quando tutti i robot tranne uno sono stati distrutti: il "sopravvissuto" è il vincitore. I robot iniziano ogni round con un livello di energia pari a 100 e sono distrutti quando questa scende sotto zero.

#### I turni

Robocode si basa sul concetto di turni. In ogni turno tutti i robot hanno un limitato ammontare di tempo per scegliere la propria azione. Quando un robot ha completato il suo turno, le sue azioni sono effettivamente eseguite in modo sequenziale.
Se un robot eccede nell'utilizzo del tempo limite di un turno, perde il diritto di eseguire azioni in quel turno. Se in un round questo avviene più di trenta volte, il robot è distrutto dal sistema e perde quel round. Questo significa che le abilità dei robot devono essere un compromesso tra la loro complessità computazionale e il tempo necessario a reagire agli eventi.

#### Elementi di un carro armato

I robot combattono sparandosi utilizzando un cannone. Sono inoltre equipaggiati di un radar con il quale "vedono" gli altri robot fino a una distanza di 1200 pixel.
Il radar, il cannone e il corpo (l'intero veicolo) del carro armato ruotano di 360 gradi indipendentemente tra loro, oppure il cannone può essere bloccato per seguire la rotazione del veicolo o ancora il radar può essere bloccato per seguire la rotazione del cannone o del veicolo.

##### Il radar

Il radar restituisce informazioni sui robot che si trovano all'interno del suo raggio di rilevazione. Alcune di queste informazioni sono velocità, distanza (in pixel), nome ed energia, direzione e posizione. Queste ultime due informazioni sono simili a quelle usate nell'orientamento e in topografia: in Robocode lo zero degli angoli è verso l'alto, come se fosse una bussola, e non verso destra come in trigonometria.
| (0, altezza arena) | | | | (larghezza arena, altezza arena) |
| | | 0 gradi | | |
| | 270 gradi | robot | 90 gradi |
| | | 180 gradi | | |
| (0, 0) | | | | (larghezza arena, 0) |

##### Il cannone

Il cannone può sparare con una potenza di fuoco variabile e, in proporzione alla potenza usata, è sottratta energia al robot che spara. Se il proiettile colpisce un avversario, il robot che ha sparato guadagna energia proporzionalmente alla potenza del proiettile.
I robot devono attendere tra uno sparo e l'altro il tempo necessario a ricaricare, che viene definito all'inizio della battaglia ed è uguale per tutti i robot. I proiettili viaggiano a una velocità in relazione con la potenza di fuoco: minore è la potenza di fuoco maggiore sarà la velocità del proiettile.
La seguente tabella mostra un esempio di danno procurato, energia bonus per aver colpito un avversario e velocità del proiettile in relazione alla potenza di fuoco.
| Potenza di fuoco | Danno provocato | Energia ricevuta | Velocità del proiettile (pixel/turno) |
| 0.1 | 0.4 | 0.3 | 19.7 |
| 1.0 | 4.0 | 3.0 | 17 |
| 2.0 | 10.0 | 6.0 | 14.0 |
| 3.0 | 16.0 | 9.0 | 11.0 |

##### I movimenti del carro armato

I robot si muovono con un'accelerazione costante e una velocità variabile (in avanti e indietro). Velocità positiva indica movimento in avanti e velocità negativa indica indietreggiamento. La massima velocità dei robot è pari a 8 pixel/turno.
Se due robot collidono, essi perdono 0.6 punti energia. Se un robot urta un avversario con la parte frontale del veicolo mentre procede, muovendosi in avanti, la mossa è considerata ramming (speronamento). Quando un robot effettua ramming gli viene attribuito un punteggio aggiuntivo.

#### Il sistema di punteggio

Robocode usa un sistema di punteggio per determinare il vincitore di una battaglia. Il vincitore non è necessariamente il robot che sopravvive a più round perché sono attribuiti dei punti seguendo queste regole:
* se un robot compie ramming, gli sono assegnati 2 punti moltiplicati per il danno inflitto all'avversario nel contatto.
* se un robot ne distrugge un altro mentre compie ramming, a esso è assegnato in punti il 30% del danno totale inflitto al robot.
* a ogni robot "in vita" sono assegnati 50 punti ogni volta che un robot è distrutto;
* al robot "sopravvissuto" al round è assegnato un ammontare di 10 punti per ogni robot distrutto in quel round;
* a ogni proiettile andato a segno è assegnato un punto;
* se si distrugge un robot, è assegnato in punti il 20% del danno totale inflitto a quel robot;
Il vincitore finale è il robot che ha ottenuto il maggior punteggio dopo che tutti i round sono stati portati a termine.

## Competizioni

Per le competizioni i robot sono suddivisi in categorie in modo simile al pugilato, dove il peso di un pugile stabilisce la categoria di appartenenza.
Un robot appartiene a una categoria in base alla dimensione del codice (compilato) con cui è programmato. Il codice di un robot è misurato in bytes e sono state individuate le seguenti categorie:
* Megabots, nessuna restrizione sulla dimensione del codice;
* Minibots, il codice è meno di 1500 bytes;
* Microbots, il codice è meno di 750 bytes;
* Nanobots, il codice è meno di 250 bytes;
I robot si fronteggiano nelle seguenti tipologie di combattimento:
* OneOnOne, abbreviato in 1-on-1: nell'arena sono presenti due robot che lottano uno contro uno.
* Melee: tre o più robot lottano tutti contro tutti.
* Teams: due o più squadre, composti ciascuno da cinque robot collaboranti.

### RoboRumble@Home

La competizione più importante è la RoboRumble@Home, basata su un sistema distribuito simile al SETI@home. La RoboRumble@Home permette di eseguire combattimenti di tipo 1-on-1, Melee e Teams. I combattimenti Melee e 1-on-1 sono disponibili per tutte e quattro le tipologie di robot.