Advertisement
Guest User

Untitled

a guest
May 29th, 2019
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 4.07 KB | None | 0 0
  1. with Ada.Real_Time; use Ada.Real_Time;
  2. with Ada.Text_IO; use Ada.Text_IO;
  3. with generarAleatorio; use generarAleatorio;
  4. with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
  5. with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
  6. procedure carreraCaballosMod is
  7.  
  8.    finCarrera : Boolean := False;
  9.    T : Time; -- Controlar el tiempo
  10.    Periodo : Time_Span := Milliseconds(10); -- Tiempo de cada ciclo
  11.    distancia : Integer := 0;
  12.    caras : Integer; -- Caras del dado
  13.    L : Integer; -- Distancia del ciruito
  14.    N : Integer := 4; --Número de caballos
  15.    Max : constant Integer := 4; -- Máximo número de caballos permitido
  16.    type Ciclo is mod 6;
  17.    Turno : Ciclo := 0;
  18.    ganador : Character := ' ';
  19.    -- Array para guardar las posiciones
  20.    type tipoPosiciones is array(Integer range 1..Max) of Integer;
  21.    -- Array para los caballos
  22.    type tipoCaballos is array(Positive range 1..Max) of Character;
  23.    posiciones : tipoPosiciones := (others=>0);
  24.    caballos : tipoCaballos := ('A', 'B', 'C', 'D');
  25.  
  26.    -- Caballo 1
  27.    task C1 is
  28.       entry C1;
  29.    end;
  30.    task body C1 is
  31.    begin
  32.       distancia := 0;
  33.       loop
  34.          accept C1 do
  35.             distancia := Generate_Number(1, caras);
  36.             posiciones(1) := posiciones(1) + distancia;
  37.          end C1;
  38.          exit when finCarrera;
  39.       end loop;
  40.    end C1;
  41.    -- Caballo 2
  42.    task C2 is
  43.       entry C2;
  44.    end;
  45.    task body C2 is
  46.    begin
  47.       distancia := 0;
  48.       loop
  49.          accept C2 do
  50.             distancia := Generate_Number(1, caras);
  51.             posiciones(2) := posiciones(2) + distancia;
  52.          end C2;
  53.          exit when finCarrera;
  54.       end loop;
  55.    end C2;
  56.    -- Caballo 3
  57.    task C3 is
  58.       entry C3;
  59.    end;
  60.    task body C3 is
  61.    begin
  62.       distancia := 0;
  63.       loop
  64.          accept C3 do
  65.             distancia := Generate_Number(1, caras);
  66.             posiciones(3) := posiciones(3) + distancia;
  67.          end C3;
  68.          exit when finCarrera;
  69.       end loop;
  70.    end C3;
  71.    
  72.    -- Caballo 4
  73.    task C4 is
  74.       entry C4;
  75.    end;
  76.    task body C4 is
  77.    begin
  78.       distancia := 0;
  79.       loop
  80.          accept C4 do
  81.             distancia := Generate_Number(1, caras);
  82.             posiciones(4) := posiciones(4) + distancia;
  83.          end C4;
  84.          exit when finCarrera;
  85.       end loop;
  86.    end C4;
  87.  
  88.    -- Al final de cada ronda el comentarista actualiza la posicion de los caballos
  89.    task comentarista is
  90.       entry comentarista;
  91.    end;
  92.  
  93.    task body comentarista is
  94.    begin
  95.       loop
  96.          accept comentarista  do
  97.             Put_Line(" ");
  98.             for i in 1..N loop
  99.                Put(caballos(i)'Image &" "); -- Imprimimos el nombre de los caballos
  100.             end loop;
  101.             Put_Line(" ");
  102.             for i in 1..N loop
  103.                Put(posiciones(i)'Image &" "); -- Imprimimos la distancia recorrida por cada caballo
  104.                if (posiciones(i) >= L) then -- Comprueba si un caballo ha llegado a la meta
  105.                   finCarrera := true;
  106.                   ganador := caballos(i);
  107.                end if;
  108.             end loop;
  109.          end comentarista;
  110.          exit when finCarrera;
  111.       end loop;
  112.    end comentarista;
  113.    
  114. begin
  115.    -- Introducimos los datos de la carrera
  116.    Put_Line("Introduza la longitud de la pista: ");
  117.    Get(L);
  118.    Put_Line("Introduza el numero de caras del dado: ");
  119.    Get(caras);
  120.    T := Clock;
  121.    for i in 1..20 loop
  122.    while (finCarrera = False) loop
  123.          T := T + Periodo;
  124.          Delay until (T);
  125.          case Turno is
  126.             -- Se ejecutan las tareas en funcion de la planificacion temporal
  127.             when 0 => C1.C1; C2.C2; C3.C3; C4.C4;
  128.             when 1 => C1.C1; C2.C2;
  129.             when 2 => C1.C1; C3.C3;
  130.             when 3 => C1.C1; C2.C2; C4.C4;
  131.             when 4 => C1.C1; C3.C3;
  132.             when 5 => C1.C1; comentarista.comentarista;
  133.          end case;
  134.          Turno := Turno + 1;
  135.       end loop;
  136.    end loop;
  137.    Put_Line(" ");
  138.    Put_Line("Ha terminado la carrera");
  139.    Put_Line("El ganador es "&ganador'Img);
  140. end carreraCaballosMod;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement