2001/kyashan.r

01/*
02Nome:       Kyashan.r
03Autore:     Franco Cartieri
04 
05Kyashan e' un microcrobots molto semplice: all'inizio dell'incontro si posiziona
06nell'angolo in basso piu' vicino e si muove lungo i lati di un triangolo.
07Ogni 10 cicli controlla se sia rimasto solo un robot: in questo caso passa alla
08routine di attacco finale; mentre ogni 100 cicli controlla se ci sono dei robot
09raggiungibili con il cannone, in caso contrario passa alla routine di attacco finale.
10La routine di attacco finale e' un ciclo in cui il robot si muove in senso antiorario
11lungo il quadrato che si ottiene, unendo i punti centrali dei lati del campo di gioco.
12La routine di sparo e' veloce ma molto imprecisa.
13*/
14 
15int r,t,last,ang,dis,contacicli,angpos;
16 
17/* routine di sparo */
18fuoco(dir)
19int dir;
20{
21    drive(dir,100);
22        if((r=scan(ang,10))&&(r<770))                           cannon(ang,2*scan(ang,10)-r);   
23        else    if((r=scan(ang+=339,10))&&(r<770))              cannon(ang,2*scan(ang,10)-r);
24                else    if((r=scan(ang+=42,10))&&(r<770))       cannon(ang,2*scan(ang,10)-r);
25                else    ang+=41;
26}
27 
28main()
29{
30    contacicli=ang=last=10;
31    /* si sposta nell'angolo in basso pi� vicino */
32    if(loc_x()>500)
33    {  
34        angpos=0;
35        while(loc_x()<900) fuoco(0);
36        while(loc_y()>100) fuoco(270);
37    }
38    else           
39    {
40        angpos=1;
41        while(loc_x()>100) fuoco(180);
42        while(loc_y()>100) fuoco(270);
43    }
44    while(last>1)
45    {
46        t=10;
47        while(--t)
48        {
49            /* si muove lungo un triangolo */
50            if(angpos==0)
51            {
52                dis=750+damage();
53                while(loc_x()>dis) fuoco(180);
54                while(loc_x()<925) fuoco(45);
55                while(loc_y()>100) fuoco(270);
56            }
57            else
58            {
59                dis=250-damage();
60                while(loc_x()<dis) fuoco(0);
61                while(loc_x()>75) fuoco(135);
62                while(loc_y()>100) fuoco(270);
63            }
64        }
65        /* ogni 10 cicli controlla se ci sono supestiti */
66        drive(last=0,0);
67        ang=10;
68        while((ang+=20)<370) last+=(scan(ang,10)>0);
69        contacicli=contacicli-1;
70        if(contacicli==0)
71        {
72            /* ogni 100 cicli controlla se ci sono dei robot raggiungibili */
73            ang=contacicli=10;
74            last=1;
75            while((ang+=20)<370) last+=((scan(ang,10)>0)&&(scan(ang,10)<700));
76        }
77    }  
78    if(angpos==0) while(loc_x()>500) fuoco(180);
79    else  while(loc_x()<500) fuoco(0);
80    /* attacco finale */
81        while(1)
82        {
83        while(loc_x()<900) fuoco(45);
84        while(loc_y()<900) fuoco(135);
85        while(loc_x()>100) fuoco(225);
86        while(loc_y()>100) fuoco(315);
87    }
88}