Advertisement
Guest User

Untitled

a guest
May 26th, 2019
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 3.70 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.  
  7. procedure carreracaballos is
  8.    finCarrera : Boolean := False;
  9.    finEjecucion : Boolean := False;
  10.    T : Time; -- Controlar el tiempo
  11.    Periodo : Time_Span := Milliseconds(60);
  12.    caras : Integer; -- Caras del dado
  13.    N : Integer := 1; --Número de caballos
  14.    L : Integer; -- Distancia del ciruito
  15.    Max : constant Integer := 20; -- Máximo número de caballos permitido
  16.    -- Array para guardar las posiciones
  17.    type tipoPosiciones is array(Integer range 1..Max) of Integer;  
  18.    -- Array para los caballos
  19.  
  20.  
  21.    type tipoCaballos is array(Positive range 1..Max) of Character;
  22.    posiciones : tipoPosiciones := (others=>0);
  23.    caballos : tipoCaballos := (others=> ' ');
  24.    type Ciclo is mod 1;
  25.    Turno : Ciclo := 0;
  26.    
  27.    -- Movimiento de caballo
  28.    task caballo is
  29.       entry caballo;
  30.    end;
  31.    task body caballo is
  32.       distancia : Integer := 0;  -- Se almacena en el array de posiciones
  33.       nombre : Character := Character'Val(0); -- Se almacena en el array de caballos
  34.       identificador : Integer := 0;
  35.    begin
  36.       loop
  37.          accept caballo do
  38.             -- El array empieza en la posicion 1
  39.             identificador := (identificador) mod (N) + 1;
  40.             -- Convertimos el valor de la posición a un caracter segun la tabla ASCII
  41.             nombre := Character'Val(identificador);
  42.             -- Se le asigna un nombre al caballo
  43.             caballos(identificador) := nombre;
  44.             -- Generamos la distancia de manera aleatoria
  45.             distancia := Generate_Number(0, caras);
  46.             -- Actualizamos la distancia que ha recorrido el caballo
  47.             posiciones(identificador) := posiciones(identificador) + distancia;
  48.             -- Comprobar si un caballo ha alcanzado la meta
  49.             if (posiciones(identificador) >= L) then
  50.                finCarrera := True;
  51.             end if;
  52.          end caballo;
  53.          exit when (finEjecucion);
  54.       end loop;
  55.    end caballo;
  56.  
  57.    -- Al final de cada ronda el comentarista actualiza la posicion de los caballos
  58.    task comentarista is
  59.       entry comentarista;
  60.    end;
  61.  
  62.    task body comentarista is
  63.    begin
  64.       loop
  65.          accept comentarista  do
  66.             for i in 1..N loop
  67.                -- Imprimimos el nombre de los caballos
  68.                Put(caballos(i)'Image &" ");
  69.             end loop;
  70.             Put_Line(" ");
  71.             for i in 1..N loop
  72.                -- Imprimimos la distancia recorrida por cada caballo
  73.                Put(posiciones(i)'Image &" ");
  74.             end loop;
  75.          end comentarista;
  76.          exit loop when (finEjecucion);
  77.       end loop;
  78.    end comentarista;
  79.    
  80. begin
  81.    -- Introducimos los datos de la carrera
  82.    Put_Line("Introduza el numero de caballos: ");
  83.    Get(N);
  84.    Put_Line("Introduza la longitud de la pista: ");
  85.    Get(L);
  86.    Put_Line("Introduza el numero de caras del dado: ");
  87.    Get(caras);
  88.    T := Clock;
  89.    -- Se ejecutan los ciclos mientras no acabe la carrera
  90.    while (finCarrera = False) loop
  91.    -- Por cada caballo que participe en la carrera se realiza una llamada a la tarea caballo
  92.       for i in 1..N loop
  93.          T := T + Periodo;
  94.          Delay until (T);
  95.          caballo.caballo;
  96.       end loop;
  97.    -- Cuando se han desplazado todos los caballos el comentarista da sus posiciones
  98.       comentarista.comentarista;
  99.       Put_Line(" ");
  100.       Put_Line("Ha acabado un ciclo");
  101.    end loop;
  102.    Put_Line("Ha terminado la carrera");
  103.    finEjecucion := True;
  104. end carreracaballos;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement