--AUTORA: Susana Castillo Alejandre --PROYECTO: Practicas de Introducción a la Programación 99-00. Practica 3. --FICHERO: practica3/Ahorcado.adb --FECHA: Octubre 1999. --MODIFICADO POR: Susana Castillo Alejandre. --FECHAS DE MODIFICACION: Octubre 1999; -- Noviembre 1999; -- Diciembre 1999. --DESCRIPCION: Este programa presenta mediante una serie de procedimientos -- y funciones, una versión del ahorcado de toda la vida. -- El usuario debe adivinar en un número fijo de intentos -- la palabra propuesta, en el caso programado 10. -- En cada intento, el usuario propone una letra y el programa -- le dice si está o no en la palabra, el número de veces que -- aparece, los intentos que lleva y el numero de letras que -- lleva adivinadas, preguntandole si desea resolver o seguir -- probando. Muestra por pantalla las instrucciones pertinentes, -- así como mensajes de bienvenida y despedida personalizados -- para el jugador. with Text_Io; use Text_Io; with Text_Io, Ada.Integer_Text_Io; use Text_Io, Ada.Integer_Text_Io; procedure Ahorcado is --declaración de constantes y variables MAXINTENTOS: constant Integer := 10; LONGMAX: constant Integer :=15; type Tppalabra is array (1..LONGMAX) of Character; type Tpjugador is array (1..5) of Character; type Tppreguntado is array (1..10) of Character; solve, preguntado: Tppreguntado; jugador: Tpjugador; solucion, palabra: Tppalabra; crapul, intentos, long, indice, numero: Integer; jugad, letra, soluc: Character; aux, fallo: Boolean; -- _____________________________________________________________________ procedure Crapulo (numero: in out Integer; crapul: out Integer)is -- Dado un numero que se pide en el programa principal al usuario -- por pantalla y se lee de teclado (numero), el procedimiento -- Crapulo lo reduce a una cifra (carpul). Tiene por fin designar -- aleatoriamente la palabra a adivinar en el juego. begin while (numero > 9) loop crapul:= 0; while (numero mod 10 /= 0) loop crapul:= crapul + (numero mod 10); numero:= numero/10; end loop; crapul:= crapul + numero; numero:= crapul; end loop; crapul:= numero; end Crapulo; -- _________________________________________________________________________ procedure Enigmar (crapul: in Integer; enigma: out Tppalabra; long: out Integer) is -- Dado el crapulo (crapul) fruto del procedimiento anterior, -- designa aleatoriamente la palabra a adivinar en el juego. -- Supone que el usuario acepta jugar, le da la bienvenida -- y le informa de la longitud de la palabra a adivinar. begin if crapul = 0 then enigma:="hoy "; elsif crapul= 1 then enigma:="azul "; elsif crapul= 2 then enigma:="cielo "; elsif crapul= 3 then enigma:="estela "; elsif crapul= 4 then enigma:="estuche "; elsif crapul= 5 then enigma:="estrella "; elsif crapul= 6 then enigma:="asturiano "; elsif crapul= 7 then enigma:="participio "; elsif crapul= 8 then enigma:="casamentero "; else enigma:="ornitorrinco "; end if; long:= crapul + 3; Put ("Veo que aceptas el desafio. Muy bien, alla vamos. La palabra tiene "); Put (long, 0); Put_Line (" letras, EN MINUSCULAS. ¡¡¡¡Suerte colega!!!!"); end Enigmar; -- __________________________________________________________________________ function Esta (letra: Character; long: Integer; palabra: Tppalabra) return Boolean is -- Comprueba si la letra propuesta por el usuario está en la -- palabra y se lo comunica, añadiendo el número de veces -- que la contiene si es el caso. --declaración de constantes y variables numveces: Integer; encontrada: Boolean; begin encontrada:= False; numveces:= 0; for contador in 1..long loop if palabra (contador) = letra then encontrada:= True; numveces:= numveces + 1; end if; end loop; if (numveces = 1) then Put ("La "); Put (letra); Put_Line (" esta una sola vez."); New_line; elsif (numveces /= 0) then Put ("La "); Put (letra); Put (" esta "); Put (numveces, 0); Put_Line (" veces."); New_line; end if; return (encontrada); end Esta; -- _________________________________________________________________________ -- _________________________________________________________________________ procedure Pideletra (letra: in out Character; intentos: in Integer) is -- Pide las letras al usuario mediante distintos mensajes, -- por pantalla, según el número de intentos consumidos -- y la lee del teclado. --declaración de constantes y variables lee: Character; begin New_line; case intentos is when 1 => Put_Line("Bien, ¡dispara ese char!"); when 2 => Put_Line("Jai, payo, dame otra letra."); when 3 => Put_Line("Un, dos, tres, prueba otra vesssss..."); when 4 => Put_Line("Prueba otra vez, calamar."); when 5 => Put_Line("Cuidadin, que ya llevas la mitad de los intentos. Venga, dime otra."); when 6 => Put_Line("Bueno, coleguita, a ver si nos lo curramos mas. Di otra."); when 7 => Put_Line("Na, ti@ que esto no es lo tuyo, prueba de nuevo."); when 8 => Put_Line("En serio, ¿no se resiente tu orgullo? ¡Que es un juego para niños!. En fin, ¿letra?"); when 9 => Put_Line("¡Mira que eres mal@! Este programa esta personalizado para ti y ni por esas. Dime otra letra."); when 10=> Put_Line("Hace falta ser malo para llegar a estos extremos. Si yo fuera tu me plantearia que hago en una carrera. Ultimo intento"); when others => Put_Line(" Intento extra de regalo, porque ha fallado el programa. ¡¡Y no me critiques que eres tu quien no acierta!!"); end case; Get (lee); letra:= lee; Skip_line; end Pideletra; -- _________________________________________________________________________________________________ function Resolver return Boolean is -- Tras cada intento evaluado, pregunta al usurio por -- pantalla si desea resolver o seguir probando. --declaración de constantes y variables respuesta: Character; begin Put_Line ("¿Te atreves ya a dar la solve? [S/N]"); Get (respuesta); while not (((respuesta)=('s')) or ((respuesta)=('S')) or ((respuesta)=('n')) or ((respuesta)=('N') )) loop Put_Line ("¿Y que quieres decirme con eso? Solo entiendo español."); Put_Line ("Te agradeceria que me prestases mas atencion, digo que si quieres resolver ya. Presiona 'S' para resolver o 'N' para seguir probando letras."); Get (respuesta); Skip_line; end loop; return ( (respuesta) = ('s') or (respuesta) =('S') ); end Resolver; --______________________________________________________________________________________________________ function VerAdivinadas return Boolean is -- Muestra al usuario, si lo desea, las letras que lleva -- adivinadas, proponiendo esta opción en los intentos pares -- para evitar la excesiva duración del programa. --declaración de constantes y variables respuesta: Character; begin Put_Line ("¿Quieres ver las que llevas adivinadas? [S/N]"); Get (respuesta); while not (((respuesta)=('s')) or ((respuesta)=('S')) or ((respuesta)=('n')) or ((respuesta)=('N') )) loop Put_Line ("Respuesta no válida."); Put_Line ("Si quieres ver las adivinadas presiona 'S', si no presiona 'N'."); Get (respuesta); Skip_line; end loop; return ( (respuesta) = ('s') or (respuesta) =('S') ); end VerAdivinadas; -- ______________________________________________________________________________________________________________________________________________________________________ function VerPreguntadas return Boolean is -- Muestra al usuario, si lo desea, las letras que ya ha -- preguntado, una vez ha repetido alguna letra al jugar. --declaración de constantes y variables respuesta: Character; begin Put_Line ("¿Quieres ver las que ya has preguntado? [S/N]"); Get (respuesta); while not (((respuesta)=('s')) or ((respuesta)=('S')) or ((respuesta)=('n')) or ((respuesta)=('N') )) loop Put_Line ("Respuesta no válida."); Put_Line ("Si quieres ver las preguntadas presiona 'S', si no presiona 'N'."); Get (respuesta); Skip_line; end loop; return ( (respuesta) = ('s') or (respuesta) =('S') ); end VerPreguntadas; -- ______________________________________________________________________________________________________________________________________________________________________ -- ______________________________________________________________________________________________________________________________________________________________________ begin palabra:= "nada "; jugador:= " "; for Y in 1..10 loop preguntado (Y):= ' ' ; end loop; for X in 1..10 loop solve (X):= ' ' ; end loop; Put_Line (" Por favor, identificate. (En cinco caracteres)"); for J in 1..5 loop Get (jugad); jugador (J):= jugad; end loop; Skip_line; New_line; Put ("¡¡Bienvenid@, "); for jugad in 1..5 loop Put (jugador(jugad)); end loop; Put_line(" !!"); New_line; Put_line ("Esto es un simulacro del ahorcado de toda la vida. Si te ves capaz de ganar, sigue las instrucciones."); New_line; Put ("Te reto a que aciertes en "); Put (MAXINTENTOS,0); Put_Line(" intentos mi enigma."); New_line; Put_Line ("Escribe tu fecha de nacimiento sin espacios si es la primera vez que juegas."); Put_Line ("Si ya eres veteran@, escribe un numero de tantas cifras como desees."); Get (numero); Skip_line; New_line; Crapulo (numero, crapul); Enigmar (crapul, palabra, long); intentos:=1; letra:=' ' ; loop Pideletra (letra,intentos); preguntado (intentos):= letra; for i in 1..(intentos-1) loop while letra = preguntado (i) loop Put_line ("Esa letra ya la has preguntado." ); if VerPreguntadas= true then for y in 1..intentos loop Put (preguntado(y)); Put (" "); end loop; end if; New_line; Put_line("Dime otra letra."); Get (letra); preguntado (intentos):= letra; end loop; end loop; if (Esta (letra, long, palabra) = True) then Put ("Bingo, "); for jugad in 1..5 loop Put (jugador(jugad)); end loop; Put_line (", has acertado"); else Put ("Pio, pio, que la '"); Put (letra); Put_Line ("' no ha sio"); end if; if (intentos>1) AND (intentos MOD 2 = 0) then if VerAdivinadas= true then for x in 1..intentos loop Put (solve(x)); end loop; end if; end if; intentos:= intentos + 1; aux:= Resolver; exit when aux or (intentos = MAXINTENTOS +1); end loop; if (aux = true) then Put ("Eres un tanto arriesgad@, "); for jugad in 1..5 loop Put (jugador(jugad)); end loop; Put_Line (", escribe tu respuesta, sabiond@"); New_line; for J in 1..long loop Get (soluc); solucion (J):= soluc; end loop; Skip_line; fallo:= False; indice:= 1; while (indice < 4) and (not fallo) loop if (solucion (indice) /= palabra (indice) ) then fallo:= True; Put_Line ("La cagaste, Burt Lancaster"); Put ("T'as pasao de list@, "); for jugad in 1..5 loop Put (jugador(jugad)); end loop; Put_line (" ."); New_line; end if; indice:= indice + 1; end loop; if (not fallo) then Put_Line (" Me quito el sombrero ante vos."); Put ("Enhorabuena, "); for jugad in 1..5 loop Put (jugador(jugad)); end loop; Put_Line (", acabas de adquirir el titulo de jef@. Lo siento, no hay premio economico exceptuando vuestras apuestas."); New_line; end if; end if; Put ("La solucion era "); for guardada in 1..LONGMAX loop Put (palabra(guardada)); end loop; Put_Line (" . El juego ha terminado."); Put_Line ("Gracias por jugar con <>. La programadora acepta elogios y propinas."); Skip_Line; end Ahorcado;