with Tron_IO; use Tron_IO; package body Computer_Strategy is type T_N_DIREZIONE is (Avanti,Destra,Sinistra); -- contralla se la posizione in N_Dir e' libera (= 0), ovvero se non c'e' un muro, e ritorna vero in caso affermativo function controllo (X : in T_COORDINATA_X; Y : in T_COORDINATA_Y; Dir : in T_Direzione; N_dir : in T_N_Direzione) return BOOLEAN is temp_x : T_COORDINATA_X; temp_y : T_COORDINATA_Y; begin case dir is -- la direzione attuale when Up => case N_dir is -- la direzione che si vuole prendere when Avanti => temp_y := y-1; if temp_y = 0 then temp_y := line; end if; if Mat(temp_y,x) = 0 then return true; else return false; end if; when Destra => temp_x := x+1; if temp_x = col+1 then temp_x := 1; end if; if Mat(y,temp_x) = 0 then return true; else return false; end if; when Sinistra => temp_x := x-1; if temp_x = 0 then temp_x := col; end if; if Mat(y,temp_x) = 0 then return true; else return false; end if; end case; when Down => case N_dir is when Avanti => temp_y := y+1; if temp_y = line+1 then temp_y := 1; end if; if Mat(temp_y,x) = 0 then return true; else return false; end if; when Destra => temp_x := x-1; if temp_x = 0 then temp_x := col; end if; if Mat(y,temp_x) = 0 then return true; else return false; end if; when Sinistra => temp_x := x+1; if temp_x = col+1 then temp_x := 1; end if; if Mat(y,temp_x) = 0 then return true; else return false; end if; end case; when Right => case N_dir is when Avanti => temp_x := x+1; if temp_x = col+1 then temp_x := 1; end if; if Mat(y,temp_x) = 0 then return true; else return false; end if; when Destra => temp_y := y+1; if temp_y = line+1 then temp_y := 1; end if; if Mat(temp_y,x) = 0 then return true; else return false; end if; when Sinistra => temp_y := y-1; if temp_y = 0 then temp_y := line; end if; if Mat(temp_y,x) = 0 then return true; else return false; end if; end case; when Left => case N_dir is when Avanti => temp_x := x-1; if temp_x = 0 then temp_x := col; end if; if Mat(y,temp_x) = 0 then return true; else return false; end if; when Destra => temp_y := y-1; if temp_y = 0 then temp_y := line; end if; if Mat(temp_y,x) = 0 then return true; else return false; end if; when Sinistra => temp_y := y+1; if temp_y = line+1 then temp_y := 1; end if; if Mat(temp_y,x) = 0 then return true; else return false; end if; end case; end case; end controllo; -- calcola quanta distanza c'e' tra la testa della scia e il muro in direzione N_Dir e mi ritorna il valore function distanza_muro(X : in T_COORDINATA_X; Y : in T_COORDINATA_Y; Dir : in T_Direzione; N_dir : in T_N_Direzione) return INTEGER is dist : INTEGER :=0; temp_x : T_COORDINATA_X := x; temp_y : T_COORDINATA_Y := y; begin while controllo(temp_x,temp_y,dir,N_Dir) loop dist := dist + 1; case dir is -- la direzione attuale when Up => case N_dir is -- la direzione in cui si cerca la distanza when Avanti => temp_y := temp_y-1; if temp_y = 0 then temp_y := line; end if; when Destra => temp_x := temp_x+1; if temp_x = col+1 then temp_x := 1; end if; when Sinistra => temp_x := temp_x-1; if temp_x = 0 then temp_x := col; end if; end case; when Down => case N_dir is when Avanti => temp_y := temp_y+1; if temp_y = line+1 then temp_y := 1; end if; when Destra => temp_x := temp_x-1; if temp_x = 0 then temp_x := col; end if; when Sinistra => temp_x := temp_x+1; if temp_x = col+1 then temp_x := 1; end if; end case; when Right => case N_dir is when Avanti => temp_x := temp_x+1; if temp_x = col+1 then temp_x := 1; end if; when Destra => temp_y := temp_y+1; if temp_y = line+1 then temp_y := 1; end if; when Sinistra => temp_y := temp_y-1; if temp_y = 0 then temp_y := line; end if; end case; when Left => case N_dir is when Avanti => temp_x := temp_x-1; if temp_x = 0 then temp_x := col; end if; when Destra => temp_y := temp_y-1; if temp_y = 0 then temp_y := line; end if; when Sinistra => temp_y := temp_y+1; if temp_y = line+1 then temp_y := 1; end if; end case; end case; end loop; return dist; end distanza_muro; -- strategia del computer che utilizza le informazioni del giocatore (Xp,Yp,Dirp) procedure Computer(Gio : in T_Giocatore; X : in out T_COORDINATA_X; Y : in out T_COORDINATA_Y; Dir : in out T_Direzione; Symbol : in CHARACTER; Xp : in T_COORDINATA_X; Yp : in T_COORDINATA_Y; Dirp : in T_Direzione) is diff_x, diff_y : INTEGER; -- sono le differenze tra le coordinate del giocatore e quelle del computer large_x : INTEGER := 20; -- da dove la strategia studiata deve intervenire large_y : INTEGER := 12; -- da dove la strategia studiata deve intervenire begin diff_x := xp-x; diff_y := yp-y; case dir is -- la direzione del cursore when Up => if diff_x < 0 then -- l'avversario e' alla sinistra della scia if diff_y >= 0 then --sotto if abs(diff_x) <= large_x and abs(diff_y) <= large_y then -- se l'avversario si trova nelle vicinanze case dirp is -- direzione dell'avverasario -- sopra definite (large_x, large_y) when Up => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else -- se non posso andare a sinistra guardo dove ho maggior spazio (distanza dal muro -- davanti a me) if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; else -- l'avversario e' alla sinistra della scia sopra if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; end if; else -- l'avversario e' alla destra della scia if diff_y >= 0 then --sotto if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; else -- l'avversario e' alla destra della scia sopra if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; end if; end if; when Down => if diff_x < 0 then -- l'avverasario e' alla destra della scia if diff_y >= 0 then --sotto if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; else -- l'avverasario e' alla destra della scia sopra if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; end if; else -- l'avversario e' alla sinistra della scia if diff_y >= 0 then --sotto if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; else -- l'avversario e' alla sinistra della scia sopra if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; end if; end if; when Right => if diff_x < 0 then -- l'avversario e' dietro if diff_y >= 0 then --sotto if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; else -- l'avversario e' dietro sopra if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; end if; else -- l'avversario e' davanti if diff_y >= 0 then --sotto if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; else -- l'avversario e' davanti sopra if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; end if; end if; when Left => if diff_x < 0 then -- l'avversario e' davanti if diff_y >= 0 then --sotto if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; else -- l'avversario e' davanti sopra if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; end if; else -- l'avversario e' dietro if diff_y >= 0 then --sotto if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,sinistra) then sinistra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,avanti) then destra(dir); avanti(gio,x,y,dir,symbol); else avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; else -- l'avversario e' dietro sopra if abs(diff_x) <= large_x and abs(diff_y) <= large_y then case dirp is when Up => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,destra) then destra(dir); Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,avanti) >= distanza_muro(x,y,dir,sinistra) then avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; end if; end if; end case; -- nel caso non sia nella vicinanze (large_x, large_y): if abs(diff_x) >= large_x or abs(diff_y) >= large_y then case dir is when Up => if controllo(x,y,dir,Avanti) then -- vado avanti se la strada e' libera Avanti(gio,x,y,dir,symbol); else -- altrimenti mi sposto nella direzione in cui la distanza dal muro e' maggiore if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Down => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Right => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; when Left => if controllo(x,y,dir,avanti) then Avanti(gio,x,y,dir,symbol); else if distanza_muro(x,y,dir,destra) >= distanza_muro(x,y,dir,sinistra) then destra(dir); avanti(gio,x,y,dir,symbol); else sinistra(dir); avanti(gio,x,y,dir,symbol); end if; end if; end case; end if; end computer; end Computer_Strategy;