Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- with Ada.Real_Time; use Ada.Real_Time;
- with Ada.Text_IO; use Ada.Text_IO;
- with generarAleatorio; use generarAleatorio;
- with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
- with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
- procedure carreracaballos is
- finCarrera : Boolean := False;
- finEjecucion : Boolean := False;
- T : Time; -- Controlar el tiempo
- Periodo : Time_Span := Milliseconds(60);
- caras : Integer; -- Caras del dado
- N : Integer := 1; --Número de caballos
- L : Integer; -- Distancia del ciruito
- Max : constant Integer := 20; -- Máximo número de caballos permitido
- -- Array para guardar las posiciones
- type tipoPosiciones is array(Integer range 1..Max) of Integer;
- -- Array para los caballos
- type tipoCaballos is array(Positive range 1..Max) of Character;
- posiciones : tipoPosiciones := (others=>0);
- caballos : tipoCaballos := (others=> ' ');
- type Ciclo is mod 1;
- Turno : Ciclo := 0;
- -- Movimiento de caballo
- task caballo is
- entry caballo;
- end;
- task body caballo is
- distancia : Integer := 0; -- Se almacena en el array de posiciones
- nombre : Character := Character'Val(0); -- Se almacena en el array de caballos
- identificador : Integer := 0;
- begin
- loop
- accept caballo do
- -- El array empieza en la posicion 1
- identificador := (identificador) mod (N) + 1;
- -- Convertimos el valor de la posición a un caracter segun la tabla ASCII
- nombre := Character'Val(identificador);
- -- Se le asigna un nombre al caballo
- caballos(identificador) := nombre;
- -- Generamos la distancia de manera aleatoria
- distancia := Generate_Number(0, caras);
- -- Actualizamos la distancia que ha recorrido el caballo
- posiciones(identificador) := posiciones(identificador) + distancia;
- -- Comprobar si un caballo ha alcanzado la meta
- if (posiciones(identificador) >= L) then
- finCarrera := True;
- end if;
- end caballo;
- exit when (finEjecucion);
- end loop;
- end caballo;
- -- Al final de cada ronda el comentarista actualiza la posicion de los caballos
- task comentarista is
- entry comentarista;
- end;
- task body comentarista is
- begin
- loop
- accept comentarista do
- for i in 1..N loop
- -- Imprimimos el nombre de los caballos
- Put(caballos(i)'Image &" ");
- end loop;
- Put_Line(" ");
- for i in 1..N loop
- -- Imprimimos la distancia recorrida por cada caballo
- Put(posiciones(i)'Image &" ");
- end loop;
- end comentarista;
- exit loop when (finEjecucion);
- end loop;
- end comentarista;
- begin
- -- Introducimos los datos de la carrera
- Put_Line("Introduza el numero de caballos: ");
- Get(N);
- Put_Line("Introduza la longitud de la pista: ");
- Get(L);
- Put_Line("Introduza el numero de caras del dado: ");
- Get(caras);
- T := Clock;
- -- Se ejecutan los ciclos mientras no acabe la carrera
- while (finCarrera = False) loop
- -- Por cada caballo que participe en la carrera se realiza una llamada a la tarea caballo
- for i in 1..N loop
- T := T + Periodo;
- Delay until (T);
- caballo.caballo;
- end loop;
- -- Cuando se han desplazado todos los caballos el comentarista da sus posiciones
- comentarista.comentarista;
- Put_Line(" ");
- Put_Line("Ha acabado un ciclo");
- end loop;
- Put_Line("Ha terminado la carrera");
- finEjecucion := True;
- end carreracaballos;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement