1998/goblin.r

001/****************************************************************************/
002/*                                                                          */
003/*  VIII Torneo di CRobots di MCmicrocomputer (1998)                        */
004/*                                                                          */
005/*  CROBOT: GOBLIN.R                                                        */
006/*                                                                          */
007/*  AUTORE: Daniele Nuzzo                                                   */
008/*                                                                          */
009/****************************************************************************/
010 
011/* Nel caso si rendesse necessario limitare i combattimenti ad un solo robot
012   per concorrente preferisco veder combattere questo crobot (GOBLIN.R).    */
013 
014/*              
015                          SCHEDA TECNICA:
016 
017   Inizialmente il crobot si reca nell'angolo pi� vicino.
018   Nell'angolo viene utilizzata questa strategia:
019 
020       - Se il crobot si trova in un angolo in basso controlla nell'angolo
021         sopra se ci sono altri crobots e se non c'� nessuno si reca sopra
022         nel nuovo angolo; analogamente se si trova a nord e non c'� nessuno
023         in basso scende;
024 
025        - Altrimenti rimane fermo e defilato nell'angolo finch� non viene
026          colpito con una certa precisione (almeno 5% di danno) o finch�
027          non si avvicina nessuno nell'angolo;
028 
029        - Quindi cambia angolo spostandosi sempre in uno dei due angoli
030          adiacenti, preferendo se possibile (se non ci sono altri crobots)
031          muoversi lungo le pareti verticali dell'arena di combattimento.
032 
033   Durante tutto il match il crobots controlla continuamente se � rimasto
034   un solo avversario ed in tal caso lo attacca; la routine di attacco �
035   basata sullo spostamento lungo le due grandi diagonali, utilizzando un
036   piccolo accorgimento: il crobot non va mai incontro ad un avversario
037   che si trova in un angolo; infatti dopo aver percorso met� diagonale
038   (il crobots si trova pi� o meno nel centro dell'arena) si controlla che
039   l'angolo in cui si sta per andare sia libero, in caso contrario si cambia
040   la diagonale di attacco.
041 
042   Vengono utilizzate 2 routine di fuoco a seconda che il crobots sia fermo
043   o in movimento; tali routine sono pi� o meno le stesse utilizzate in
044   Diabolik.r e nei suoi predecessori. Quindi niente di nuovo per le routine
045   di fuoco!
046 
047 
048*/
049 
050int rng,orng,deg,odeg,dir,t,q,dam;
051 
052main()
053{
054/* Vai nell'angolo pi� vicino: */
055 
056    if (loc_x()<500) sx(); else dx();
057    if (loc_y()<500) dw(); else up();
058 
059    while(1)
060    {
061        if (UpDown())
062        {
063            Angle();
064            if (UpDown()) Move();
065        }
066    }
067      
068}
069 
070up() { dir=90;  while(loc_y()<900) { drive(90,100);  Fire(); } drive(270,0); }
071dw() { dir=270; while(loc_y()>100) { drive(270,100); Fire(); } drive(90,0);  }
072dx() { dir=0;   while(loc_x()<900) { drive(0,100);   Fire(); } drive(180,0); }
073sx() { dir=180; while(loc_x()>100) { drive(180,100); Fire(); } drive(0,0);   }
074 
075Angle()
076{
077    dam=damage();
078    while ((!orng || orng>450) && (damage()<dam+4))
079    {
080        if (t>15)
081           if (Radar())
082              { Stop(); while(1) { diag(); Stop(); } }       /* Attacca!!! */
083        dam=damage();
084        Fire(1);
085    }
086}
087 
088Move()
089{
090    if (loc_x()<500) dx(); else sx();
091}
092 
093UpDown()
094{
095    if (t>15) return 1;
096    if (loc_y()<500) { if (!scan(80,10) && !scan(100,10)) { up(); return 0; } }
097    else { if (!scan(260,10) && !scan(280,10)) { dw(); return 0; } }
098    return 1;
099}
100 
101Radar()
102{
103    deg=-10; t=0;
104    while((deg+=20)!=710) if (scan(deg,10)) ++t;
105    if (t<3) return 1;
106    t=0;
107    return 0;
108}
109 
110Stop()
111{
112    if (loc_x()<500) if (loc_y()<500) q=0; else q=3;
113                else if (loc_y()<500) q=1; else q=2;
114    dir=45+90*q;
115    drive(dir,0);
116}
117 
118diag()
119{
120    while ((loc_x()<450) || (loc_x()>550)) { drive(dir,100); Fire(); }
121 
122    if ((scan(dir-10,10)) || (scan(dir+10,10)))
123    {
124        if ((scan(dir-80,10)) || (scan(dir-100,10)))
125        { dir+=90; drive(dir); }
126        else
127        { dir-=90; drive(dir); }
128    }
129 
130    while ((loc_x()<850) && (loc_x()>150) &&
131           (loc_y()<850) && (loc_y()>150)) { drive(dir,100); Fire(); }
132    Stop();
133}
134 
135Fire(flag)
136{
137    if (orng=scan(deg,10))
138    {
139        if (!scan(deg-=5,5)) deg+=10;
140        if (orng>700)
141        {
142            if (!scan(deg-=3,3)) deg+=6;
143            cannon(deg,orng); ++t; deg+=40; return;
144        }
145 
146        if(scan(deg-5,1)) deg-=5;
147        if(scan(deg+5,1)) deg+=5;
148        if(scan(deg-3,1)) deg-=3;
149        if(scan(deg+3,1)) deg+=3;
150        if(scan(deg-1,1)) deg-=1;
151        if(scan(deg+1,1)) deg+=1;
152 
153        if (orng=scan(odeg=deg,5))
154        {
155            if(scan(deg-5,1)) deg-=5;
156            if(scan(deg+5,1)) deg+=5;
157            if(scan(deg-3,1)) deg-=3;
158            if(scan(deg+3,1)) deg+=3;
159            if(scan(deg-1,1)) deg-=1;
160            if(scan(deg+1,1)) deg+=1;
161 
162            if (rng=scan(deg,10))
163            {
164                if (flag)
165                {
166                cannon(deg+(deg-odeg)*((1200+rng)>>9),
167                       rng*160/(160+orng-rng));
168                }
169                else
170                {
171                cannon(deg+(deg-odeg)*((1200+rng)>>9)-(sin(deg-dir)>>14),
172                       rng*160/(160+orng-rng-(cos(deg-dir)>>12)));
173                }
174                t=0;
175            }
176        }
177     }
178     else
179     {
180        if (scan(deg-=20,10)) return;
181        if (scan(deg+=40,10)) return;
182        deg+=40; return;
183     }
184}