/* _ ,;;; K A K A K A T Z ' 9 9 .;;||:. :;;|||:: Y 2 K - C R O B ,;;;;;||::. ,;;;;;||||||:. T O U R N A M E N T ,;;;;|||||||||||. ,;;;||!!!!!!!|||||. ,;;;;|!!!!!!!!!||||| ;;;;!!!!!!!!!!!!||||| |;;;;;/~\!!!,'~\!!|||| :;;;;;| |!!| |!!||| :;;;;;;-._;!!`._/!!!!|`. |;;;;;;|||!!;;;!!||!!||| ____ |;;;;;|||!!;;;|||!!||,' ,- _ _`, |;;;|||!!!;;|||!!||/ ~-.__ /'/~; ; ; ) _--`;;;|||!!!;;|||!!,' "" __.--.\ | ( .---~~--._ _.-~:"" `:;|||!!;;;|||/' ".-~~ `.\ `. ((.;~---._ `-. ,' :"" `:|!!;;;;/' " ; :|. : ((;##### `-. :,' :"""" |!!;;;/ "" .' __ ;|| : #####| `; `-._ :"""" ||!!;/ "" .' .' ,:|| | ### | `. `-._:""""" `!!!: " : ';|| | ### . `-. `-._____.----'~~~`'`. '|"| | ### : `. ; .'"|| | ### ; `._ .'"||| | ### | ,-' `-._ _ / "|||| | ### ,-' |" `-._ `-. ,' "|||:| | ### ,' |"" `-.___ `. _/ "|||:::| `_ ###_.' |""""" `---'-____.' """|||||| ### `."""""""""""" """""""|||| ### |""" """""""""""""""""""""""|||""""| ### |"""""" """""""""""""""""""|||"""""| ### `.""""""""""""""""""""""""""""""__| ### `.""""""""""""""""""""____.---' \ /| ### `."""""""""____.----' //-\ |\ .|| ### `--.__,--' //|| \\ // \ //~| ||: ### / /\ \ // || \\ // \// :| |||. ### / / \ \ // || \\ //____.-/ :: \ |||||. ### //_____\ \// || \\/ :: ::|| ||||||| ### ~~| ~~\____/~\_.-~~ ::: ::|| |||||||| ### `. ::||| |||||||||||||. | || :||| |||||||||||||||||| ||| : ___ ::`|| |||||||||||||||||| `||:: `._ _.-':::::::::|| |||||||||||||||||| ||||| `-._ _.-' ::::::|' |||||||||||||||||| |||||:: `\/~' ::|' |||||||||||||' | `||||: \ | ||||||| ### ||:::: | | |||||/~~~~~~~~~ `||::: | |' |||| ### ||:::: | | ||| ### ||::::: | |' || `||::::: | | || |||::::: | | \ KakakaTz.R by AinTz (p)1999 Autore: Enzo Maritati "il telefono rosso, il telefono del cuore di rosso non ha niente piu' piuttosto sembra giallo tipo giallo limone ed io me l'aspettavo blu! una canzone d'amore invece nossignore per me d'amore non ce n'e' e mi trascino per casa con gli occhiali da sole domandandomi perche'.........." (Irene Grandi) *** TATTICA *** KakakaTz e' un robottino rompiscatole. Infatti prende possesso subito dell' angolino piu' vicino all'inizio dell partita. Resta cosi' fermo aspettando che qualcuno inizi ad ammazzarsi. Se qualche "pazzoide" cerca di avvicinarsi, Kak. prontamente lo attacca, aventualmente andandogli incontro e rubando l'angolino lasciato vuoto dallo sprovveduto attaccante. Appena muore il primo sfortunello nell'arena, Kak. si guarda intorno e, se vede ad un angolino adiacente ai suoi un robottino pressocche' statico, gli si avvicina (ogni volta piu' precisamente), lo spara, e torna nel suo angolino. Questa ultima tecnica non e' seguita da iLbEsTiO (il mio secondo robottino) che si limita ad attendere con ansia in un angolino che qualcuno si avvicini o lo spari per reagire e muoversi. Se durante questo piccolo attacco, Kak. dovesse malauguratamente subire anche il minimo danno, cambia subito obiettivo andando a cercarsi un altro robottino statico. Nel caso in cui e' circondato da robottini vibranti o angolini vuoti senza nessuno da colpire , Kak. opta per trovarsi un altro angolino, magari vicino a qualche robottino statico. Nel momento in cui resta face-to-face con l'altro superstite nell'arena si preoccupa subito di uscire in attacco sfruttando una piccola routine che gli assicura di posizionarsi e camminare in modo tale da variare molto sia l'an- golo che la distanza a cui e' visto dall'avversario; contemporaneamente cerca di restare sempre abbastanza lontano dal suo nemico. Se (purtroppo) dovesse arrivare a scontrarsi faccia a faccia con l'ultimo ri- masto e di non avere sufficiente energia per affrontare lo scontro, Kak. sceglie di scappare di angolino in angolino restando sempre a molta distanza dal suo nemico. Il comportamento, in difesa e in attacco e' molto simile al robottino iLbEsTiO rispetto al quale, pero', attacca anche in presenza di due avversari rimasti nell'arena. *** PARTICOLARITA' *** Alcune piccole innovazioni rispetto ai robottini "standard" visti fino al 1998: 1) quando Kak. va verso un angolino ci si attacca a massimo 7-8 metri di di- stanza. 2) le routine di fuoco soffrono del "bug zero" molto meno di quelle da cui de- rivano. Anche nel caso si debba puntare un robottino a 0 gradi precisi, Kak. lo vede e lo spara subito o lo rintraccia subito dopo! 3) la procedura di fuoco di goblin, derivata da tox, ha la miglioria che, nel caso ci si trovi a sparare sotto i 120 metri, lo si fa subito senza nessuna superflua correzione. Tutti i parametri sono stati poi corretti ed adattati al movimento del robottino. 4) la procedura d'attacco si basa sulla posizione del nemico e non su movimen- ti fissati o predeterminati. 5) KakakaTz e' uno dei miei due robottini e quindi e' sicuramente innovativo e fuori-standard! ulteriori commenti e chiarimenti nel codice... *** RINGRAZIAMENTI *** La lista dei ringraziamenti penso non avrebbe fine, quindi ne faccio un elenco breve e conciso: Dario per avermi accompagnato, svezzato, aiutato, supportato, sopportato, incoraggiato in questa avventura; Maurizio, Simone, Michelangelo, Alessandro, Daniele e tutti gli amici della mailing list di Crobots per i consigli, la pazienza e la simpatia; Zac, Pippi, Panda, Pici, Gianvy ed Emilio per aver sopportato ore ed ore di vaneggiamenti sui robottini; il mio picci' per il fedele accompagnamento; il Salamino per le notti passate insieme anche a fare robottini; GianMa & Anna per la notte passata a programmare un robot- tino che a stento raggiungeva il 5% di efficienza; tutti i vecchi programmato- ri di Crobot, senza i quali, forse, non saremmo qui oggi. Naturalmente non posso esimermi dal ringraziare i miei due robottini: iLbEsTiO e KakakaTz per- che', nonostante tutte le modifiche subite e i gravissimi rischi corsi duran- te i sanguinolenti scontri che gli ho fatto sopportare non mi hanno ancora mandato a cagare. Grazie a tutti i nostri amici di Lecce che, con il loro aiuto e la loro pazienza, ci hanno spinto a creare robottini sempre migliori, per poter gareggiare anche contro di loro! Un grazie finale a "Pigghiate la Quagghia" Matteo per avermi fatto ricordare di ringraziare i miei robottini. Un forte grazie ad Irene Grandi per averci allientato ore ed ore di programmazione. Un ultimo pensiero va verso il multitasking di Windows che mi ha permesso di veder riavviare il mio computer svariate volte (grazie Bill!!!) Ora che ci penso.... come fare a dimenticare anche l'Enel, senza la quale avremmo dovuto pedalare chilometri e chilometri per poter tenere acceso il computer durante lo sviluppo; grazie (sempre all'Enel) anche per l'immancabi- le sbalzo di tensione che trasformava il mio Pentium III in un 286 e poi in un Pentium IV (ma solo per un microsecondo). Vorrei infine ricordare la mia vec- chia tastiera, che, dopo mesi e mesi di pestaggi vari, ha deciso di passare a migliore vita; mi mancherai piccolina! (adesso ha deciso di fare il modem). Un grazie infine (giuro che e' l'ultimo) alla Nutella, fonte inesauribile di ispirazioni... perche' bastava pigiare una lettera per tirare fuori 12-13 comandi grazie alle incrostazioni nella mia vecchia tastiera (ed anche un po' nella nuova). Grazie anche alla mia sedia ergonomica che, di giorno in giorno mi risparmia la sciatica e la scoliosi. Grazie anche a te, che pur di riuscire a carpire un minimo elemento di questo "scigghio" di robottino sei arrivato a leggere anche quest'ultimo delirio... */ int oldang,range,ang,oldrng; /* angolo e distanza dell'avversario */ int dir; /* direzione in cui camminare */ int cambio,clock,disturbo; /* clock vale sempre 0 o 1, disturbo */ /* e' la distanza a cui arrivare a rompere le */ /* scatole e cambio serve per contare i robot */ /* nell'arena */ int sopra,destra; /* posizione nell'arena (valore 0 o 1) */ int flag,attacco; /* attacco puo' valere 0 o 1 e flag e' un */ /* contatore */ /******************************************/ /* */ /* Procedura Principale : */ /* */ /* Difesa ed Attacco */ /* */ /******************************************/ main() { int danni,dir2; /* danni = % danni subiti */ /* dir2 = variabile d'appoggio per dir */ /* va' all'angolino piu' vicino */ vai(270-180*(loc_y(vai(180*(loc_x()<(ang=500))))>(cambio=500))); /* ciclo principale */ /* - pausa nell'angolino */ /* - oscillazioni d'attacco in 3 */ /* - cambio angolino */ /* e, in caso, attacco finale */ while(1) { danni=damage(); while((damage()<(danni+4)) && (!oldrng || oldrng>550)){ /* robo-radar */ /* conteggio superstiti */ /* nell'arena */ if (cambio>10) { ang=712+180*sopra+90*(sopra^destra); cambio=(flag=24); while(flag && (cambio>17)) if (scan(ang+15*((--flag)%8),7)) --cambio; if (cambio/=21) { if (damage(++attacco)<90) /* attacco finale */ /* in caso di un solo superstite */ /* e con almeno un po' di energia */ while (drive(dir,100)) { serpiko(); if (--flag) if (loc_y()>700) frena(270); else if (loc_y()<300) frena(90); else if (loc_x()>700) frena(180); else if (loc_x()<300) frena(); else ; else frena(ang+135); } /* attacco finale */ /* ma con pochissima energia */ /* per affrontare lo scontro */ else while (1) vai(90+180*sopra); } else if (flag) ; else { /* disturbo quiete pubblica */ /* (attacco in caso di due superstiti) */ serpiko(attacco=(ang+=18+70*clock)); if (oldrng==range) { /* se vedi un robottino simil-statico */ /* attaccalo con una oscillazione */ /* verso di lui */ disturbo=1600-range; serpiko(vai((dir2=dir+90*((ang%360)>(dir+45))))); disturbo=0; vai((dir2+180)%360); if (damage(cambio=6)==danni) ; else danni=damage(clock^=1); } else if (range) clock^=1; else danni+=64; attacco=0; } } serpiko(1); } /* cambio angolino */ /* (usato solo in caso di pericolo) */ vai(dir+90*(scan(dir+8,10)>(scan(dir+82,10)))); } } /******************************************/ /* */ /* Procedura Di Cambio Angolino */ /* o di Oscillazione in difesa */ /* */ /******************************************/ vai(newdir){ int limh1,limh2,liml1,liml2; drive((dir=newdir),100); liml1=(limh1=140+disturbo)-131; /* limiti x e y per lo spostamento */ liml2=(limh2=860-disturbo)+131; /* e/o oscillazione in attacco a 3 */ /* alto */ if (dir==270) { while(loc_y()>limh1) serpiko(); if (disturbo) ; else { drive(270,50); while(loc_y()>liml1); sopra=0; } } /* basso */ else if (dir==90) { while(loc_y()limh1) serpiko(); if (disturbo) ; else { drive(180,50); while(loc_x()>liml1); destra=0; } } /* destra */ else { while(loc_x()50) ; return (dir=180*sopra+90*(sopra^destra)); } /******************************************/ /* */ /* Procedura Di Frenata */ /* contro un solo avversario */ /* */ /* Con sparo veloce senza particolari */ /* correzioni. */ /* */ /******************************************/ frena(newdir) { drive(newdir,(flag=4)); /* freno */ while (speed()>50) { /* finche' freno sparo (ma veloce) */ if (oldrng=scan(ang,10)) { if (range=scan((ang=(6*(scan((ang+=(10*(scan((oldang=ang)+10,10)>0)-5))+10,10)>0)-3)+ang),10)) cannon(ang+(ang-oldang),range+(range-oldrng)*2); } } return (drive((dir=newdir),100)); /* riaccelero */ } /******************************************/ /* */ /* Procedura Di Sparo Preciso */ /* */ /* Con e senza correzione sulla direzione */ /* in cui si cammina. */ /* */ /******************************************/ serpiko(fermo) { if (oldrng=scan(ang,10)); /* se non sto puntando un nemico */ else if (oldrng=scan(ang-=21,10)); /* ne cerco un'altro */ else if (oldrng=scan(ang+=42,10)); else return (ang+=42); if (oldrng<120) return (cannon(ang,oldrng)); /* se e' troppo vicino lo sparo subito */ if (attacco) ; /* se sto attaccando non cambio obiettivo */ else if (oldrng>735) { ang+=42; return ++cambio; } if (scan(ang-=5,5)); else ang+=10; /* affinamento del tiro */ if (scan(ang+5,2)) ang+=5; if (scan(ang-5,2)) ang-=5; if (scan(ang+3,1)) ang+=3; if (scan(ang-3,1)) ang-=3; if (scan(ang+1,1)) ang+=1; if (scan(ang-1,1)) ang-=1; if (oldrng=scan(oldang=ang,5)) { if (scan(ang+5,2)) ang+=5; if (scan(ang-5,2)) ang-=5; if (scan(ang+3,1)) ang+=3; if (scan(ang-3,1)) ang-=3; if (scan(ang+1,1)) ang+=1; if (scan(ang-1,1)) ang-=1; if (range=scan(ang,10)) if (fermo) return cannon(ang+(ang-oldang)*((1200+range)>>9),range*172/(172+oldrng-range)); else /* sparo senza correzione sulla direzione di movimento */ return cannon(ang+(ang-oldang)*((1200+range)>>9)-(sin(ang-dir)>>14),range*172/(172+oldrng-range-(cos(ang-dir)>>12))); } /* sparo con correzione sulla direzione di movimento */ } /* Tutto qui? Provare per credere!!! *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*. ... quante lacrime mi dai...? le stelle stanno in cielo ne dimostro di meno! i sogni non lo so... Non avevo pianto mai... ...so solo che sono pochi ... prima di essere uomo. quelli che si avverano. (D.Silvestri) (V.Rossi) ____ \%%%%%%;. \%%%%%%%%;.. .\. (%%%%%%%%%%%%;. .;%%%;. %%%%%%%%%%%%%%%%%;. %%%%%%%%; %%%%%%%%%%%%%%%%%%%%%;. %%%%%%%%%)__(%%%%%%%%%%%%%%%%%%%%%%%%;. ;%%%%%% /%%%%%\ %%%%%%%%%%%%%%%%%%%%%%%; \%% /%/'''\%%%\ %%%%%%%%%%%%%%%%%%%%%%%; '%%%%%%%\. \%%|/%%%%%%%%%%%%%%%%%%%%%%; %% .;%%%%%%%%%%\|%%%%%%%%%%%%%%%%%%%%%%%%%% %%% (%CCC%%%%CCC%\%%%%%%%%%%%%%%%%%%%%%%%%%/ %%%% %% !/ \%%%%%%%%%%%%%%%%%%%%%%/ %%%%%% .% %%% \%%%%%%%%%%%%%/'%%%%%%%%% .__\\/__. .%%% o o %%%% %%%%%%%%%%%/'%%%%%%%%%%% \.;%%%%%%%%%;.'%% %%%% ,%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%/ %___.!. /%%%% ,%%%%%%%% \%%%%%%%%%%%%% \%% %%% %%/ %%%%%%\ /%%%% ,%%%%%%%%% |%%%%%%%%%%%%% /%% %%% %% %%%%%%%)?**&%%%% ,%%%%%%%%%%; |%%%%%%%%%%%%% %% %%% %% %%%%%%%%%%%%%/ ,%%%%%%%%%%%/ /%%%%%%%%%%%%%% /%%% %%%%% %%% %%%%%%%;/',;/%%%%%%%%%;;../%%%%%%%%%%%%%%%%% %%%%%%/'''\%%%%%% ='''\\ \%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //'' ''\\ .o0O KakakaTz Rulez O0o. */