Programmiamo un CROBOT

Indice
 

Introduzione
Come si gioca
La dotazione iniziale
Il linguaggio di sviluppo
Novità del PatchLevel 1.3A
Le convenzioni da usare
Gli accessori esterni
Analizzare il nostro primo crobot
Il mio crobot preferito
Le routine di fuoco
Gli attacchi finali
Stealth attack
iLbEsTiO attack
La parola agli autori
Maurizio Camangi
Alessandro Carlin
Daniele Nuzzo
Conclusioni

Introduzione:

`` Non si è ancora spenta l'eco del TorneoY2k che già il mondo di Crobots è in fibrillazione per la nuova sfida lanciata da Marco Pranzo: Il Torneo di MicroCrobots.
Che aspettate a gettarvi nella mischia!''

Se avete letto l'articolo introduttivo su CROBOTS già saprete di che cosa sto parlando, ma un piccolo ripasso non fa mai male.

Come si 'gioca':

CROBOTS è un compilatore ANSI 'C', non un videogioco interattivo!
Il duello con gli avversari umani è pertanto solo mentale e per giunta a distanza. La sfida infatti consiste nel dotare il nostro alter-ego digitale di routine che gli consentano di sopravvivere nell'arena virtuale dove si troverà a combattere con altri programmi.

Domanda: ma come si scrive un robot?
Risposta: in linguaggio C, è ovvio.

E se qualcuno non ha la più pallida idea di come si programma in C?
Niente panico. Questo articolo è stato pensato proprio per quanti , nutrendo interesse per questa competizione, sono frenati dal timore reverenziale verso tale linguaggio.
E poi CROBOTS è nato proprio per scopi didattici,quindi siate ottimisti!

Nonostante il manuale del gioco presenti già un paio di esempi, questi non sono né attuali (la crobotica negli ultimi anni ha fatto passi da gigante) né particolarmente semplici per l'utente inesperto, in quanto utilizzano da subito tutte le strutture e le possibilità permesse dal compilatore.
Ho quindi deciso di seguire un percorso interamente italiano, partendo dallo studio di un crobot molto semplice (Erica.r), per arrivare poi, passando attraverso livelli di difficoltà crescente (Arale.re Jedi.r ), a quello più complesso (Goblin.r).

Ma adesso bando agli indugi e andiamo ad incominciare!

La dotazione iniziale:

Quello che ci serve per iniziare a sviluppare le nostre temibilissime macchine da battaglia è ridotto ai minimi termini:
  • Un computer (indispensabile)
  • Un sistema operativo
  • Un text editor che generi file in formato ASCII
  • Una versione a scelta di CROBOT tra quelle disponibili: AmigaDOS, Linux, MS-DOS
  • Tutti i sorgenti dei combattenti scritti finora, per attingere a piene mani al meglio della produzione mondiale.
  • La pazienza di allenare un Crobot.
Nonostante il programma abbia requisiti hardware veramente minimali,  per lo sviluppo di un robot competitivo è caldamente consigliato l'impiego di un computer potente, in modo da poter testare a lungo e in tutte le situazioni il comportamento della nostra creazione.
Infatti, dal momento che l'andamento di una singola partita può essere influenzato anche da fattori casuali, èopportuno ripetere gli scontri un numero sufficientemente elevato di volte da garantire significatività statistica ai risultati ottenuti.

Il linguaggio di sviluppo:

Si tratta di un sottoinsieme dell'ANSI C, con alcune aggiunte che consentono un pieno controllo sul comportamento del robot, fornendogli le capacità di muoversi, cercare gli avversarie sparare loro.
Non è presente un pre-compilatore, né è implementata alcuna gestione dei file. In conseguenza di ciò il nostro programma non può avere una memoria. Ogni partita per luiè la prima e l'ultima. Oggi esiste comunque PPC, un preprocessore di comandi esterno scritto da Marco Giovannini, che risolve parzialmente il primo limite.
La gestione degli errori lascia a desiderare: nel caso se ne verifichi uno (per esempio una divisione per 0) il compilatore resetta semplicemente tutte le variabili del programma e riinizia ad eseguirlo dalla prima istruzione della procedura principale.
Inoltre è presente un bugnella funzione che restituisce la distanza del nemico: la scan()non vede gli avversari che si trovano nel cono compreso tra 0 e -10 gradi. Questo, unito al fatto che il compilatore considera sempre il valore assoluto degli angoli che gli passiamo, può a volte generare dei problemi .
Ogni robot ha a disposizione 999 VirtuaByte per il codice,e ciascuna istruzione occupa esattamente lo stesso ammontare di memoria.Ciò consente la stesura di programmi di circa 100/120 linee. Questo limite, inizialmente non molto sentito (i primi robot arrivavano a stentoai 100 VB), è oggi l'ostacolo più grande contro cui si infrangono gli sforzi dei crobotters, ma è anche grazie alla sua presenza che l'ottimizzazione delle routine ha raggiunto livelli incredibili. Solo per fare un esempio osservate l'evoluzione della procedura per il calcolo dell'angolazione necessaria a raggiungere un determinato punto:

Questa è quella fornita nel manuale:

Questa era inclusa in un crobot del 1997:

E questa infine viene dalla collezione autunno-inverno 1998:

È interessante notare che la compattezza si paga:le ultime due routine contengono infatti un errore. Nel caso in cui il punto di partenza e quello di arrivo abbiano la stessa ascissa ci si trova davanti a una divisione per 0, con il risultato di far ripartire il crobot dalla prima istruzione. L'evento è quanto mai raro, ma se volete stare sul sicuro usate la procedura del manuale e vivete felici.

Novità del PatchLevel 1.3A:

Questa nuova versione di Crobots finalmente risolve due dei problemi più sentiti dagli utenti:
  • Elimina finalmente il fastidioso bug di scansione sull'angolo 0.
  • Innalza il limite della lunghezza del codice a 2000 VirtuaByte.
Avete capito alla perfezione quanto detto sopra?
Allora smettetela immediatamente di leggere e iniziate a programmare, che il torneo vi attende.
Se invece, nonostante le procedure siano ben commentate, molti punti vi sono rimasti oscuri, non preoccupatevi minimamente. In seguito ogni cosa andrà al suo posto e tutto vi diventerà chiaro.
Comunque adesso è arrivato il momento di imparare qualcosa su...

Le Convenzioni da usare:

Del formato del file, che deve essere ASCII puro, per permettere al compilatore di eseguirlo correttamente, vi ho già parlato.
Aggiungo adesso che è opportuno salvare il file con estensione *.r, per permettere a chiunque di identificarlo all'istante come il sorgente di un crobot.
è poi consigliabile identare e commentare abbondantemente il listato, spiegando la strategia della vostra creatura e il funzionamento delle routine principali: mettetevi nei panni di chi deve leggerlo. Come vi trovereste a dover decifrare del codice disordinato e senza la più piccola nota esplicativa? Potreste arenarvi su procedure che, con l'aiuto di un semplicissimo:

/* .....(Tutto quello che c'è all'interno di /*......*/ è solo un commento e non viene eseguito)....*/

vi sarebbero immediatamente chiare.
Infine, mentre è possibile impiegare indifferentemente lettere maiuscole e minuscole per i nomi delle variabili e delle procedure che andremo a definire (solo le prime sette lettere sono significative), le istruzioni proprie del compilatore vanno inserite in minuscolo.

Gli accessori esterni:

Si tratta di un set di quattro programmi, scritti con lo scopo di facilitare le fasi di sviluppo e di test di un crobot.
 
PPC di Marco Giovannini: preprocessore di comandi per crobots.
Torneo2k di Michelangelo Messina: potente gestore di tornei, in grado di far disputare competizioni sia in modalità 4vs4 che f2f.
Count di Simone Ascheri e Michelangelo Messina: analizzatore di report per Crobots. Per ora è l'unico a supportare l'assegnazione dei punteggi in modalità Pranzo.

CrobotsHelper di Marco Pranzo: coordina il lavoro dei programmi di cui sopra.

E.C.A.T. ovvero Enhanced Crobots Auto Trainer:dalla mente malata del sottoscritto e dalla geniale tastiera di MichelangeloMessina uno strumento per il fine tuning dei parametri dei crobot. Richiedela presenza di PPC 0.9.

Crutils di Maurizio "Joshua" Camangi: insieme di utilities per la gestione di un torneo.

Dal momento che non mi sembra ci sia altro da aggiungere, possiamo passare senza indugio ad...

Analizzare il nostro primo Crobot:

è un crobot molto semplice e anche molto ben commentato. Un grazie all'autore, che probabilmente non immaginava l'impiego della sua opera in questo tutorial.
Analizziamolo un pò in dettaglio (i numeri di linea non fanno parte del programma e non devono essere inseriti:sono stati aggiunti per facilitare la spiegazione):
 

  • Le linee dalla 1 alla 7 sono dei semplici commenti, il compilatore le ignora
  • Alla linea 8 sono dichiarate le variabili: è INDISPENSABILEfarlo nella procedura principale (pena strani e incomprensibili malfunzionamenti del crobot), mentre per le sub-routine è solo facoltativo.
  • Alla linea 9 inizia il programma vero e proprio: mentre i nomi di tutte le procedure possono essere scelti arbitrariamente, il corpo principale DEVE chiamarsi
  • Le linee 11 e 12 scelgono casualmente, tramite la funzionerand(), alcuni parametri (la direzione di marcia e il puntamento del cannone)
  • La linea 13 inizia un ciclo senza fine: tutto ciòche sta tra le parentesi graffe delle linee 14 e 31 viene ripetuto fino alla distruzione del robot o al termine della partita. Questo accade perchè l'istruzione while(1) è sempre vera: per interrompere il loop bisognerebbe infatti che l'espressione tra parentesi fosse nulla, ma essendo il numero 1 una costante, non può mai assumere valore 0.
Per ora tutto chiaro vero? Dopotutto fino a questo si tratta di banalissime istruzioni in C standard. Ma adesso viene il bello. Stiamo per analizzare quei comandi che ci permettono di controllare ilnostro crobot, e di rendere il suo comportamento diverso da quello di qualsiasialtro combattente in circolazione:
  • Troviamo infatti per prima cosa le funzioni loc_x() e loc_y(). L'arena è un quadrato di lato 1000 unità con l'origine degli assi (il punto 0,0) fissata nell'angolo in basso a sinistra (esattamente come nel piano cartesiano standard). Le 2 funzioni restituiscono un valore compreso tra 0 e 999 che corrispondenti al punto in cui si trova il nostro robot all'interno del campo di battaglia.
  • Alla linea 24 incontriamo la funzione scan(ang,ampiezza):rappresenta gli occhi del nostro robot. Essa è in grado di individuare i robot nemici guardando nella direzione che le indichiamo con ang e conl'apertura che scegliamo. Più l'ampiezza è elevata (puòessere di 10 gradi al max alla destra e alla sinistra della direzione scelta,per un totale di 20 gradi) più è probabile trovare il nemico,ma anche meno facile centrarlo con un proiettile. La funzione restituisce un numero intero compreso tra 1 e 999 che rappresenta la distanza a cui è stato individuato il nemico, oppure 0 se non è stato trovato nulla.
  • La linea 25 controlla che ci sia un nemico: in effetti è persino troppo lunga. In caso fossimo a corto di spazio per il codice l'espressione if (range) sarebbe una adeguata sostituta.
  • Le linea 27 spara al nemico nella direzione scelta e con la gittata che abbiamo ricavato dalla scan(). È importante ricordarsi che l'arena ha lati di 1000 metri: il nemico può quindi essere distante da noi fino a 1440 unità, mentre la massima distanza acui il proiettile è efficace sono 700 metri. Pertanto, se la scan() trova un nemico lontano da noi 900 unità è inutile fare fuoco.
  • La linea 28 è inutile: il cannone deve avere il tempo di ricaricarsi dopo aver esploso un colpo. A questo proposito il manuale di Crobots per AMIGA riporta una tabella dei tempi richiesti dalle varie funzioni che non è presente nella versione Dos/Linux. Eccola qui.
    •  
      Azione Cicli di CPU
      Ricarica PPC150
      Accelera/Decelera 10%10
      Pulse Travelling 50 metri10
      Il robot si muove di 7 metri a velocità 1001


    Leggetela attentamente perchè vi sarà molto utile in futuro, soprattutto quando esamineremo le routine di fuoco derivate da Tox.r

Un paio di considerazioni:
Erica.r è un ottimo programma per imparare le basi di Crobots, ma non aspettatevi di riuscire a vincere con esso una partita contro i combattenti moderni.
Innanzitutto si muove a caso nelle zone centrali dello schermo, e quindi è predisposto a ricevere colpi da tutti gli altri concorrenti.
In secondo luogo la routine di fuoco è assolutamente primitiva. Non effettuando correzioni né sull'angolo né sulla distanza di sparo è assolutamente probabile che quando il proiettile raggiunge l'obiettivo, questo non sia più lì.
A questo proposito il manuale riporta questa tabellina dei casi in cui un crobot può subire dei danni:
     
    Situazione Danni
    Collisione contro il muro o con un nemico (spegne il motore)2%
    Missile che cade a 40 metri3%
    Missile che cade a 20 metri5%
    Missile che cade a 5 metri10%


Prestate attenzione particolarmente al primo punto. Se il vostro crobot si blocca vicino ad un lato o nel mezzo dell'arena potrebbe essere quella la causa.

Comunque direi che è ora di mettere da parte Erica.r per passare a studiare un crobot che supera i limiti che ho evidenziato finora.  è il momento di esaminare...

...Il mio crobot preferito: Arale.r:

Questo programma è per molti versi il mio ideale di crobot:
Innanzitutto ha una presentazione simpatica e divertente.
In secondo luogo è versatile: non si fossilizza su una posizione, ma è programmato per poter spaziare in tutti i quattro angoli dell'arena a seconda della locazione in cui nasce.
Infine i suoi autori sono tra i pochi in circolazione che non battono sentieri ormai consolidati ma si sforzano di esplorare strade sempre nuove.
L'unico difetto è il sorgente scarsamente commentato.

  • La main() è composta da 5 blocchi, di cui i primi 4 sono strutturalmente identici: descrivono infatti il comportamento del robot in relazione al quadrante in cui è posizionato. Le linee tra la 39 e la 54 si riferiscono all'angolo Nord-Est.
  • Le linee dalla 42 alla 45 posizionano Arale.r nel punto da cui inizierà il suo movimento oscillatorio
  • Alla 46 inizia un loop, che dura circa 100000 cicli virtuali di CPU. Si arresta quando la variabile "pazienza" raggiunge il valore 0 (false).
  • Le linee tra la 48 e la 51 forniscono il moto oscillante al Crobot e richiamano le due funzioni di sparo di cui è dotato. Questa strategia consente di essere sufficientemente mobili da non diventare facilibersagli dei nemici che girano nello schermo, ma anche di rimanere lontanida quelli che si annidano in un angolo e aspettano gli avversari. Le continue inversioni di marcia poi, rendono più difficile il calcolo del terzo punto di fuoco tramite interpolazione.
  • Terminato il ciclo di attesa le linee 53 e 54 portano Arale alle coordinate (900,500), per iniziare la fase finale di attacco.
  •   Vedi la prima parte: l'angolo è quello Sud-Est
  •   Vedi la prima parte: l'angolo è quello Nord-Ovest
  •   Vedi la prima parte: l'angolo è quello Sud-Ovest
  • Quest'ultimo blocco della main() è quello che si occupa dell'attacco finale. Indipendentemente dal numero dei sopravvissuti,o dal livello dei danni personali subiti, Arale va allo sbaraglio. Non sarebbe male invece fare almeno un conto del numero degli avversari rimasti in campo. Vedremo poi con Goblin come questo sia possibile, nonostante non esista nel compilatore una funzione apposita.
  • Il ciclo è infinito: quando inizia la fase finale Arale non può più pentirsi e tornare indietro.
  • La strategia consiste nel muoversi parallelamente all'asse delle ascisse avanti e indietro alla massima velocità (linee 5 e 9)
  • Le routine di fuoco utilizzate sono di nuovo due: La gupi_gupi(),per lo sparo veloce, che viene impiegata solo mentre il crobot rallenta, e un'altra, senza nome, che trovate alle righe 6 e 10.
  • Quest'ultima cerca di combinare la rapidità e la precisione del tiro: il range viene ricavato pochi istanti prima che il proiettile parta, mentre l'angolo di fuoco viene corretto 'al volo'aggiungendo e sottraendo il risultato di due scan() successive effettuate intorno alla direzione scelta.
  • La hoyohoyo() è la routine di fuoco più precisa di cui dispone Arale. è anche molto compatta, e questo a volte può rivelarsi un inconveniente: è infatti possibile che quando viene trovato un nemico il cannone non sia ancora pronto per sparare, perdendo così l'opportunità di danneggiare l'avversario.
  • Il funzionamento è semplice: se la linea 6 trova un robot abbastanza vicino le linee tra la 7 e la 12 cercano di puntarlo con maggiore precisione riducendo l'ampiezza della scansione, e poi fanno fuoco.
  • Se invece un nemico non c'è, la linea 10 prova a cercarlo nei 20 gradi successivi.
  • Se neanche questa volta si è avuto successo lo scan() si sposta in avanti di altri 20 gradi.
  • La gupi_gupi() è la routine di attacco veloce: non effettua alcuna correzione né sull'angolo né sulla distanza. Per questo viene usata solo in condizioni particolari come il rallentamento prima di cambiare direzione. Dal momento che il cambio di direzione è consentito solo a velocità inferiori alle 50 unità, il ciclo di while() viene eseguito fino a quando la funzione speed() non ritorna un valore minore di 49. Questo dà il tempo di richiamare la funzione di fuoco almeno una mezza dozzina di volte.
Benissimo, se siete arrivati a leggere fino a questo punto probabilmente siete interessati a programmare un crobot. Arale è certamente un ottimo combattente, tant'è vero che è riuscito a piazzarsi quarto nel torneo del 1997.
Presenta tuttavia ancora delle limitazioni:
  • Innanzitutto non controlla mai se il suo angolo è occupato.
  • Non tiene conto dei danni che subisce.
  • Non si cura di quanti nemici sono in circolazione prima di attaccare.
  • E infine  la routine di fuoco ha ancora il problema del caricamento del proiettile.
Supereremo i primi tre problemi esaminando Goblin.
Ora invece è opportuno che abbiate qualche nozione sulle routine di sparo più precise che si trovino al momento in circolazione.
Vediamo un pò di che si tratta.

Le routine di fuoco:

 
Esse risolvono una volta per tutte il problema del cannone scarico, a prezzo però di un elevato ingombro in termini di codice e di tempo macchina.
Nella loro versione originale sono state inserite nel 1995 nel Crobot Tox.r.
Da allora hanno subito solo modifiche marginali e sembra proprio che allo stato attuale delle cose nessun programmatore che aspiri alla vittoria possa farne a meno.

  • Il blocco di sei scan() qui sopra, e il suo gemello posto immediatamente sotto, hanno una duplice funzione: ridurre l'ampiezza della ricerca per ottenere dei risultati sempre più accurati, e fornire una temporizzazione efficace. Infatti il compilatore non ha alcuna istruzione per permetterci di conoscere quanto tempo è trascorso da una certa operazione in poi. Bisogna quindi simulare tale funzione.
  • Se viene trovato nuovamente un nemico, le informazioni relative a distanza ed angolo vengono memorizzate, dopo di che si procede a raffinare nuovamente la ricerca come nel punto precedente.
  • Adesso, conoscendo la posizione del nemico in un dato momento e il suo spostamento dopo un certo periodo, è possibile interpolare angolo e distanza per sparare poi nella posizione dove è più probabile si sia traferito. è il compito che svolgono le due linee qui sopra.
    Per sapere da dove arrivano i calcoli effettuati in queste due linee, si deve seguire questo interessante link.
  • Dato che è comunque possibile che il cannone non sia ancora carico quando siamo pronti a sparare, la while ripete l'operazione fino a che il proiettile non parte.
  • Questo è il primo dei tre blocchi che, in caso di assenza di nemici nel punto iniziale, ampliano la ricerca nei 20 gradi circostanti.
Quella sopra, e la sua variante per gli spari da fermo, sono senz'altro delle routine eccezionali. Tuttavia mirare bene non basta per vincere: serve anche una buona strategia durante l'incontro e soprattutto un buon attacco finale.

Gli attacchi finali:

 
Le routine finali che esaminiamo provengono da due partecipanti all'edizione 1999 del torneo di Crobots.
La prima è un'evoluzione dell'attacco di Arale.r realizzata dal solito Daniele Nuzzo.
La seconda è completamente nuova. Si trova nel crobot iLbEsTiO.r e si è dimostrata efficacissima negli scontria singolar tenzone. Una sua versione più cattiva è implementata in Satana.r,ma essendo questo un robot realizzato esclusivamente per il f2f, preferisco analizzare il primo.
Ambedue le routine impiegano le Toxiche come funzioni di fuoco.

Stealth attack:

La funzione di attacco di Stealth.r è concettualmente molto semplice, ma nonostante ciò è efficacissima.
Quando il robot scopre di avere un unico avversario si porta al centro dell'arena. Inizia quindi ad oscillare orizzontalmente lungo tutta l'ampiezza del campo di battaglia, sparando con una funzione Tox-like.
Se in un solo passaggio subisce più del 20% di danni accorcia l'oscillazione.
La funzione di fuoco non è la Toxica originale,bensì una delle sue implementazioni più letali: la fire() di Coppi.r (1998) leggermente modificata per aumentarne ulteriormente l'efficienza.

iLbEsTiO attack:

Qui le cose iniziano a complicarsi un pò:
la funzione di attacco è micidiale, ma è anche assai ostica.
Dunque....... durante i rallentamenti (frena()) la variabile flag viene posta uguale a tre: ciò permette al crobot di eseguire il ciclo di attacco al massimo 3 volte consecutive, prima di cambiare direzione.
Quest'ultima viene calcolata considerando l'angolo formato con il crobot da attaccare.
Se però il crobot si avvicina troppo ad uno dei bordi non attende che il contatore arrivi a zero, bensì rimbalza con un angolo prefissato e reimposta a 3 il flag.
Lo scopo di questi frequenti cambi è ovviamente quello di disorientare le routine di fuoco avversarie, specie quelle che cercano di interpolare la nuova posizione del bersaglio.

Come già detto tutto questo non basta ancora. Una buona routine finale è senz'altro un tassello importante, ma il comportamento nella fase centrale dell'incontro è fondamentale. A questo punto dovete andare avanti da soli. Tuttavia, esaminando i lavori di altri programmatori, è possibile farsi un'idea sulle strade da seguire.
È dunque venuto il momento di cedere........

La parola agli autori:

Avendo la possibilità di chiedere la collaborazione di tre programmatori che hanno modificato e impiegato le Tox-like in modidecisamante efficaci ho quindi deciso di farvi leggere cosa dicono del comportamento delle loro creature.
Loro sono Maurizio Camangi, Alessandro Carlin e Daniele Nuzzo, creatori di Jedi.r, Sottolin.r e Goblin.r

Maurizio Camangi

è senza dubbio il più appassionato crobotic che io conosca.
Le sue opere hanno sempre quel qualcosa che riesce adistinguerle dalla massa. Un talento raro,  forse resosi necessario a causa di un piccolo vezzo di questo simpatico giocherellone: chiama isuoi robot TUTTI con lo stesso nome ormai da anni. Infatti fino ad oggi si sono succedute almeno 6 generazioni di Hal9000.r.
Strategia di Jedi.r:
Si sposta nell'angolo a sud-est del campo di battaglia.
Oscilla a ovest ed a nord, restando vicino all'angolo.

La funzione di fuoco in movimento è piuttosto complessa e si basa sulla correzione dell'angolo e della gittata in base allo spostamento proprio e dell'avversario, ispirata dal crobot TOX.
Dopo un numero prefissato di cicli JEDI attacca un crobot utilizzando una routine tratta dal crobots LEADER.

NOTE IMPLEMENTATIVE

Il cuore del programma risiede nella funzione di fuoco TOX-like.
Una semplice aggiunta ha permesso a JEDI di incrementare la sua efficienza contro i robot statici o che oscillano in brevi spazi: subito dopo il primo

la cannon() senza alcuna correzione nell'angolo e nella gittata permette, paradossalmente, la precisione contro robot che oscillano in brevi spazi, contro il quali, la TOX-fire è poco efficace.
 La caratteristica saliente di questo robot è il movimento a "J" nel corner a sud-ovest del campo di battaglia, che lorende un bersaglio abbastanza difficile. Purtroppo i cambi di direzionesono molto frequenti e questo fatto incide negativamente nella precisionedi tiro. Dopo 150 oscillazioni, se i danni non superano l'80%, JEDI attacca con una routine tratta dal forte crobots americano LEADER. Tale routine è ottima per scontri a due robot, per questo motivo non sarebbe una cattiva idea aggiungere una routine che rileva il numero di robot superstiti allo scadere dei 150 cicli e prendere la decisione più idonea.
 JEDI è stato considerato, e ciòmi fa molto piacere, un programma "elegante" e dalla buona strategia. Laresa in torneo non è stata ottima ma nonostante ciò alcuni crobotters hanno tratto spunto da questo robot. Una delle pecche di JEDIè il   limite di oscillare sempre nello stesso angolo: spaziare nei quattro quadranti dell'arena di gioco renderebbe JEDI un combattente certamente più valido. Un'altra possibile miglioria potrebbe risiedere nel cercare di tenere il robot più vicino possibile ai bordi dell'arena virtuale durante l'oscillazione, aumentando la sicurezza; per contro quest'ultimo accorgimento non è compatibile con la funzione di fuoco, molto precisa ma piuttosto ingombrante sia in termini di codice che di tempo di esecuzione (cicli CPU).

Alessandro Carlin

Arrivato secondo nel 1996 e terzo l'anno scorso Alessandro quest'anno ha due prototipi che sembrano veramente formidabili. Per adesso si limita a parlarci del suo Uomo Invisibile.

Nome del crobot: ________.r - The invisible man
                 (nel torneo 1998 ha partecipato col nome "sottolin.r" per
                  motivi estetici (?))
Dopo due anni in cui avevo spedito crobots tra loro molto simili (Rudolf e Rudolf_2) con buoni risultati, la strategia è cambiata radicalmente: The invisible man si porta innanzitutto nella parte bassa dell'arena, e si guarda rapidamente a destra e a sinistra per decidere dove andare, scegliendo l'angolo libero (sperando che almeno uno lo sia);durante il match non lascerà la posizione se non per l'attacco finale.
Nell'angolo il crobot oscilla verticalmente o orizzontalmente,e la scelta viene effettuata osservando i due angoli adiacenti: se quello superiore è vuoto, il moto avviene in direzione verticale, altrimenti in orizzontale (________.r non stà mai fermo). La larghezza dell'oscillazione è di circa 200 metri.
Questo tipo di movimento è stato ispirato da Diabolik.r.
Durante il match il crobot spara usando due routine:la prima presa da Hal9000 dell'anno precedente (di Hal ce n'è uno all'anno) molto precisa ma anche lenta e macchinosa viene usata durante l'allontanamento dall'angolo e all'inizio del movimento di ritorno,la seconda è molto più semplice ma più rapida da eseguire,quindi The invisible man riesce ad avvicinarsi al muro con più sicurezza, senza sbatterci il naso (evitando così un 2% di danni a botta).
Durante l'incontro il crobot conta di tanto in tanto i nemici e se ne trova uno solo lo attacca oscillando a destra e sinistraper tutta la larghezza del campo, a metà altezza. Questo modo di attaccare è stato ispirato da Arale.r ed è solo stata migliorata la routine di sparo con una semplice correzione sul range.
Purtroppo ho scoperto in seguito che l'efficienza del robot sarebbe aumentata se anche nella fase di attacco avessi usatola routine di sparo "macchinosa" di Hal9000, con conseguente risparmio di spazio e, forse, la possibilità di far cambiare angolo al crobot durante l'incontro senza sfondare il tetto delle 1000 istruzioni macchina.
C'è da dire che se entrambi gli angoli sono occupati, ________.r preferisce oscillare orizzontalmente, e questa scelta è stata motivata dal fatto che l'altro mio crobot Vision.r si comporta in maniera simile nella parte NORD dell'arena; in questo modo i due crobot si intralciano tra loro il meno possibile.
Il fatto che i due crobot siano UGUALI a parte il posizionamento iniziale, e che uno sia arrivato terzo e l'altro ben più indietro testimonia come piccole variazioni influenzino anche pesantemente le prestazioni, anche in funzione degli avversari.
Quindi prima di spedire i vostri gioiellini guerrieri testateli bene e, attenzione, perchè Cyborg.r è in agguato e Rudolf.r sta per reincarnarsi per la quarta (!) volta.

Daniele nuzzo

Per quanti non sapessero chi è Daniele Nuzzodirò semplicemente che è uno degli autori di Crobot più geniali in circolazione: il suo B52.r ha rischiato di classificarsi al primo posto del 1995, piazzandosi dietro a Tox.r con uno scarto di pochi punti. Daniele si è rifatto nel 1997  vincendo con Diabolik.r , e ha bissato poi  (primo nella storia della competizione) il successo nel 1998, anno in cui ha dominato portandoGoblin.re Tornado.r in vetta alla classifica.
Vale quindi senza dubbio la pena leggere quanto ci scrive della sua invincibile creatura:

All'inizio del gioco i crobots in gara sono ben quattro!è quindi molto improbabile uscirne vincenti buttandosi immediatamente in un attacco kamikaze; dopo tutto si può sparare contro un avversario alla volta, mentre si potrebbero incassare tre proiettili nello stesso tempo: non conviene! I crobots sono collocati in maniera casuale all'interno dell'arena, ma se dividiamo il campo di gioco (1000x1000) in quattro quadranti (500x500) ogni crobots si troverà in un quadrante diverso dagli altri; quindi inizialmente il posto più sicuro nell'arena è l'angolo più vicino, cioè quello del proprio quadrante. Goblin infatti lo raggiunge subito:

  • sx(), dx(), dw(), up() servono a spostarsi  rispettivamente verso sinistra, destra, in basso ed in alto finchè non si raggiunge il perimetro del campo.
A questo punto si deve scegliere una strategia di gioco per la fase iniziale (quella in cui ci sono 3 avversari); Goblin adotta la seguente:
  •  controlla l'angolo adiacente in direzione della parete verticale e se è libero lo raggiunge;
  •  rimane fermo nell'angolo finchè non viene colpito con una certa precisione (almeno 5% di danni) oppure finchè un altro crobots si avvicina entrando nel quadrante;
  •  cambia angolo andando in uno dei due adiacenti: in quello in verticale se non c'è nessuno, altrimenti in quello in orizzontale;
  • UpDown() restituisce true(1) se non è stato possibile spostarsi nell'angolo adiacente in alto o in basso, perchè era occupato da un avversario. Move() esegue lo spostamento nell'angolo adiacente a sinistra o a destra
Durante tutto il match Goblin controlla quanti avversari sono rimasti e se è solo uno lo attacca passando alla fase finale del gioco. Il controllo viene effettuato utilizzando la funzione Radar(),che è chiamata quando per oltre 15 volte consecutive il robot nemico individuato si trova a distanza superiore a 700, cioè fuori dal bersaglio.

  • La scansione viene effettuata a partire da 10 e non da zero per cercare di non cadere nel bug sull'asse zero: scan(0,10) non vedei crobots che si trovano tra -10 e -1!!! Per sicurezza inoltre viene esplorata due volte tutta l'arena. Inoltre si aspetta 16 volte prima di utilizzare Radar() per lo stesso problema del bug (senza sarebbero sufficienti 4 volte)e per evitare i casi in cui 2 o 3 crobots avversari sono allineati nella stessa direzione; se dopo 16 volte sono ancora allineati, allora probabilmente saranno molto danneggiati a causa della vicinanza ed è quindi auspicabile comunque un attacco.
ATTACCO FINALE:

La routine di attacco finale prevede l'utilizzo delle due grandi diagonali e si utilizza un piccolo accorgimento: il crobot non va mai incontro ad un avversario che si trova in un angolo; infatti dopo aver percorso metà diagonale (il crobots si trova più o meno nel centro dell'arena) si controlla che l'angolo in cui si sta per andare sia libero, in caso contrario si cambia la diagonale di attacco. Questo movimentoè ideato per cercare di mantenere il più possibile la massima velocità e per cercare di fare variare maggiormente l'angolo di fuoco all'avversario: è decisamente più semplice trovare la distanza giusta piuttosto che l'angolo!!!

  • q naturalmente rappresenta il quadrante; c'è anche un altro piccolo accorgimento che permette di combattere contro 2 avversari: infatti quando l'angolo è occupato si sceglie in quale direzione cambiare diagonale controllando che sia libera e che quindi non ci sia un secondo nemico
ROUTINE  DI FUOCO:

Le routine di sparo appartengono alle cosiddette toxiche (da Tox.r o anche dall'effetto letale o tossico che producono), anche se in realtà a Tox.r devono soltanto un miglioramento (di sicuro in lunghezza di codice e forse anche in efficienza) della routine di puntamento che in Lazyii.r, il vero ideatore di tali routine, si chiama Find(). Permaggiori spiegazioni si consiglia vivamente di fare riferimento ai sorgenti di questi due crobots. In breve si può dire che appartengono alla categoria delle ruotine di fuoco che fissano due punti in cui avvistano il robot avversario e cercano di calcolare un terzo punto in cui sparare. A differenza di altre routine utilizzano una procedura di puntamento che avviene in tempo costante (in Lazyii) o quasi (in Tox) e si avvalgono di una formula per il calcolo del terzo punto molto efficace. Per la cronaca,forse il difetto della routine di puntamento di Lazyii era l'eccessiva precisione, che di tanto in tanto portava alla perdita del bersaglio.

CONSIDERAZIONI:

è sicuramente importante attaccare per primi contro l'ultimo avversario e infatti Goblin cerca di farlo, ma è altrettanto importante difendersi bene: in caso di attacco 1 contro 1, Goblin oscilla lungo una parete verticale e, essendo attaccato, non ha bisogno di portarsia tiro dall'avversario; inoltre se la parete è quella ad est allora l'avversario di tanto in tanto si perderà il bersaglio per via del bug: una situazione accettabile!

Le Toxiche sono molto efficaci, ma soffrono tremendamente i movimenti oscillatori rapidi (introdotti da B52.r): le inversioni di movimento e le accelerazioni continue tendono a spiazzare le routine che cercano un terzo punto. D'altra parte le routine di fuoco utilizzabili nelle oscillazioni brevi devono essere necessariamente veloci, altrimenti le oscillazioni non sarebbero più tanto brevi ed inoltre si rischierebbe di andarsi a spalmare sulle pareti dell'arena; infine quando un crobots diminuisce la velocità diventa un facile bersaglio anche per le routine di fuoco più semplici che non utilizzano particolari correzioni. Un dualismo che probabilmente si riproporrà anche quest'anno o forse uscirà qualcosa di nuovo (sono 4 anni che non si fanno progressi significativi in tal senso)?

Abbiamo parlato di attacco e di routine di fuoco, ma non si deve dimenticare che la cosa più importante è probabilmente la strategia iniziale. Al lavoro dunque e in bocca al lupo...

Conclusioni:

Che altro aggiungere?
Niente, Daniele è stato chiarissimo.
Ormai avete tutto il necessario per costruirvi in casa il vostro robot. Sapete anche in quale direzione lavorare.... potreste essere voi a migliorare le inossidabili Toxiche!
Ribadisco solo che Goblin.r nel 1998 ha vinto con oltre 8 punti percentuali di vantaggio sul secondo (sempre della scuderia di Daniele) e ha lasciato il terzo a ben 14 punti di distanza.
Mettetevi al lavoro, vi aspettiamo al torneo!!!!!!!!

Simone Ascheri