/* ZZZZZZZZZZZZZZZZZZZZZZZZZZZOZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZOZZZZZZZOOZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZOOOOOOOOOZOOZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$$ZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZOOOOOOOOOOOZOZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$$$$$$ZZZZZZZZZZZZZZ ZZZZZZZZZOZZZZZZZOOOOOOOOOOOOOOOOZZZZZZZZZZZZZZZZZZZZZZ$$$777I77$$$ZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZOOOOOOOOOOZZOZZZZZZZZZZZZZZZZZZZZ$$77I?=?I7$$ZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZOZOOOOOOOOOOZZZZZZZZZZZZZZZZZZZZZZZZ$$$7I?..+I7$$$ZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZOOOOOOOOOOOOOOZZZZZZZZZZZZZZZZZZZZZ$$77I= .?I7$$$ZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZOOOOOZZZZZZZZZZZZZZZZZZZZZZZZZ$$$7I?,.~?I7$$$ZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZOZZZZZZZZZZZZZZZZZZZZZZZZZZ$$77I+..+I77$$$$ZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZOZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$7I?~.,?I77$$$$ZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$77I+..=?I7$$$$$ZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$7I?=..+I77$$$$$$ZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$77I?,.~?I77$$$$$$$$ZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$$7I?=..+I77$$$$$$ZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$77I?:.,?I77$$$$$$$Z$ZZZ$ZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$$77I+..=?I77$$$$$$Z$$ZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$$$77I?~..+II77$$$$$$$$$$$$$ZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$$$$77I+..:?I777$$$$$$$$$$$$$$$ZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$$$$77I?=..=?I77$$$$$$$$$$$$$$$ZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$$$$777I?,.,+I777$$$$$$$$$$$$$$$$$Z ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$$$$$$77II+..=?I777$$$$$$$$$$$$$$Z$Z$ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$$$$$$$$$77I?~..+II77$$$$$$$$$$$$$$$$$Z$ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$$$$$$$$$$$7II+..:?I77$$$$$$$$$$$$$$$$$$$$ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$Z$$$$$$$$$$77I?=..=?I77$$$$$$$$$$$$$$$$$$$$ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ$$$$$$$$$$$$$$$$$777I+:..+II77$$$$$$$$$$$$$$$$$$$$ ZZZZZZZZZZZZZZZZZZZZZZZZ$Z$$$$$$$$$$$$$$$$$$$$$77I?+..~?I77$$$$$$$$$$$$$$$$$$$$$ ZZZZZZZZZZZZZZZZZZZZZ$$$$$$$$$$$$$$$$$$$$$$$$$777I?~..=?I77$$$$$$$$$$$$$$$$$$$$$ ZZZZZZZZZZZZZZZZZZZ$$$$$$$$$$$$$$$$$$$$$$$$$$$77II+,.:+II77$$$$$$$$$$$$$$$$$$$$$ ZZZZZZZZZZZZZZZZZ$$$$$$$$$$$$$$8MMMMM$$$$$$$$$77I?=..=?I777$$$$$$$$$$$$$$$$$$$$$ ZZZZZZZZZZZZZZZZ$$$$$$$$$$$$DNNNMNMNDDNN$$$$$77II+:..+?I777$$$$$$$$$$$$$$$$$$$$$ ZZZZZ$ZZZZ$ZZZZZ$$$$$$$$$$$MMNNZM$ONZOMMNO$$$77I?=..:?II777$$$$$$$$$$$$$$$$$$$$$ ZZZZZZZ$ZZZZZ$$$$$$$$$$$$$MMO$NND8O$+D8NZDZ777II+:..=?II777$$$$$$$$$$$$$$$$$$$$$ ZZZ$$ZZZ$$$$$$$$$$$$$$$$$NMZII?+=+===+OO7Z8777I?+..,+II777$$$$$$$$$$$$$$7$$$$$$$ $$$ZZ$Z$$$$$$$$$$$$$$$$$$D87???++~~==+IZM8D$77I?~..~+II777$$$$$$$$$$$$$$77$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ZN$7I??+=~~~=+=ZDNDD7I?+,..=?I777$7$$$$$$$$$$$$7777777$$ $Z$$$$$$$$$$$$$$$$$$$$$$$II7II++=+==++?OMD88II?=..:+?I777$$$$$$$$$$$$$777777777$ $$$$$$$$$$$$$$$$$$$$$$$$$$ND7ZZIII?=++?8DDOOII+: .=?II777$7$$$$$$$$$$77777777777 $$$$$$$$$$$$$$$$$$$$$$$$$$ZNN+?ODMD??++$Z?I8I?=. .+?II777$$$$$$$$$77$77777777777 $$$$$$$$$$$$$$$$$$$$$$$$77ZZ$~==7?===++$O+?7I+~ .~+II777777$$$77$$$7777777777777 $$$$$$$$$$$$$$$$$$$$$$$$$7O$+=+==+==++??~=OI?=, .=?II777$7$77$777$77777777777777 $$$$$$$$$$$$$$$$$$$$$$$$$$NO$N$++==?+I$==ZII+~. ,+?II7777777$$77$$77777777777777 $$$$$$$$$$$$$$$$$$$$$$$$7Z7IZ77+=+=?77$OO7I?+:..~?II77777$7$$$777777777777777777 $$$$$$$$$$$$$$$$$$$7$7$778DO88$7?+??77$IIII?=. .+?II7777777777777777777777777777 $$$$$$$$$$$$$$$$$77777777O$77I+7Z7$Z$Z?OII?+~..:+?II7777777777777777777777777777 $$$$$$$$$$$$$$$$$77777777Z$Z777ZO8ZOO?OZ=I?=,..=?II77777777777777777777777777777 $$$$$$$$$$$$$$$77777$7$77Z8OO$ZDNDD$8OZ=~~+:..,+?II777777$$777777777777777777777 $$$$$$$$$$$$$7777777$O8DMM8MDDD8$ND8OZ?=~:~,..:==~=?77777$$777777777777777777777 $$$$$$$$$$$$$$7$===++7$OMNN8NMMDDD8OOD=~~=:. .~~~=~~~==77$$77$777777777777777777 $$$$$$$$$$$$++===~=~~=Z?O8DD8ZNDOOOZ8==~~~,..:~~~~~~~~~==77777777777777777777777 $$$$$$$$$$$8I++=~~~~~~~=+Z?7$++8OOOZ+=~~~:...:+~~=~~~~~==+I$$7777777777777777777 $$$$$$$$$$8MZI+==~~~~::?:?=+7++7OOZ8=~~~=,...=~~~+~~~~==+~~$$$777777$77777777777 $$$$$$$$7$D7ON??=+=~:~~I:=?~+I+=8OZ+=~~:~...,+~:===~~=+=~~?$$$7$7$$$777777777777 $$$$$$77$$=II=I+=~==::~7~~+==?=~+ZD=~~:+:...:~~:I~~===~~~::$$$$$$$7777777$7777$7 $$$$$$$$$$=$?=~:+=~?=:~+=~?+?+~~+7==~~~=,..,~~:7=~==+~:+~?:$$$$$$777777$777$$$77 $$$$$$$$$$8I~7=~=8+=D=::=~==+~:~===~=~:~...,~~=~~==+~==::=I$$$$$777777$7777$$777 $$$$$$$$$OOZ$+~I=~I+~7~:~~~+=?~~~===~~~:...:::+==+~==~~:::7$$$$$$7777$$777777777 $$$$$$$$$$=DZI=~~~=~?=~:=:~==Z~~$=~~~:~,..,:~~=+=~~~=:=~:~7$$$$$7777777777777777 $$$$$$$$$$O7I=~=~~~~~:=:Z~~I++I=7=~~~=:...:::~?=~~=~~+:::~7$$$$$777777$777777777 $$$$$$$$7788$7?++:~::~:~I~:+I=?Z=~~~~~,..,::~=7~=I~~~::::~$$$$$$$$7777777777$777 $$$$$$$$$78OZ$7II+=~:~~=?~~+I=$==~~:::. .,::++~+~~=~:~:~:~7$$$$$$$$7$77$$7$$$7$7 $$$$$$$$77$87I?I?I++=~~~7+~+7=I==~~:=,...:::Z+I~~~::::::::$$$$$$$$$$7$7$$$$$7$$7 $$$$$$$$$7==?=?+=+=++~~~~?~+I?====~=:, .,::~Z$=~~~:~~:~:~~7$$$$$$$$$$777$7$$7$$7 $$$$$$$$$$~=?Z$===~~~=+~~~==7++===~=:. .,::?$~+~=:~=~::~:~7$$$$$$$$$$77$$$$7$$$$ $$$$$$$$$OZ~=$OO=?+==~====~~~+===~?7=..:?:+$=?==~===~::~:~$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$Z$$+IOOO=??++++++=++=~~~I~+=~+?++Z+~~===I~:::~::~$$$$$$$$$$$$$$$$$$$$$7 $$$$$$$$$OZIII+OO8O7+?I$NNDDNDDI+++Z7??I+Z?~==~?+~~::::::~$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$Z7+?II7=887$8ZMNNMDNNMNNOD88IOIO=~~~=++==::~:::~~$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$O$?I7?$Z?DO8NMMNMNNN8Z?~=D888+~=~~=~=+==~:~:::~~=$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$ZZII7I7ZOO8MNMMNMMND8OI==:8?O?~~=+=+==::::::::~~=$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$OOO?77I$O88=MMMMNMM87=?OI=~:7N====++~~::~::~:::~=$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$ODZ$7ZOOOO?MMMMMM8Z==+D7+~====+:~::::~~::::::~+$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$8?78D8ZZO8OOOO?MMMM8=I$Z7I$==~=~~~:::~~~::::::~~?$$$$$$$$$$$$$$$$$$$$$$ ZZZ$$$$$$OZIZDDDZZ8DO88O88NOOZ7$++O7??=:::::::~~::::::::~I$$$$$$$$$$$$$$$$$$$$$$ ZZZ$$Z$$$$OOI$8NNDDDOOO8DNNMN8$+8Z?=+I==+~::::::::~::::~~7$$$$$$$$$$$$$$$$$$$$$$ $$??Z??+?7+?O?OIOZNOI=O$$ZO88DMN$+?======?~::::::::::::~~$$$$$$$$$$$$$$$$$$$$$$$ OZZZZZZ$$$$$$$MNMDOMDDMDD8OOO8D8O+==++?~~=M=~::::::::::~~$$$$$$$$$$$$$$$$77$$$7$ ====== ====== ==== == == == == == == == == == == == == ==== == == == == == == == == == == == == == === ====== ======== == Crobots : Jedi Type : Macro Version : 9.5 Author : Maurizio Camangi Begin : 27-01-2010 Revision : 27-04-2010 Jedi9 è un'evoluzione meno aggressiva di Jedi8. Mantiene lo stesso movimento oscillatorio nell'angolo ma per gran parte del match ne riduce l'ampiezza (fase I). Jedi9 utilizza lo stesso movimento di Jedi8 (funzione lightsaber()) se : - colpito; si suppone che l'avversario sia - per qualche motivo - più vicino e quindi lo attacca - sono passati un certo numero di cicli (fase II) Durante il movimento più aggressivo registra eventuali danni subiti e si riconfigura per utilizzare nuovamente il movimento difensivo. Se l'angolo opposto è libero, oscilla a 15° dal lato con un range più ampio, invece che a 30°. Il controllo della tipologia di match F2F viene fatta prima di raggiungere l'angolo. Nel 4vs4 il conteggio degli avversari è invece periodico, con maggiore frequenza al passare dei cicli macchina. L'attacco finale è a forma di quadrato che cambia ampiezza se si subiscono danni superiori all'11% durante una singola rotazione. Test statistici sono stati utilizzati per calibrare al meglio alcune costanti del codice. Novità: Per la prima volta (?) vengono utilizzati gli array. In dettaglio, vengono utilizzati array bidimensionali sfruttando i 16 bit meno significativi della variabile per un indice e i 16 bit più significativi per l'altro. Allo scopo si usano shift di 16 bit e operazioni di and / or bit a bit con maschere di bit per accedere in lettura / scrittura ai due elementi dell'array. Gli array vengono utilizzati per salvare separatamente le informazioni dell' oscillazione e scansione (angolo, flag attacco / difesa, ...) per ciascuno dei due lati a dx e sx dell'angolo dove il robot oscilla. Alla fine non c'è un miglioramento dell'efficienza... Mi andava di usarli e basta :-) Spero in ogni caso di aver dato uno spunto per sviluppi futuri... */ int ang, oang, range, orange, /* Variabili di puntamento */ d, /* Variabile temporanea salva danni subiti */ dir, /* Direzione del cammino */ posx, /* Variabili ad 1 bit */ posy, /* salva posizione */ x,y, /* Variabili salva posizione */ dist, /* Distanza dal corner */ flag, /* Bit-oriented flag per la gestione del movimento */ timer, enemies, /* Conta nemici superstiti */ attack, /* Bit-oriented flag per la gestione del movimento */ f2f, /* Flag di attivazione del f2f */ t, /* Timer oscillazione */ sk, /* Variabile misteriosa di Mick */ fp, /* Variabile misteriosa di Mick */ i, td, tl,/* Variabili di utilità */ deg, /* Limite superiore di scansione per contare i nemici */ up, low, /* Limiti di oscillazione nell'F2F */ clock, /* Switch oscillazione nell'F2F */ deg1, /* Limite inferiore di scansione per contare i nemici */ dang, dscan, dvector /* Array bidimensionali */ ; fire(dir) /* Many thanks to Daniele Nuzzo */ { int asin,acos; /*if (safe) return;*/ if (speed()<100) drive(dir,100); if (scan(ang,10)>50) { asin=(sin(ang-dir)/14384); acos=(cos(ang-dir)/3796)-230; ang-=18*(scan(ang-18,10)>0); ang+=18*(scan(ang+18,10)>0); if(scan(ang-16,10)) ang-=8; else if(scan(ang+16,10)) ang+=8; if(scan(ang-12,10)) ang-=4; else if(scan(ang+12,10)) ang+=4; if(scan(ang-11,10)) ang-=2; if(scan(ang+11,10)) ang+=2; if (orange=scan(oang=ang,3)) { if(scan(ang-13,10)) ang-=5; else if(scan(ang+13,10)) ang+=5; if(scan(ang+12,10)) ang+=4; else if(scan(ang-12,10)) ang-=4; if(scan(ang-11,10)) ang-=2; if(scan(ang+11,10)) ang+=2; cannon(ang+(ang-oang)*((880+(range=scan(ang,10)))/482)-asin, range*230/(orange-range-acos)); } else search(); } else search(); } search() { if (scan(ang-=350,10)) return fire2(); if (scan(ang-=20,10)) return fire2(); if (scan(ang-=320,10)) return fire2(); if (scan(ang-=60,10)) return fire2(); if (scan(ang-=280,10)) return fire2(); if (scan(ang-=100,10)) return fire2(); if (scan(ang-=240,10)) return fire2(); if (scan(ang-=140,10)) return fire2(); if (scan(ang-=200,10)) return fire2(); if (scan(ang-=180,10)) return fire2(); if (scan(ang-=160,10)) return fire2(); if (scan(ang-=220,10)) return fire2(); if (scan(ang-=120,10)) return fire2(); if (scan(ang-=260,10)) return fire2(); if (scan(ang-=80,10)) return fire2(); if (scan(ang-=300,10)) return fire2(); if (scan(ang-=40,10)) return fire2(); if (scan(ang-=340,10)) return fire2(); } fire2() { if (range=scan(oang=ang,10)) { if (range>500) return cannon(ang,range); if (scan(ang+350,10)) ang+=355; else ang+=5; if (scan(ang+350,10)) ang+=357; else ang+=3; cannon((ang<<1)-oang,(scan(ang,10)<<1)-range); } else search(); } stop() { drive(dir,0); while(speed()>50) if (orange=scan(ang,10)) { if (range=scan((ang=(6*(scan((ang+=(10*(scan((oang=ang)+10,10)>0)-5))+10,10)>0)-3)+ang),10)) cannon(ang+(ang-oang),range+((range-orange)<<1)); } /*drive(dir,100);*/ } degree(xx,yy) /* Direzione per x,y */ int xx,yy; { return(dir=(360+((xx-=loc_x())<0)*180+atan(((yy-loc_y())*100000)/xx))); } dista(dx,dy) /* Distanza al quadrato (evita una sqrt()) */ int dx,dy; { return (((dx-=loc_x())*dx+(dy-=loc_y())*dy)); } corner() /* Si avvicina al corner */ { drive(degree(x,y), 100); while((dist=dista(x,y)) > 6325) { if(dist<10450) ; else spara(); } stop(t=0); sk=1; } int radar(sc) { int sc, en, dx; while((en<2) && (dx<160)) { en+=radar2(sc+dx); dx+=20; } return en; } int radar2(sc) int sc; { return ( (scan(sc+10, 10)!=0) + (scan(-sc-10, 10)!=0) ); } int radar3(sc) int sc; { return ( scan(sc, 10) || scan(sc+20, 10) ); } spara() /* Many thanks to Mick Messina */ { ++t; if ((orange=scan(ang, 10)) ) { if (scan(ang-9,4)) { if (scan(ang-=13,4)) { if(scan(ang-3,fp)) ang-=fp; else ++ang; } else if (scan(ang-fp,fp)) ang-=fp; } else if(scan(ang+9,fp)) { if (scan(ang+=13,fp)) ang+=fp; else --ang; } else if(scan(ang+4,fp)) ang+=fp; else --ang; } else if ((orange=scan(ang-=20,10))) { if (scan(ang-9,10)) { if (scan(ang-=13,fp)) ang-=fp; else ++ang; } else if(scan(ang+9,10)) ang+=6; } else if ((orange=scan(ang+=40,10))) { if (scan(ang+9,10)) ang+=12; } else if ((orange=scan(ang+=20,10))); else { if(sk) { if ((orange=scan(ang-=80,10))) return cannon(ang,orange); else if ((orange=scan(ang-=20,10))) return cannon(ang,orange); else if ((orange=scan(ang+=120,10))) return cannon(ang,orange); else if ((orange=scan(ang+=20,10))) return cannon(ang,orange); else if ((orange=scan(ang-=160,10))) return cannon(ang,orange); else return ang+=260; } if ((orange=scan(dir,10))) { if (orange>850) { return ang+=40; } else ang=dir; } else { if ((orange=scan(ang+=20,10))) return cannon(ang,orange); return ang+=40; } } if (range=scan(ang,10)){ cannon (ang, range*145/(145+orange-range) ); if(range>740) if(!sk) if(range>orange || range>900) { return ang+=40; } } else if(scan(ang-20,10)) ang-=20; else if(scan(ang+=20,10)); else ang+=40; } setup() { /* * Setup main variables */ degree(x, y); corner(fp=3); dvector=(dang=(deg=dscan=deg1=(90*((posy<<1)+(posx^posy))))+15)+15; dvector|=((dvector+30)<<16); dang|=((dang+60)<<16); dscan|=((deg1+70)<<16); deg+=320; tl=td=38; /*attack=65537;*/ } f2f() { up=725; low=275; while(1) { d=damage(); while(loc_x() < up) fire(0); stop(); while(loc_y() > low) fire(270); stop(); while(loc_x() > low) fire(180); stop(); while(loc_y() < up) fire(90); stop(); if ((damage()-d)>11) { /* Cambia ampiezza */ if (clock^=1) { up=600; low=150; } else { up=725; low=275; } } } } lightsaber(a) int a; { d=damage()+a; while(dista(x,y) < (123450-4925*(damage()>d))) fire(dir); } main() /* Inizializza alcune variabili ed innesca la routine principale */ { if(radar(180*(loc_x()>500))>1) { setup(y=20+960*(posy=loc_y(x=20+960*(posx=loc_x()>500))>500)); } else f2f(); while (1) { if (radar3((dscan>>flag)&65535)) { dir=(dvector>>flag)&65535; if (attack & (1<d) attack&=~(1<d) { lightsaber(0); ++timer; } } } else { dir=(dang>>flag)&65535; lightsaber(5); timer+=2; } stop(sk=0); corner(flag^=16); if (++timer>tl) { i=enemies=0; while((i < 140)&&(enemies<2)) { enemies+=(scan(deg+i, 10)!=0); i+=20; } if (enemies<2) f2f=radar(deg1+45)<2; if (!f2f) { if(!(td>>=1) && (damage()<60)) attack|=65537; else attack&=~65537; tl=timer+td; } else f2f(); } } }