2007/electron.r
001 | /* |
002 |
003 |
004 | E L E C T R O N |
005 |
006 |
007 |
008 | Torneo di C Robots 2007 |
009 | C Robots: electron.r |
010 | Categoria: Micro |
011 | VB: 499 (24%) |
012 |
013 | Autore: Pizzocaro Marco |
014 |
015 | Scheda tecnica: |
016 | electron.r e' derivato da neutron.r, ma preso violentemente a martellate |
017 | per farlo rientrare nelle 500 istruzioni. |
018 |
019 | Prima di tutto e' presente una sola routine di fuoco, sviluppata a |
020 | partire da quelle dei fratelli maggiori neutron.r e proton.r (a loro volta |
021 | derivate da !alien.r), con alcuni parametri che cambiano se si |
022 | tratta di un f2f o di un 4vs4. |
023 |
024 | Nel 4vs4 oscilla solo orizzontalmete. Il calcolo della lunghezza di oscillazione |
025 | e' notevolemente semplificato rispetto a neutron.r. Il tentativo e' sempre |
026 | quello di accanirsi esclusivamente cotro il nemico sulla stessa orizzontale. |
027 |
028 | Il controllo del numero di nemici avviene su 180 gradi (abbondanti) |
029 | anziche' solo sul quadrante opportuno, per risparmiare codice. La |
030 | conseguente perdita di tempo e' leggermente compensata dal fatto |
031 | che, ad inizio incontro, electron.r inizia a controllare i nemici |
032 | non appena raggiunge la parete nord (o sud) dell'arena e non quando |
033 | raggiunge l'angolo. |
034 |
035 | Il f2f non � molto diverso da quello di neutron.r, a parte ulteriori riduzioni |
036 | di codice, con un movimento del tipo di boom.r. |
037 |
038 | */ |
039 |
040 |
041 | int range, dir, oang, ang; /*variabili per il cannone*/ |
042 | int b, posy, posx; /*variabili dell'attacco finale*/ |
043 | int aq; /*variabile dell'oscillazione*/ |
044 | int t; /*timer*/ |
045 | int sca, n; /*angolo del conteggio degli avversari*/ |
046 | int sc; /*angolo della scansione*/ |
047 | int ver, hor; /*variabili dell'angolo*/ |
048 | int m, limite; /*regolazione dello sparo*/ |
049 |
050 | main() |
051 | { |
052 | /*si muove verticalmente verso la parete pi� vicina e inizializza alcune variabili*/ |
053 | if ((loc_y(hor=(loc_x(limite=835)>500))>500)) while (loc_y(sc=180)<940) fire(90); |
054 | else while (loc_y()>60) fire(270); |
055 | |
056 | |
057 | /*controlla se e' un f2f*/ |
058 | look(dir=180*hor); |
059 | |
060 | |
061 | while ((++t)<160) { /*oscilla nell'angolo durante il 4vs4*/ |
062 | |
063 | if (hor){ |
064 | sx(925-(aq=range-800)*(aq>0)); |
065 | dx(925); |
066 | } |
067 | else { |
068 | dx(75+(aq=range-800)*(aq>0)); |
069 | sx(75); |
070 | } |
071 | |
072 | if (range>899) look(); /*prende tempo per contare i nemici*/ |
073 | |
074 | } |
075 | |
076 | limite=2000; |
077 | |
078 | while (m=1) { /*attacco del f2f*/ |
079 | |
080 | if ((posx=loc_x())>880) dir=180; |
081 | else if (posx<120 ) dir=0; |
082 | else if ((posy=loc_y())>880) dir=270; |
083 | else if (posy<120) dir=90; |
084 | else if (range>600) dir=ang+25; |
085 | else if (range<150) dir=ang+195; |
086 | else dir=ang+180*(b^=1); |
087 | |
088 | fire(dir); |
089 | fire(dir+0); /*una (in)utile temporizzazione*/ |
090 | fire(dir); |
091 | |
092 | |
093 | /*drive(dir,60);*/ |
094 | |
095 | } |
096 | |
097 |
098 |
099 | } /*end of main*/ |
100 |
101 |
102 |
103 |
104 | /*routine di fuoco*/ |
105 | fire(d) |
106 | { |
107 | drive(d,100); |
108 | if ((range=scan(oang=ang,10))&&(range<limite)) { |
109 | if (scan(ang-8,5)) { if (scan(ang-=5,2)) ; else ang-=4; return (cannon(ang+(ang-oang),2*scan(ang,10)-range)); } |
110 | if (scan(ang+8,5)) { if (scan(ang+=5,2)) ; else ang+=4; return (cannon(ang+(ang-oang),2*scan(ang,10)-range)); } |
111 | if (scan(ang,10)) { if (scan(ang-=2,2)) ; else ang+=4; return (cannon(ang+m*(ang-oang),2*scan(ang,10)-range)); } |
112 | } |
113 | else if (scan(ang+=20,10)); |
114 | else if (scan(ang-=40,10)); |
115 | else if (scan(dir,10)) ang=dir; |
116 | else ang+=80; |
117 | } |
118 |
119 | /*movimento verso destra e sinistra*/ |
120 | dx(limt) { while (loc_x()<limt) fire(0); drive(0,0);} |
121 | sx(limt) { while (loc_x()>limt) fire(180);drive(180,0);} |
122 |
123 |
124 |
125 | /*scansiona circa 180 per controllare il numero di nemici*/ |
126 | look() { |
127 | drive(dir,n=2); |
128 |
129 | sca=sc+210; |
130 | while (sca>sc&&n) n-=(scan(sca-=20,10)>0); |
131 |
132 | t+=(2000*n); |
133 |
134 | } |