with Ada.Text_Io, Tron_IO, Computer_Strategy, Ada.Synchronous_Task_Control; use Ada.Text_Io, Tron_IO, Computer_Strategy, Ada.Synchronous_Task_Control; procedure Princ_Tron is Tasto : CHARACTER; -- variabile per la scelta della direzione scelta: CHARACTER; -- scelta del tipo di gioco (sfida il computer, sfida 2 giocatori) suspG : Suspension_Object; -- variabile per la sospensione del task che prende il carattere Time1 : DURATION; -- cambia la difficolta' del gioco variando la velocita' (diminuisco i delay dei loop) Time2 : constant DURATION := 0.0005; -- tempo di delay necessario per i tasks dir1 : T_DIREZIONE := right; -- direzione del primo giocatore (T_DIREZIONE nel package Tron_IO) dir2 : T_DIREZIONE := left; -- direzione del secondo giocatore (T_DIREZIONE nel package Tron_IO) x1 : T_COORDINATA_X := 3; -- variabile di posizione del giocatore 1 (T_COORDINATA_X nel package Tron_IO) x2 : T_COORDINATA_X := 78; -- variabile di posizione del giocatore 2 (T_COORDINATA_X nel package Tron_IO) y1,y2 : T_COORDINATA_Y := 12; -- variabili di posizione del giocatore 1 e 2 (T_COORDINATA_Y nel package Tron_IO) -- dichiarazione del task che prende il carattere da tastiera task type Getchar is entry Startrunning; end Getchar; -- dichiarazione del task che visualizza a schermo il simbolo dei giocatori task type Writehash; Task_1 : Getchar; Task_2 : Writehash; -- corpo del task che prende il carattere da tastiera task body Getchar is begin accept Startrunning; -- serve per far partire il task esplicitamente loop Suspend_Until_True(suspG); -- questa procedura sospende il task se suspG = false set_true(suspG); -- setto a vero suspG perche' Suspend_Until_True cambia in falso la variabile -- se quest'ultima ha valore True Get_Immediate(Tasto); -- prendo il carattera da tastiera per la mossa dei giocatori case scelta is -- scelta del tipo di gioco when '1' => -- gioco contro il computer case Tasto is -- spostamento in base al tasto premuto dal giocatore when 's' | 'S' => Sinistra(dir1); -- procedura che cambia il valore di dir (package Tron_IO) when 'd' | 'D' => Destra(dir1); -- procedura che cambia il valore di dir (package Tron_IO) when ASCII.ESC => -- alla pressione del tasto escape sollevo l'eccezione STOP raise STOP; -- che mi termina il programma when others => -- catturo la pressione di altri tasti null; end case; when '2' => -- gioco a 2 giocatori case Tasto is -- spostamento in base alla tasto premuto dai 2 giocatori -- tasti del primo giocatore when 's' | 'S' => Sinistra(dir1); when 'd' | 'D' => Destra(dir1); -- tasti del secondo giocatore when 'k' | 'K' => Sinistra(dir2); when 'l' | 'L' => Destra(dir2); when ASCII.ESC => -- come sopra raise STOP; when others => -- come sopra null; end case; when others => -- serve solo per non far lamentere il compilatore -- la scelta al di fuori delle possibilita' e' gia' -- gestita nella procedura Schermata_principale (package Tron_IO) null; end case; delay Time2; end loop; exception when STOP => abort Task_1, Task_2; -- termino il programma end Getchar; -- corpo del task che visualizza a schermo il simbolo dei giocatori task body Writehash is begin loop begin dir1 := right; -- reset della situazione iniziale dir2 := left; x1 := 3; x2 := 78; y1 := 12; y2 := 12; schermata_principale(scelta, suspG, time1, x1, x2, y1, y2); -- vedi package Tron_IO Delay 2.0; case scelta is -- scelta del tipo di gioco when '1' => -- gioco contro il computer loop Avanti(1,x1,y1,dir1,'#'); -- vedi package Tron_IO Computer(3,x2,y2,dir2,'*',x1,y1,dir1); delay Time1; end loop; when '2' => -- gioco a 2 giocatori loop Avanti(1,x1,y1,dir1,'#'); Avanti(2,x2,y2,dir2,'*'); delay Time1; end loop; when ASCII.ESC => -- Termino il programa abort Task_1; clearscreen; -- pulisco lo schermo (vedi package Tron_IO) Movecursor(30,12); Put("ALLA PROSSIMA SFIDA!"); -- saluto i giocatori delay 2.0; clearscreen; movecursor(1,1); abort Task_2; when others => null; end case; exception when Scontro1 => -- scontro del giocatore 1 (vedi procedura scontro package Tron_IO) set_false(suspG); -- setto a falso suspG per sospendere il Task_1 Movecursor(1,23); -- sposto il cursore (vedi package Tron_IO) Put_line("Scontro del giocatore 1"); if scelta = '1' then Put_line("Vince il computer"); else Put_line("Vince il giocatore 2"); end if; Put_line("(Premi 2 volte Enter)"); -- 2 volte perche' il Task_1 prende il premi enter get_immediate(tasto); -- prendo il secondo enter when Scontro2 => -- scontro del giocatore 2 (vedi procedura scontro package Tron_IO) set_false(suspG); Movecursor(1,23); Put_line("Scontro del giocatore 2"); Put_line("Vince il giocatore 1"); Put_line("(Premi 2 volte Enter)"); get_immediate(tasto); when Scontro_computer => -- scontro del computer (vedi procedura scontro package Tron_IO) set_false(suspG); Movecursor(1,23); Put_line("Scontro del computer"); Put_line("Vince il giocatore 1"); Put_line("(Premi 2 volte Enter)"); get_immediate(tasto); end; end loop; end Writehash; begin Task_1.Startrunning; -- faccio partire esplicitamente il Task_1 end Princ_Tron;