C R O B O T S       Main  Site
Home  ::  Download  ::  Tournaments  ::  King of The Hill ::  Screenshots
 
:: Yahoo!

:: Credits




Programmiamo'C' 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 delTorneoY2k 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 è uncompilatore ANSI 'C', non un videogioco interattivo!
Il duello con gli avversari umani è pertanto solomentale e per giunta a distanza. La sfida infatti consiste nel dotare ilnostro alter-ego digitale di routine che gli consentano di sopravviverenell' 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 comesi programma in C?
Niente panico. Questo articolo è stato pensatoproprio per quanti , nutrendo interesse per questa competizione, sono frenatidal timore reverenziale verso tale linguaggio.
E poi CROBOTS è nato proprio per scopi didattici,quindi siate ottimisti!

Nonostante il manuale del gioco presenti già unpaio di esempi, questi non sono né attuali (la crobotica negli ultimianni ha fatto passi da gigante) né particolarmente semplici perl' utente inesperto, in quanto utilizzano da subito tutte le strutturee 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 arrivarepoi, 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 svilupparele nostre temibilissime macchine da battaglia è ridotto ai minimitermini:
  • 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 'allenarè un Crobot.
Nonostante il programma abbia requisiti hardware veramenteminimali,  per lo sviluppo di un robot competitivo è caldamenteconsigliato l' impiego di un computer potente, in modo da poter testarea lungo e in tutte le situazioni il comportamento della nostra creazione.
Infatti, dal momento che l' andamento di una singolapartita 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, conalcune aggiunte che consentono un pieno controllo sul comportamento delrobot, 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ò ilnostro 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 parzialmenteil primo limite.
La gestione degli errori lascia a desiderare: nel casose ne verifichi uno (per esempio una divisione per 0) il compilatore resettasemplicemente tutte le variabili del programma e riinizia ad eseguirlodalla 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 generaredei 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. Questolimite, inizialmente non molto sentito (i primi robot arrivavano a stentoai 100 VB), è oggi l' ostacolo più grande contro cui si infrangonogli sforzi dei croboticisti, ma è anche grazie alla sua presenzache l' ottimizzazione delle routine ha raggiunto livelli incredibili. Soloper fare un esempio osservate l' evoluzione della procedura per il calcolodell' 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 ilpunto di partenza e quello di arrivo abbiano la stessa ascissa ci si trovadavanti a una divisione per 0, con il risultato di far ripartire il crobotdalla prima istruzione. L' evento è quantomai 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 risolvedue 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 iniziatea programmare, che il torneo vi attende.
Se invece, nonostante le procedure siano ben commentate,molti punti vi sono rimasti oscuri, non preoccupatevi minimamente. In seguitoogni 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 filecon estensione *.r, per permettere a chiunque di identificarlo all' istantecome il sorgente di un crobot.
è poi consigliabile identare e commentare abbondantementeil listato, spiegando la strategia della vostra creatura e il funzionamentodelle routine principali: mettetevi nei panni di chi deve leggerlo. Comevi trovereste a dover decifrare del codice disordinato e senza la piùpiccola nota esplicativa? Potreste arenarvi su procedure che, con l' aiutodi un semplicissimo:

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

vi sarebbero immediatamente chiare.
Infine, mentre è possibile impiegare indifferentementelettere maiuscole e minuscole per i nomi delle variabili e delle procedureche 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, scritticon 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: potentegestore di tornei, in grado di far disputare competizioni sia in modalità 4vs4 che f2f.
Count di Simone Ascheri e MichelangeloMessina: analizzatore di report per Crobots. Per ora è l' unico a supportare l' assegnazione dei punteggi in modalità Pranzo.

CrobotsHelper di Marco Pranzo: coordina il lavorodei 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 dellasua 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 inomi 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 finoalla distruzione del robot o al termine della partita. Questo accade perchè l' istruzione while(1) è sempre vera: per interrompere illoop 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 trattadi 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' originedegli assi (il punto 0,0) fissata nell' angolo in basso a sinistra (esattamentecome nel piano cartesiano standard). Le 2 funzioni restituiscono un valorecompreso 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 individuarei 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 restituisceun 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 conla gittata che abbiamo ricavato dalla scan(). è importante ricordarsiche l' arena ha lati di 1000 metri: il nemico può quindi esseredistante 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 tempodi ricaricarsi dopo aver esploso un colpo. A questo proposito il manualedi 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 velocita' 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 lebasi di Crobots, ma non aspettatevi di riuscire a vincere con esso unapartita contro i combattenti moderni.
Innanzituto si muove a caso nelle zone centrali delloschermo, e quindi è predisposto a ricevere colpi da tutti gli altriconcorrenti.
In secondo luogo la routine di fuoco è asolutamenteprimitiva. Non effettuando correzioni né sull' angolo nésulla distanza di sparo è assolutamente probabile che quando ilproiettile raggiunge l' obiettivo, questo non sia più lì.
A questo proposito il manuale riporta questa tabellinadei 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' arenapotrebbe essere quella la causa.

Comunque direi che è ora di mettere da parte Erica.rper 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 ilmio ideale di crobot:
Innanzitutto ha una presentazione simpatica e divertente.
In secondo luogo è versatile: non si fossilizzasu una posizione, ma è programmato per poter spaziare in tutti iquattro angoli dell' arena a seconda della locazione in cui nasce.
Infine i suoi autori sono tra i pochi in circolazioneche non battono sentieri ormai consolidati ma si sforzano di esplorarestrade sempre nuove.
L' unico difetto è il sorgente scarsamente commentato.

  • La main() è composta da 5 blocchi, di cui i pimi 4sono strutturalmente identici: descrivono infatti il comportamento delrobot 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 virtualidi CPU. Si arresta quando la variabile 'pazienza' raggiunge il valore 0 (false).
  • Le linee tra la 48 e la 51 forniscono il moto oscillante alCrobot e richiamano le due funzioni di sparo di cui è dotato. Questastrategia 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 continueinversioni 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 sioccupa dell' attacco finale. Indipendentemente dal numero dei sopravvissuti,o dal livello dei danni personali subiti, Arale va allo sbaraglio. Nonsarebbe male invece fare almeno un conto del numero degli avversari rimastiin 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 laprecisione 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ù precisadi cui dispone Arale. è anche molto compatta, e questo a volte puòrivelarsi un inconveniente: è infatti possibile che quando vienetrovato 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 robotabbastanza 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: noneffettua alcuna correzione né sull' angolo né sulla distanza.Per questo viene usata solo in condizioni particolari come il rallentamentoprima di cambiare direzione. Dal momento che il cambio di direzione èconsentito solo a velocità inferiori alle 50 unità, il ciclodi while() viene eseguito fino a quando la funzione speed() non ritornaun 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 puntoprobabilmente siete interessati a programmare un crobot. Arale ècertamente un ottimo combattente, tant' è vero che è riuscitoa 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 nozionesulle routine di sparo più precise che si trovino al momento incircolazione.
Vediamo un pò di che si tratta.

Le routine di fuoco:

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

  • Il blocco di sei scan() qui sopra, e il suo gemello postoimmediatamente sotto, hanno una duplice funzione: ridurre l' ampiezza dellaricerca per ottenere dei risultati sempre più accurati, e fornireuna temporizzazione efficace. Infatti il compilatore non ha alcuna istruzioneper 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 relativea 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 momentoe il suo spostamento dopo un certo periodo, è possibile interpolareangolo 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 siaancora 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 diassenza di nemici nel punto iniziale, ampliano la ricerca nei 20 gradi circostanti.
Quella sopra, e la sua variante per gli sparida fermo, sono senz' altro delle routine eccezionali. Tuttavia mirare benenon 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 partecipantiall' edizione 1999 del torneo di Crobots.
La prima è un' evoluzione dell' attacco di Arale.rrealizzata dal solito Daniele Nuzzo.
La seconda è completamente nuova. Si trova nelcrobot 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, preferiscoanalizzare il primo.
Ambedue le routine impiegano le Toxiche come funzioni di fuoco.

Stealth attack:

La funzione di attacco di Stealth.r è concettualmentemolto semplice, ma nonostante ciò è efficacissima.
Quando il robot scopre di avere un unico avversario siporta al centro dell' arena. Inizia quindi ad oscillare orizzontalmentelungo tutta l' ampiezza del campo di battaglia, sparando con una funzioneTox-like.
Se in un solo passaggio subisce più del 20% didanni 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 variabileflag viene posta uguale a tre: ciò permette al crobot di eseguireil 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 unodei 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 quellodi disorientare le routine di fuoco avversarie, specie quelle che cercanodi interpolare la nuova posizione del bersaglio.

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

La parola agli autori:

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

Maurizio Camangi

è senza dubbio il più appassionato croboticista cheio conosca.
Le sue opere hanno sempre quel qualcosa che riesce adistinguerle dalla massa. Un talento raro,  forse resosi necessarioa 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 è piuttostocomplessa 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 incrementarela sua efficienza contro i robot statici o che oscillano in brevi spazi: subito dopo il primo

la cannon() senza alcuna correzione nell'angolo e nellagittata permette, paradossalmente, la precisione contro robot che oscillano in brevi spazi, contro il quali, la TOX-fire e` 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 attaccacon una routine tratta dal forte crobots americano LEADER. Tale routineè ottima per scontri a due robot, per questo motivo non sarebbeuna 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ò alcunicrobottisti hanno tratto spunto da questo robot. Una delle pecche di JEDIè il  limite di oscillare sempre nello stesso angolo: spaziarenei quattro quadranti dell' arena di gioco renderebbe JEDI un combattentecertamente più valido. Un'altra possibile miglioria potrebbe risiederenel cercare di tenere il robot più vicino possibile ai bordi dell'arenavirtuale durante l'oscillazione, aumentando la sicurezza; per contro quest'ultimoaccorgimento non è compatibile con la funzione di fuoco, molto precisama  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 Alessandroquest' anno ha due prototipi che sembrano veramente formidabili. Per adessosi 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 loromolto simili (Rudolf e Rudolf_2) con buoni risultati, la strategia ècambiata radicalmente: The invisible man si porta innanzitutto nella partebassa dell' arena, e si guarda rapidamente a destra e a sinistra per decideredove 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 quellosuperiore è vuoto, il moto avviene in direzione verticale, altrimentiin 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'è unoall' anno) molto precisa ma anche lenta e macchinosa viene usata durantel' 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 tantoi nemici e se ne trova uno solo lo attacca oscillando a destra e sinistraper tutta la larghezza del campo, a metà altezza. Questo modo diattaccare è 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' efficienzadel robot sarebbe aumentata se anche nella fase di attacco avessi usatola routine di sparo "macchinosa" di Hal9000, con conseguente risparmiodi 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 sonooccupati, ________.r preferisce oscillare orizzontalmente, e questa sceltaè stata motivata dal fatto che l' altro mio crobot Vision.r si comportain 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 ilposizionamento 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 guerrieritestateli 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 dellacompetizione) 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 scrivedella sua invincibile creatura:

All'inizio del gioco i crobots in gara sono ben quattro!è quindi molto improbabile uscirne vincenti buttandosi immediatamentein un attacco kamikaze; dopo tutto si può sparare contro un avversarioalla volta, mentre si potrebbero incassare tre proiettili nello stessotempo: non conviene! I crobots sono collocati in maniera casuale all' internodell' arena, ma se dividiamo il campo di gioco (1000x1000) in quattro quadranti(500x500) ogni crobots si troverà in un quadrante diverso daglialtri; 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  rispettivamenteverso sinistra, destra, in basso ed in alto finchè non si raggiunge il perimetro del campo.
A questo punto si deve scegliere una strategia di giocoper 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 vienecolpito 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 possibilespostarsi nell'angolo adiacente in alto o in basso, perchè era occupatoda un avversario. Move() esegue lo spostamento nell'angolo adiacente a sinistra o a destra
Durante tutto il match Goblin controlla quanti avversarisono rimasti e se è solo uno lo attacca passando alla fase finaledel gioco. Il controllo viene effettuato utilizzando la funzione Radar(),che è chiamata quando per oltre 15 volte consecutive il robot nemicoindividuato si trova a distanza superiore a 700, cioè fuori dal bersaglio.

  • La scansione viene effettuata a partire da 10 e non dazero 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 esploratadue volte tutta l'arena. Inoltre si aspetta 16 volte prima di utilizzareRadar() 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 nellastessa direzione; se dopo 16 volte sono ancora allineati, allora probabilmentesaranno molto danneggiati a causa della vicinanza ed è quindi auspicabile comunque un attacco.
ATTACCO FINALE:

La routine di attacco finale prevede l'utilizzo delledue grandi diagonali e si utilizza un piccolo accorgimento: il crobot nonva mai incontro ad un avversario che si trova in un angolo; infatti dopoaver percorso metà diagonale (il crobots si trova più o meno nelcentro dell'arena) si controlla che l'angolo in cui si sta per andare sialibero, in caso contrario si cambia la diagonale di attacco. Questo movimentoè ideato per cercare di mantenere il più possibile la massimavelocità e per cercare di fare variare maggiormente l'angolo difuoco all'avversario: è decisamente più semplice trovare la distanza giusta piuttosto che l'angolo!!!

  • q naturalmente rappresenta il quadrante; c'è ancheun altro piccolo accorgimento che permette di combattere contro 2 avversari:infatti quando l'angolo è occupato si sceglie in quale direzionecambiare 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), anchese in realtà a Tox.r devono soltanto un miglioramento (di sicuroin lunghezza di codice e forse anche in efficienza) della routine di puntamentoche in Lazyii.r, il vero ideatore di tali routine, si chiama Find(). Permaggiori spiegazioni si consiglia vivamente di fare riferimento ai sorgentidi questi due crobots. In breve si può dire che appartengono allacategoria delle ruotine di fuoco che fissano due punti in cui avvistanoil robot avversario e cercano di calcolare un terzo punto in cui sparare.A differenza di altre routine utilizzano una procedura di puntamento cheavviene in tempo costante (in Lazyii) o quasi (in Tox) e si avvalgono diuna 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 control' ultimo avversario e infatti Goblin cerca di farlo, ma è altrettantoimportante difendersi bene: in caso di attacco 1 contro 1, Goblin oscillalungo una parete verticale e, essendo attaccato, non ha bisogno di portarsia tiro dall'avversario; inoltre se la parete è quella ad est alloral'avversario di tanto in tanto si perderà il bersaglio per via del bug: una situazione accettabile!

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

Abbiamo parlato di attacco e di routine di fuoco, manon 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 casail vostro robot. Sapete anche in quale direzione lavorare.... potresteessere voi a migliorare le inossidabili Toxiche!
Ribadisco solo che Goblin.r nel 1998 ha vinto con oltre8 punti percentuali di vantaggio sul secondo (sempre della scuderia diDaniele) e ha lasciato il terzo a ben 14 punti di distanza.
Mettetevi al lavoro, vi aspettiamo al torneo!!!!!!!!

Simone Ascheri
 
:: sign@e-mail Home  ::  Download  ::  Tournaments  ::  King of The Hill ::  Screenshots