jueves, 3 de marzo de 2011

Principales características de Ada

A continuación se enumeran las principales características de Ada:

a) Legibilidad: se reconoce que los programas profesionales se leen con mayor frecuencia de lo que son escritos. Por lo tanto es importante evitar una notación lacónica como en C, que permite escribir un programa rápidamente, pero que hace casi imposible entenderlo, excepto para el autor al poco tiempo de haberlo escrito.
b) Tipificación fuerte: esto asegura que cada objeto tiene un conjunto claramente definido de posibles valores y previene la confusión entre conceptos lógicamente distintos. Como consecuencia de esto, muchos errores pueden ser detectados en tiempo de compilación, en otros lenguajes esto podría conducir a programas ejecutables, pero incorrectos.
c) Programación en gran escala: se necesitan mecanismos de encapsulación, compilación separada y manejo de bibliotecas para escribir programas portables y mantenibles.
d) Manejo de excepciones: es un hecho que los programas raramente son correctos en un cien por ciento. Por este motivo se hace necesario proveer un medio por el cual los programas puedan ser construidos de forma tal que los errores en una parte de éste no repercutan en las demás.
e) Abstracción de datos: como ya se ha mencionado, se puede lograr mayor portabilidad y mantenibilidad si los detalles de la representación de los datos puede ser separada de la especificación de las operaciones lógicas sobre los datos.
f) Tareas: en muchos casos es importante que el programa sea concebido como una serie de actividades paralelas en lugar de una secuencia simple de acciones. Al entregar estas facilidades dentro del lenguaje y no a través de llamadas a un sistema operativo se logra una mayor portabilidad y mantenibilidad.
g) Unidades genéricas: es muchos casos la parte lógica de un programa es independiente de los tipos de valores que son manipulados. Por lo tanto se requiere de un mecanismo para la creación de partes lógicamente relacionadas a partir de un prototipo único. Esto es especialmente útil para la creación de bibliotecas.

Extractado por Eduardo Jara de J.G.P. Barnes. Programmining in Ada.

Super smash Peleas en adagraph

Buscando en Internet se puede encontrar este codigo de ejemplo de supersmash, me gusta la IA del rival.
Saludos querubines...

with Adagraph;use Adagraph;
with Ada.Integer_Text_Io;use Ada.Integer_Text_Io;
with ada.Text_IO;use ada.Text_IO;
procedure Super_Smash is
   X:Integer:=100;
   Y,Y1:Integer:=110;
   X1:Integer:=480;
   Guanyador:Boolean:=False;
   K:Character;
   Vida1,Vida2:Integer:=100;
   Ia:Boolean:=False;
   Ia1:Boolean:=False;
   Sortir:Boolean:=False;
   Color:Extended_Color_Type;
   procedure Menu_Seleccio(K:in out Character;Ia,Ia1,Sortir:in out Boolean) is
      i,j:integer;
   begin
      K:='.';
      Ia:=False;
      Ia1:=False;
      Sortir:=false;
      Open_Graph_Window(600,500);
      Clear_Window(Blue);
      Draw_Box(50,200,150,220,Green,True);
      Draw_Box(235,200,355,220,Green,True);
      Draw_Box(435,200,555,220,Green,True);
      Draw_Box(525,20,580,40,Green,True);
      Display_Text(55,205,"HUM VS HUM");
      Display_Text(240,205,"HUM VS IA EASY");
      Display_Text(440,205,"HUM VS IA HARD");
      Display_Text(530,25,"SORTIR");
      while not Ia and not Ia1 and not sortir and K/=' ' loop
         Get_Mouse_Button(Left_Button,I,J);
         if I>50 and J>200 and I<150  and J<220 then
            K:=' ';
         elsif I>235 and J>200 and I<355  and J<220 then
            Ia1:=True;
         elsif I>435 and J>200 and I<555  and J<220 then
            Ia:=True;
         elsif I>525 and J>20 and I<580  and J<40 then
            Sortir:=True;
         end if;
      end loop;
      close_graph_window;
   end Menu_Seleccio;
   procedure Inicialitzacio is
   begin
      Open_Graph_Window(600,500);
      Clear_Window(Light_Blue);
      Draw_Box(100,0,500,110,Green,True);
      Draw_Box(100,100,500,110,Brown,True);
      Draw_Box(150,180,250,190,Black,True);
      Draw_Box(350,180,450,190,Black,True);
      Draw_Circle(400,400,40,Yellow,True);
      Draw_Line(400,400,450,450,Yellow);
      Draw_Line(400,400,450,350,Yellow);
      Draw_Line(400,400,350,450,Yellow);
      Draw_Line(400,400,350,350,Yellow);
      Draw_Line(400,400,460,400,Yellow);
      Draw_Line(400,400,340,400,Yellow);
      Draw_Line(400,400,400,460,Yellow);
      Draw_line(400,400,400,340,yellow);
   end Inicialitzacio;
   procedure Dibuixar_Vida(Vida1,Vida2:in Integer) is
   begin
      Draw_Box(148,60,252,80,Black,True);
      Draw_Box(150,62,150+Vida1,78,Blue,True);
      Draw_Box(348,60,452,80,Black,True);
      Draw_Box(350,62,350+Vida2,78,Blue,True);
   end Dibuixar_Vida;
   procedure Dibuix_Personatge_Aturat(X,Y:in Integer) is
   begin
      Draw_Line(X,Y,X+10,Y+20);
      Draw_Line(X+10,Y+20,X+20,Y);
      Draw_Line(X+10,Y+20,X+10,Y+50);
      Draw_Line(X+10,Y+45,X,Y+25);
      Draw_Line(X+10,Y+45,X+20,Y+25);
      Draw_Circle(X+10,Y+55,10,Black,True);
   end Dibuix_Personatge_Aturat;
   procedure Cop_De_Puny_Dret(X,Y:in Integer) is
   begin
      Draw_Line(X,Y,X+10,Y+20,Light_Blue);
      Draw_Line(X+10,Y+20,X+20,Y,Light_Blue);
      Draw_Line(X+10,Y+20,X+10,Y+50,Light_Blue);
      Draw_Line(X+10,Y+45,X,Y+25,Light_Blue);
      Draw_Line(X+10,Y+45,X+20,Y+25,Light_Blue);
      Draw_Circle(X+10,Y+55,10,Light_Blue,True);
      Draw_Line(X,Y,X+10,Y+20);
      Draw_Line(X+10,Y+20,X+20,Y);
      Draw_Line(X+10,Y+20,X+10,Y+50);
      Draw_Line(X+10,Y+45,X,Y+25);
      Draw_Line(X+10,Y+45,X+20,Y+35);
      Draw_Line(X+20,Y+35,X+25,Y+40);
      Draw_Circle(X+10,Y+55,10,Black,True);
      delay 0.1;
      Draw_Line(X,Y,X+10,Y+20,Light_Blue);
      Draw_Line(X+10,Y+20,X+20,Y,Light_Blue);
      Draw_Line(X+10,Y+20,X+10,Y+50,Light_Blue);
      Draw_Line(X+10,Y+45,X,Y+25,Light_Blue);
      Draw_Line(X+10,Y+45,X+20,Y+35,Light_Blue);
      Draw_Line(X+20,Y+35,X+25,Y+40,Light_Blue);
      Draw_Circle(X+10,Y+55,10,Light_Blue,True);
      Draw_Line(X,Y,X+10,Y+20);
      Draw_Line(X+10,Y+20,X+20,Y);
      Draw_Line(X+10,Y+20,X+10,Y+50);
      Draw_Line(X+10,Y+45,X,Y+25);
      Draw_Line(X+10,Y+45,X+20,Y+25);
      Draw_Circle(X+10,Y+55,10,Black,True);
   end Cop_De_Puny_Dret;
   procedure Cop_De_Puny_Esquerre(X,Y:in Integer) is
   begin
      Draw_Line(X,Y,X+10,Y+20,Light_Blue);
      Draw_Line(X+10,Y+20,X+20,Y,Light_Blue);
      Draw_Line(X+10,Y+20,X+10,Y+50,Light_Blue);
      Draw_Line(X+10,Y+45,X,Y+25,Light_Blue);
      Draw_Line(X+10,Y+45,X+20,Y+25,Light_Blue);
      Draw_Circle(X+10,Y+55,10,Light_Blue,True);
      Draw_Line(X,Y,X+10,Y+20);
      Draw_Line(X+10,Y+20,X+20,Y);
      Draw_Line(X+10,Y+20,X+10,Y+50);
      Draw_Line(X+10,Y+45,X,Y+35);
      Draw_Line(X,Y+35,X-5,Y+40);
      Draw_Line(X+10,Y+45,X+20,Y+25);
      Draw_Circle(X+10,Y+55,10,Black,True);
      delay 0.1;
      Draw_Line(X,Y,X+10,Y+20,Light_Blue);
      Draw_Line(X+10,Y+20,X+20,Y,Light_Blue);
      Draw_Line(X+10,Y+20,X+10,Y+50,Light_Blue);
      Draw_Line(X+10,Y+45,X,Y+35,Light_Blue);
      Draw_Line(X,Y+35,X-5,Y+40,Light_Blue);
      Draw_Line(X+10,Y+45,X+20,Y+25,Light_Blue);
      Draw_Circle(X+10,Y+55,10,Light_Blue,True);
      Draw_Line(X,Y,X+10,Y+20);
      Draw_Line(X+10,Y+20,X+20,Y);
      Draw_Line(X+10,Y+20,X+10,Y+50);
      Draw_Line(X+10,Y+45,X,Y+25);
      Draw_Line(X+10,Y+45,X+20,Y+25);
      Draw_Circle(X+10,Y+55,10,Black,True);
   end Cop_De_Puny_Esquerre;
   procedure Bot_Dreta(X,Y:in Integer;POSX,POSY:out integer) is
   begin
      Draw_Line(X,Y,X+10,Y+20,Light_Blue);
      Draw_Line(X+10,Y+20,X+20,Y,Light_Blue);
      Draw_Line(X+10,Y+20,X+10,Y+50,Light_Blue);
      Draw_Line(X+10,Y+45,X,Y+25,Light_Blue);
      Draw_Line(X+10,Y+45,X+20,Y+25,Light_Blue);
      Draw_Circle(X+10,Y+55,10,Light_Blue,True);
      delay 0.03;
      POSX:=X+40;
      POSY:=Y+80;
      Draw_Line(POSX,POSY,POSX+10,POSY+20);
      Draw_Line(POSX+10,POSY+20,POSX+20,POSY);
      Draw_Line(POSX+10,POSY+20,POSX+10,POSY+50);
      Draw_Line(POSX+10,POSY+45,POSX,POSY+25);
      Draw_Line(POSX+10,POSY+45,POSX+20,POSY+25);
      Draw_Circle(POSX+10,POSY+55,10,Black,True);
   end Bot_Dreta;
   procedure Bot_Esquerra(X,Y:in Integer;Posx,Posy:out Integer) is
   begin
      Draw_Line(X,Y,X+10,Y+20,Light_Blue);
      Draw_Line(X+10,Y+20,X+20,Y,Light_Blue);
      Draw_Line(X+10,Y+20,X+10,Y+50,Light_Blue);
      Draw_Line(X+10,Y+45,X,Y+25,Light_Blue);
      Draw_Line(X+10,Y+45,X+20,Y+25,Light_Blue);
      Draw_Circle(X+10,Y+55,10,Light_Blue,True);
      delay 0.03;
      POSX:=X-40;
      POSY:=Y+80;
      Draw_Line(POSX,POSY,POSX+10,POSY+20);
      Draw_Line(POSX+10,POSY+20,POSX+20,POSY);
      Draw_Line(POSX+10,POSY+20,POSX+10,POSY+50);
      Draw_Line(POSX+10,POSY+45,POSX,POSY+25);
      Draw_Line(POSX+10,POSY+45,POSX+20,POSY+25);
      Draw_Circle(POSX+10,POSY+55,10,Black,True);
   end Bot_Esquerra;
   procedure Efecte_Gravetat(X,Y:in out Integer) is
   begin
      Draw_Line(X,Y,X+10,Y+20,Light_Blue);
      Draw_Line(X+10,Y+20,X+20,Y,Light_Blue);
      Draw_Line(X+10,Y+20,X+10,Y+50,Light_Blue);
      Draw_Line(X+10,Y+45,X,Y+25,Light_Blue);
      Draw_Line(X+10,Y+45,X+20,Y+25,Light_Blue);
      Draw_Circle(X+10,Y+55,10,Light_Blue,True);
      if Y>190 then
         Y:=Y-80;
      end if;
      if Y>110 and (X+20<150 or (X>250 and X+20<350) or X>450) then
         Y:=Y-80;
      end if;
      if Y=110 and (X<100 or X>500) then
         Y:=Y-110;
      end if;
      Draw_Line(X,Y,X+10,Y+20);
      Draw_Line(X+10,Y+20,X+20,Y);
      Draw_Line(X+10,Y+20,X+10,Y+50);
      Draw_Line(X+10,Y+45,X,Y+25);
      Draw_Line(X+10,Y+45,X+20,Y+25);
      Draw_Circle(X+10,Y+55,10,Black,True);
   end Efecte_Gravetat;
   procedure Moure_Dreta(X,Y:in out Integer) is
   begin
      Draw_Line(X,Y,X+10,Y+20,Light_Blue);
      Draw_Line(X+10,Y+20,X+20,Y,Light_Blue);
      Draw_Line(X+10,Y+20,X+10,Y+50,Light_Blue);
      Draw_Line(X+10,Y+45,X,Y+25,Light_Blue);
      Draw_Line(X+10,Y+45,X+20,Y+25,Light_Blue);
      Draw_Circle(X+10,Y+55,10,Light_Blue,True);
      Draw_Line(X+10,Y+20,X+20,Y);
      Draw_Line(X+10,Y+20,X+10,Y+50);
      Draw_Line(X+10,Y+45,X,Y+25);
      Draw_Line(X+10,Y+45,X+20,Y+25);
      Draw_Circle(X+10,Y+55,10,Black,True);
      delay 0.1;
      Draw_Line(X+10,Y+20,X+20,Y,Light_Blue);
      Draw_Line(X+10,Y+20,X+10,Y+50,Light_Blue);
      Draw_Line(X+10,Y+45,X,Y+25,Light_Blue);
      Draw_Line(X+10,Y+45,X+20,Y+25,Light_Blue);
      Draw_Circle(X+10,Y+55,10,Light_Blue,True);
      delay 0.1;
      X:=X+20;
      Draw_Line(X,Y,X+10,Y+20);
      Draw_Line(X+10,Y+20,X+20,Y);
      Draw_Line(X+10,Y+20,X+10,Y+50);
      Draw_Line(X+10,Y+45,X,Y+25);
      Draw_Line(X+10,Y+45,X+20,Y+25);
      Draw_Circle(X+10,Y+55,10,Black,True);
   end Moure_Dreta;
   procedure Moure_Esquerra(X,Y:in out Integer) is
   begin
      Draw_Line(X,Y,X+10,Y+20,Light_Blue);
      Draw_Line(X+10,Y+20,X+20,Y,Light_Blue);
      Draw_Line(X+10,Y+20,X+10,Y+50,Light_Blue);
      Draw_Line(X+10,Y+45,X,Y+25,Light_Blue);
      Draw_Line(X+10,Y+45,X+20,Y+25,Light_Blue);
      Draw_Circle(X+10,Y+55,10,Light_Blue,True);
      Draw_Line(X,Y,X+10,Y+20);
      Draw_Line(X+10,Y+20,X+10,Y+50);
      Draw_Line(X+10,Y+45,X,Y+25);
      Draw_Line(X+10,Y+45,X+20,Y+25);
      Draw_Circle(X+10,Y+55,10,Black,True);
      delay 0.1;
      Draw_Line(X,Y,X+10,Y+20,Light_Blue);
      Draw_Line(X+10,Y+20,X+10,Y+50,Light_Blue);
      Draw_Line(X+10,Y+45,X,Y+25,Light_Blue);
      Draw_Line(X+10,Y+45,X+20,Y+25,Light_Blue);
      Draw_Circle(X+10,Y+55,10,Light_Blue,True);
      delay 0.1;
      X:=X-20;
      Draw_Line(X,Y,X+10,Y+20);
      Draw_Line(X+10,Y+20,X+20,Y);
      Draw_Line(X+10,Y+20,X+10,Y+50);
      Draw_Line(X+10,Y+45,X,Y+25);
      Draw_Line(X+10,Y+45,X+20,Y+25);
      Draw_Circle(X+10,Y+55,10,Black,True);
   end Moure_Esquerra;
   procedure Evaluar_Si_Ferit_Dreta(A,B,Y,Y1,Vida:in out Integer) is
   begin
      if B-A=20 and Y=Y1 then
         Draw_Line(B,Y,B+10,Y+20,Light_Blue);
         Draw_Line(B+10,Y+20,B+20,Y,Light_Blue);
         Draw_Line(B+10,Y+20,B+10,Y+50,Light_Blue);
         Draw_Line(B+10,Y+45,B,Y+25,Light_Blue);
         Draw_Line(B+10,Y+45,B+20,Y+25,Light_Blue);
         Draw_Circle(B+10,Y+55,10,Light_Blue,True);
         Draw_Line(B,Y,B+10,Y+20);
         Draw_Line(B+10,Y+20,B+20,Y);
         Draw_Line(B+10,Y+20,B+10,Y+50);
         Draw_Line(B+10,Y+45,B,Y+25);
         Draw_Line(B+10,Y+45,B+20,Y+25);
         Draw_Circle(B+10,Y+55,10,Black,True);
         Draw_Circle(B+10,Y+40,5,Red,True);
         delay 0.02;
         Draw_Line(B,Y,B+10,Y+20,Light_Blue);
         Draw_Line(B+10,Y+20,B+20,Y,Light_Blue);
         Draw_Line(B+10,Y+20,B+10,Y+50,Light_Blue);
         Draw_Line(B+10,Y+45,B,Y+25,Light_Blue);
         Draw_Line(B+10,Y+45,B+20,Y+25,Light_Blue);
         Draw_Circle(B+10,Y+55,10,Light_Blue,True);
         Draw_Circle(B+10,Y+40,5,Light_Blue,True);
         B:=B+20;
         Draw_Line(B,Y,B+10,Y+20);
         Draw_Line(B+10,Y+20,B+20,Y);
         Draw_Line(B+10,Y+20,B+10,Y+50);
         Draw_Line(B+10,Y+45,B,Y+25);
         Draw_Line(B+10,Y+45,B+20,Y+25);
         Draw_Circle(B+10,Y+55,10,Black,True);
         Vida:=Vida-10;
      end if;
   end Evaluar_Si_Ferit_Dreta;
   procedure Evaluar_Si_Ferit_Esquerra(A,B,Y,Y1,Vida:in out Integer) is
   begin
      if (A-B)=20 and Y=Y1 then
         Draw_Line(B,Y,B+10,Y+20,Light_Blue);
         Draw_Line(B+10,Y+20,B+20,Y,Light_Blue);
         Draw_Line(B+10,Y+20,B+10,Y+50,Light_Blue);
         Draw_Line(B+10,Y+45,B,Y+25,Light_Blue);
         Draw_Line(B+10,Y+45,B+20,Y+25,Light_Blue);
         Draw_Circle(B+10,Y+55,10,Light_Blue,True);
         Draw_Line(B,Y,B+10,Y+20);
         Draw_Line(B+10,Y+20,B+20,Y);
         Draw_Line(B+10,Y+20,B+10,Y+50);
         Draw_Line(B+10,Y+45,B,Y+25);
         Draw_Line(B+10,Y+45,B+20,Y+25);
         Draw_Circle(B+10,Y+55,10,Black,True);
         Draw_Circle(B+10,Y+40,5,Red,True);
         delay 0.02;
         Draw_Line(B,Y,B+10,Y+20,Light_Blue);
         Draw_Line(B+10,Y+20,B+20,Y,Light_Blue);
         Draw_Line(B+10,Y+20,B+10,Y+50,Light_Blue);
         Draw_Line(B+10,Y+45,B,Y+25,Light_Blue);
         Draw_Line(B+10,Y+45,B+20,Y+25,Light_Blue);
         Draw_Circle(B+10,Y+55,10,Light_Blue,True);
         Draw_Circle(B+10,Y+40,5,Light_Blue,True);
         B:=B-20;
         Draw_Line(B,Y,B+10,Y+20);
         Draw_Line(B+10,Y+20,B+20,Y);
         Draw_Line(B+10,Y+20,B+10,Y+50);
         Draw_Line(B+10,Y+45,B,Y+25);
         Draw_Line(B+10,Y+45,B+20,Y+25);
         Draw_Circle(B+10,Y+55,10,Black,True);
         Vida:=Vida-10;
      end if;
   end Evaluar_Si_Ferit_Esquerra;
begin
   while not Sortir loop
      Menu_Seleccio(K,Ia,Ia1,Sortir);
      if ia then
         Inicialitzacio;
         Dibuixar_Vida(Vida1,Vida2);
         X:=100;
         Y:=110;
         Y1:=110;
         X1:=480;
         Guanyador:=False;
         Dibuix_Personatge_Aturat(X,Y);
         Dibuix_Personatge_Aturat(X1,Y1);
         while not Guanyador loop
            K:=Get_Key;
            if K='a' then
               Moure_Esquerra(X,Y);
               Efecte_Gravetat(X,Y);
            elsif K='d' then
               Moure_Dreta(X,Y);
               Efecte_Gravetat(X,Y);
            elsif K='q' then
               Bot_Esquerra(X,Y,X,Y);
               delay 0.05;
               Efecte_Gravetat(X,Y);
            elsif K='e' then
               Bot_Dreta(X,Y,X,Y);
               delay 0.05;
               Efecte_Gravetat(X,Y);
            elsif K='w' then
               Cop_De_Puny_Dret(X,Y);
               Evaluar_Si_Ferit_Dreta(X,X1,Y,Y1,Vida2);
               Dibuixar_Vida(Vida1,Vida2);
               Efecte_Gravetat(X1,Y1);
            elsif K='s' then
               Cop_De_Puny_Esquerre(X,Y);
               Evaluar_Si_Ferit_Esquerra(X,X1,Y,Y1,Vida2);
               Dibuixar_Vida(Vida1,Vida2);
               Efecte_Gravetat(X1,Y1);
            end if;
            while not key_hit and not guanyador loop
               Put_Pixel(1,1,Random_Color);
               Color:=Get_Pixel(1,1);
               if (X1-X)>20 and (color=black or color=blue or color=green or color=cyan or color=red or color=magenta or color=brown or color=light_gray or color=dark_gray) then
                  Moure_Esquerra(X1,Y1);
                  Efecte_Gravetat(X1,Y1);
               elsif (X1-X)>20 and (Color=Light_Blue or Color=Light_Green or Color=Light_Cyan or Color=Light_Red) then
                  Bot_Esquerra(X1,Y1,X1,Y1);
                  delay 0.05;
                  Efecte_Gravetat(X1,Y1);
               elsif (X1-X)>20 and (Color=Light_Magenta or Color=Yellow or Color=White)then
                  null;
               end if;
               if (X-X1)>20 and (color=black or color=blue or color=green or color=cyan or color=red or color=magenta or color=brown or color=light_gray or color=dark_gray) then
                  Moure_Dreta(X1,Y1);
                  Efecte_Gravetat(X1,Y1);
               elsif (X-X1)>20 and (Color=Light_Blue or Color=Light_Green or Color=Light_Cyan or Color=Light_Red) then
                  Bot_Dreta(X1,Y1,X1,Y1);
                  delay 0.05;
                  Efecte_Gravetat(X1,Y1);
               elsif (X-X1)>20 and (Color=Light_Magenta or Color=Yellow or Color=White) then
                  null;
               end if;
               if (X1-X)=20 and (color=black or color=blue or color=green or color=cyan or color=red or color=magenta or color=brown or color=light_gray) then
                  Cop_De_Puny_Esquerre(X1,Y1);
                  Evaluar_Si_Ferit_Esquerra(X1,X,Y,Y1,Vida1);
                  Dibuixar_Vida(Vida1,Vida2);
                  Efecte_Gravetat(X,Y);
               elsif (X1-X)=20 and (Color=Light_Blue or Color=Light_Green or Color=Light_Cyan) then
                  Moure_Esquerra(X1,Y1);
                  Efecte_Gravetat(X1,Y1);
               elsif (X1-X)=20 and (Color=Light_Magenta or Color=Yellow or Color=White) then
                  Moure_Dreta(X1,Y1);
                  Efecte_Gravetat(X1,Y1);
               elsif  (X1-X)=20 and (Color=Dark_Gray or Color=Light_Red) then
                  null;
               end if;
               if (X1-X)=-20 and (color=black or color=blue or color=green or color=cyan or color=red or color=magenta or color=brown or color=light_gray) then
                  Cop_De_Puny_Dret(X1,Y1);
                  Evaluar_Si_Ferit_Dreta(X1,X,Y,Y1,Vida1);
                  Dibuixar_Vida(Vida1,Vida2);
                  Efecte_Gravetat(X,Y);
               elsif (X1-X)=-20 and (Color=Light_Blue or Color=Light_Green or Color=Light_Cyan) then
                  Moure_Dreta(X1,Y1);
                  Efecte_Gravetat(X1,Y1);
               elsif (X1-X)=-20 and (Color=Light_Magenta or Color=Yellow or Color=White) then
                  Moure_Esquerra(X1,Y1);
                  Efecte_Gravetat(X1,Y1);
               elsif  (X1-X)=-20 and (Color=Dark_Gray or Color=Light_Red) then
                  null;
               end if;
               if X=X1 and (color=black or color=blue or color=green or color=cyan or color=red or color=magenta or color=brown or color=light_gray or color=dark_gray) then
                  Bot_Esquerra(X1,Y1,X1,Y1);
                  delay 0.05;
                  Efecte_Gravetat(X1,Y1);
               elsif X=X1 and (Color=Light_Blue or Color=Light_Green or Color=Light_Cyan or Color=Light_Red or Color=Light_Magenta or Color=Yellow or Color=White) then
                  Bot_Dreta(X1,Y1,X1,Y1);
                  delay 0.05;
                  Efecte_Gravetat(X1,Y1);
               end if;
               if Y=0 or Y1=0 or Vida1<=0 or Vida2<=0 then
                  Guanyador:=True;
               end if;
            end loop;
         end loop;
      elsif ia1 then
         Inicialitzacio;
         Dibuixar_Vida(Vida1,Vida2);
         X:=100;
         Y:=110;
         Y1:=110;
         X1:=480;
         Guanyador:=False;
         Dibuix_Personatge_Aturat(X,Y);
         Dibuix_Personatge_Aturat(X1,Y1);
         while not Guanyador loop
            K:=Get_Key;
            if K='a' then
               Moure_Esquerra(X,Y);
               Efecte_Gravetat(X,Y);
            elsif K='d' then
               Moure_Dreta(X,Y);
               Efecte_Gravetat(X,Y);
            elsif K='q' then
               Bot_Esquerra(X,Y,X,Y);
               delay 0.05;
               Efecte_Gravetat(X,Y);
            elsif K='e' then
               Bot_Dreta(X,Y,X,Y);
               delay 0.05;
               Efecte_Gravetat(X,Y);
            elsif K='w' then
               Cop_De_Puny_Dret(X,Y);
               Evaluar_Si_Ferit_Dreta(X,X1,Y,Y1,Vida2);
               Dibuixar_Vida(Vida1,Vida2);
               Efecte_Gravetat(X1,Y1);
            elsif K='s' then
               Cop_De_Puny_Esquerre(X,Y);
               Evaluar_Si_Ferit_Esquerra(X,X1,Y,Y1,Vida2);
               Dibuixar_Vida(Vida1,Vida2);
               Efecte_Gravetat(X1,Y1);
            end if;
            while not key_hit and not guanyador loop
               Put_Pixel(1,1,Random_Color);
               Color:=Get_Pixel(1,1);
               if (X1-X)>20 and (color=black or color=blue or color=green or color=cyan or color=red or color=magenta or color=brown or color=light_gray or color=dark_gray) then
                  Moure_Esquerra(X1,Y1);
                  Efecte_Gravetat(X1,Y1);
               elsif (X1-X)>20 and (Color=Light_Blue or Color=Light_Green or Color=Light_Cyan or Color=Light_Red) then
                  Bot_Esquerra(X1,Y1,X1,Y1);
                  delay 0.05;
                  Efecte_Gravetat(X1,Y1);
               elsif (X1-X)>20 and (Color=Light_Magenta or Color=Yellow or Color=White)then
                  null;
               end if;
               if (X-X1)>20 and (color=black or color=blue or color=green or color=cyan or color=red or color=magenta or color=brown or color=light_gray or color=dark_gray) then
                  Moure_Dreta(X1,Y1);
                  Efecte_Gravetat(X1,Y1);
               elsif (X-X1)>20 and (Color=Light_Blue or Color=Light_Green or Color=Light_Cyan or Color=Light_Red) then
                  Bot_Dreta(X1,Y1,X1,Y1);
                  delay 0.05;
                  Efecte_Gravetat(X1,Y1);
               elsif (X-X1)>20 and (Color=Light_Magenta or Color=Yellow or Color=White) then
                  null;
               end if;
               if (X1-X)=20 and (color=black or color=blue or color=green or color=cyan) then
                  Cop_De_Puny_Esquerre(X1,Y1);
                  Evaluar_Si_Ferit_Esquerra(X1,X,Y,Y1,Vida1);
                  Dibuixar_Vida(Vida1,Vida2);
                  Efecte_Gravetat(X,Y);
               elsif (X1-X)=20 and (Color=Light_Blue or Color=Light_Green or Color=Light_Cyan) then
                  Moure_Esquerra(X1,Y1);
                  Efecte_Gravetat(X1,Y1);
               elsif (X1-X)=20 and (Color=Light_Magenta or Color=Yellow or Color=White) then
                  Moure_Dreta(X1,Y1);
                  Efecte_Gravetat(X1,Y1);
               elsif  (X1-X)=20 and (Color=Brown or Color=Light_Gray or Color=Dark_Gray or Color=Light_Red or Color=Red or Color=Magenta) then
                  null;
               end if;
               if (X1-X)=-20 and (color=black or color=blue or color=green or color=cyan) then
                  Cop_De_Puny_Dret(X1,Y1);
                  Evaluar_Si_Ferit_Dreta(X1,X,Y,Y1,Vida1);
                  Dibuixar_Vida(Vida1,Vida2);
                  Efecte_Gravetat(X,Y);
               elsif (X1-X)=-20 and (Color=Light_Blue or Color=Light_Green or Color=Light_Cyan) then
                  Moure_Dreta(X1,Y1);
                  Efecte_Gravetat(X1,Y1);
               elsif (X1-X)=-20 and (Color=Light_Magenta or Color=Yellow or Color=White) then
                  Moure_Esquerra(X1,Y1);
                  Efecte_Gravetat(X1,Y1);
               elsif  (X1-X)=20 and (Color=Brown or Color=Light_Gray or Color=Dark_Gray or Color=Light_Red or Color=Red or Color=Magenta) then
                  null;
               end if;
               if X=X1 and (color=black or color=blue or color=green or color=cyan or color=brown or color=light_gray or color=dark_gray) then
                  Bot_Esquerra(X1,Y1,X1,Y1);
                  delay 0.05;
                  Efecte_Gravetat(X1,Y1);
               elsif X=X1 and (Color=Light_Blue or Color=Light_Green or Color=Light_Cyan or Color=Light_Red or Color=Light_Magenta or Color=Yellow or Color=White or color=red or color=magenta) then
                  Bot_Dreta(X1,Y1,X1,Y1);
                  delay 0.05;
                  Efecte_Gravetat(X1,Y1);
               end if;
               if Y=0 or Y1=0 or Vida1<=0 or Vida2<=0 then
                  Guanyador:=True;
               end if;
            end loop;
         end loop;
      elsif K=' ' then
         Inicialitzacio;
         Dibuixar_Vida(Vida1,Vida2);
         X:=100;
         Y:=110;
         Y1:=110;
         X1:=480;
         Guanyador:=False;
         Dibuix_Personatge_Aturat(X,Y);
         Dibuix_Personatge_Aturat(X1,Y1);
         while not Guanyador loop
            K:=Get_Key;
            if K='a' then
               Moure_Esquerra(X,Y);
               Efecte_Gravetat(X,Y);
            elsif K='d' then
               Moure_Dreta(X,Y);
               Efecte_Gravetat(X,Y);
            elsif K='q' then
               Bot_Esquerra(X,Y,X,Y);
               delay 0.05;
               Efecte_Gravetat(X,Y);
            elsif K='e' then
               Bot_Dreta(X,Y,X,Y);
               delay 0.05;
               Efecte_Gravetat(X,Y);
            elsif K='w' then
               Cop_De_Puny_Dret(X,Y);
               Evaluar_Si_Ferit_Dreta(X,X1,Y,Y1,Vida2);
               Dibuixar_Vida(Vida1,Vida2);
               Efecte_Gravetat(X1,Y1);
            elsif K='s' then
               Cop_De_Puny_Esquerre(X,Y);
               Evaluar_Si_Ferit_Esquerra(X,X1,Y,Y1,Vida2);
               Dibuixar_Vida(Vida1,Vida2);
               Efecte_Gravetat(X1,Y1);
            end if;
            if K='j' then
               Moure_Esquerra(X1,Y1);
               Efecte_Gravetat(X1,Y1);
            elsif K='l' then
               Moure_Dreta(X1,Y1);
               Efecte_Gravetat(X1,Y1);
            elsif K='u' then
               Bot_Esquerra(X1,Y1,X1,Y1);
               delay 0.05;
               Efecte_Gravetat(X1,Y1);
            elsif K='o' then
               Bot_Dreta(X1,Y1,X1,Y1);
               delay 0.05;
               Efecte_Gravetat(X1,Y1);
            elsif K='i' then
               Cop_De_Puny_Dret(X1,Y1);
               Evaluar_Si_Ferit_Dreta(X1,X,Y,Y1,Vida1);
               Dibuixar_Vida(Vida1,Vida2);
               Efecte_Gravetat(X,Y);
            elsif K='k' then
               Cop_De_Puny_Esquerre(X1,Y1);
               Evaluar_Si_Ferit_Esquerra(X1,X,Y,Y1,Vida1);
               Dibuixar_Vida(Vida1,Vida2);
               Efecte_Gravetat(X,Y);
            end if;
            if Y=0 or Y1=0 or Vida1<=0 or Vida2<=0 then
               Guanyador:=True;
            end if;
         end loop;
      end if;
      if Y=0 or Vida1<=0 then
         if Vida1<=0 then
            Draw_Circle(X+10,Y+40,30,Red,True);
         end if;
         Display_Text(100,260,"GUANYADOR EL JUGADOR 2",Red);
      else
         if Vida2<=0 then
            Draw_Circle(X1+10,Y1+40,15,Red,True);
         end if;
         Display_Text(100,260,"GUANYADOR EL JUGADOR 1",Red);
      end if;
      Vida1:=100;
      Vida2:=100;
      delay 3.0;
      if not Sortir then
         Close_Graph_Window;
      end if;
   end loop;
end super_smash;

Cabeceras de Ada

Coloco estas lineas para que el search engine nos encuentre cuando busquen cosas de Ada:

with Adagraph;
use Adagraph;
with Ada.Numerics.Discrete_Random;
use Ada.Numerics;

Como generar numeros aleatorios en Ada

--Extraido de la pagina 172 de Ada_Programming.pdf para generar numeros aleatorios

function Generate_Number (MaxValue : Integer) return Integer is
subtype Random_Type is Integer range 0 .. MaxValue;
package Random_Pack is new Ada.Numerics.Discrete_Random (Random_Type);
G : Random_Pack.Generator;
begin
Random_Pack.Reset (G);
return Random_Pack.Random (G);
end Generate_Number;
function Generate_Number (MinValue : Integer;
MaxValue : Integer) return Integer
is
subtype Random_Type is Integer range MinValue .. MaxValue;
package Random_Pack is new Ada.Numerics.Discrete_Random (Random_Type);
G : Random_Pack.Generator;
begin
   Random_Pack.Reset (G);
    return Random_Pack.Random (G);
  
end Generate_Number;

Proyectos en Ada, Adagraph

Necesitas presentar un proyecto usando Adagraph? Estas desesperado porque se acerca la fecha de entrega?
No desespereis, contactanos y te haremos un proyecto para la universidad.
Deja tus datos en los comentarios o llamanos al telefono: 76404338