--AUTOR: Jose Luis VILLARIG GARCIA (V2975813) 472542@cepsz.unizar.es --PROYECTO: Practicas de Intr. Programación 99/00. Práctica3-Ej.2.1.3 --FICHERO: ahorcado2.adb --FECHA: Noviembre-Diciembre 1999 --Modidicado por: --Fecha modificacion: --Descripcion: Se trata del juego del ahorcado (aunque sin el monigote) y --mejorado frente al ahorcado.adb. --Esta es una version mejorada de ahorcado.adb. --La mayor mejora es que las palabras son de tamaño acotado. --La palabra oculta es de tamaño acotado y se coge al azar (numero aleatorio --entre 1 y 25) de un fichero de texto que tiene 25 palabras,"ahorcado2.txt", --las cuales estan a razon de una por linea sin figurar nada mas. --Al haber variedad, resulta interesante incluso cuando es uno mismo el que --ha metido las palabras en el fichero. --Problemas sin resolver: --Los comentados en ahorcado.adb mas: --3) Un programa que genere "ahorcado2.txt" a partir de un fichero de texto --cualquiera, de tal forma que solo se incluyan las palabras relevantes --(no es divertido, adivinar "el"); una posible solucion es incluir palabras --solo a partir de un determinado numero de caracteres e ignorar las demas. --4) Una forma de contar las palabras del fichero y en funcion de ello --generar el numero aleatorio (el problema es que el rango de numeros --aleatorios hay que ponerlo antes del begin). with text_io, Ada.integer_text_io, Ada.Numerics.Discrete_Random; with Ada.Strings.Bounded, BStrings; use text_io, Ada.integer_text_io; procedure ahorcado2 is package pCad25 is new Ada.Strings.Bounded.Generic_Bounded_Length(25); use pCad25; package pCad25_Text_IO is new BStrings(pCad25); use pCad25_Text_IO; -- declaracion de constantes y variables intentos : integer := 10; fichAhorcado: File_Type; palabra : Bounded_String; longPalabra : integer; letrasAdivinadas : Bounded_String; j, k, letrasRestantes : integer; c : character; -- numeros aleatorios SUBTYPE tpRangoAleatorio IS Positive RANGE 1..25; PACKAGE aleatorios IS NEW Ada.Numerics.Discrete_Random(tpRangoAleatorio); use aleatorios; g: Generator; numero: integer; --------------------------------------------------------- -- PROPOSITO: Procedimiento para inicializar letrasAdivinadas con guiones -- Utiliza los parametros del programa principal. -- Post: letrasAdivinadas, de longitud = a palabra y llena de guiones --------------------------------------------------------- procedure ponerGuiones is -- declaracion de variables i : integer; begin i := 1; letrasAdivinadas := palabra; while i <= longPalabra loop Replace_Element(letrasAdivinadas,i,'-'); i := i + 1; end loop; end ponerGuiones; --------------------------------------------------------- -- PROPOSITO: Funcion para comprobar si la letra ya ha sido adivinada -- Pre: c in caracter -- Post: yaAdivinada=TRUE si esta en letrasAdivinadas; sino, FALSE. --------------------------------------------------------- function yaAdivinada (c: character) return boolean is -- declaracion de variables i : integer; yaAdivinada : boolean; begin i := 1; yaadivinada := FALSE; while i <= LONGPALABRA loop if Element(letrasAdivinadas,i) = c then yaAdivinada := TRUE; end if; i := i+1; end loop; return yaAdivinada; end yaAdivinada; --------------------------------------------------------- -- PROPOSITO: Funcion para calcular el numero de veces que esta c -- Pre: c in caracter -- Post: numVeces=numero de veces que esta c. --------------------------------------------------------- function numVeces (c : character) return integer is -- declaracion de variables i, numVeces : integer; begin i := 1; numVeces := 0; while i <= longPalabra loop if Element(palabra,i) = c then numVeces := numVeces + 1; Replace_Element(letrasAdivinadas,i,c); end if; i := i+1; end loop; return NumVeces; end NumVeces; --------------------------------------------------------- -- PROPOSITO: Procedimiento para comunicar el resultado de la letra -- introducida por el usuario. Esta quitado del principal, por su largura -- y por ser autoexplicativo. Debido a su especifidad, no tiene parametros -- propios y maneja los del programa principal. --------------------------------------------------------- procedure comunicarResultado is begin put ("La letra "); put (c); put (" esta "); put (numVeces(c),0); put (" veces y te quedan "); put (intentos,0); put (" intentos y "); letrasRestantes := letrasRestantes - numVeces(c); put (letrasRestantes,0); put_line (" letras por adivinar."); put ("Llevas adivinado: "); put_line (letrasAdivinadas); end comunicarResultado; begin open (fichAhorcado, In_File, "Ahorcado2.txt"); Reset(g); numero := Random(g); k := 1; while k < numero loop skip_line (fichAhorcado); k := k + 1; end loop; get_line (fichAhorcado,palabra); close (fichAhorcado); longPalabra := length(palabra); j := 1; letrasRestantes := longPalabra; ponerGuiones; while intentos > 0 and letrasAdivinadas /= palabra loop put ("Introduce una letra: "); get (c); if yaAdivinada(c) then put_line ("Ya has adivinado esa letra."); else if numveces(c) = 0 then intentos := intentos - 1; end if; comunicarResultado; end if; end loop; if letrasAdivinadas = palabra then put ("Ganaste."); else put ("Perdiste."); end if; end ahorcado2;