Program Ahorcado;
Uses crt;
Const
   MaxPalabra = 14;
Type
   t_palabras = record
       palabra:string[MaxPalabra];
   end;
Var
   v_palabras : array[0..9] of t_palabras;
   v_letras   : array[1..100] of char;
   v_anterior, i:integer;
 
   Procedure Marco;
   {Dibuja el marco en la pantalla}
   Var
      i, j :integer;
   Begin
      Clrscr;
      For i := 1 to 79 do begin
          gotoxy(i, 1);
          write('Í');
          gotoxy(i,24);
          write('Í');
      end;
      For j := 1 to 24 do begin
         gotoxy(1,j);
         write('º');
         gotoxy(80,j);
         write('º');
      end;
         gotoxy(80,1);
         write('»');
         gotoxy(1,24);
         write('È');
         gotoxy(80,24);
         write('¼');
         gotoxy(1,1);
         write('É');
    End; {Marco}
    Function Menu(var p_opcion:integer):integer;
    {Dibuja el men£}
    Var
        v_opcion:integer;
 
    Begin
       clrscr;
       marco;
       gotoxy(25,6);
       Writeln('Bienvenido aljuego del AHORCADO');
       gotoxy(25,8);
       writeln('Si tiene m s de 7 fallos pierde');
       gotoxy(25, 14);
       Writeln('1. Jugar');
       Gotoxy(25, 15);
       Writeln('2. Salir');
       Gotoxy(25, 16);
       Write('Opci¢n :');
       Readln(v_opcion);
       p_opcion := v_opcion;
       menu := v_opcion;
    End; {Menu}
    Procedure Dibujo(p_fallo:integer);
    Var
      v_parte:String[7];
      v_fila, v_columna:Integer;
    begin
      v_parte:='O/I\I/\';
      Case p_fallo of
          1 :  begin
                v_fila:=1;  v_columna:=2;
               end;
          2 :  begin
                v_fila:=2;  v_columna:=1;
               end;
          3 :  begin
                v_fila:=2;  v_columna:=2;
               end;
          4 :  begin
                v_fila:=2;  v_columna:=3;
               end;
          5 :  begin
                v_fila:=3;  v_columna:=2;
               end;
          6 :  begin
                v_fila:=4;  v_columna:=1;
               end;
          7 :  begin
                v_fila:=4;  v_columna:=3;
               end;
       end;
         gotoxy(7+v_columna,18+v_fila);
         write(v_parte[p_fallo]);
   end;
   Procedure Verifica(p_palabraescogida: string;var p_posicion:integer; p_letra:char);
   var
     n:integer;
   begin
     delete(p_palabraescogida,1,p_posicion);
     n:=p_posicion;
     p_posicion :=pos(p_letra,p_palabraescogida);
     if p_posicion<>0 then
        p_posicion:= p_posicion+n;
   end;
   Procedure Jugar;
   Var
       v_palabraformada, v_palabraescogida :String[MaxPalabra];
       v_posicion, v_fallos, j, i, v_indice, v_indiceletras:integer;
       v_letra :char;
       v_evaluada : boolean;
   Begin
       Clrscr;
       Marco;
       v_palabraformada := '';
       v_indiceletras   := 0;
       v_posicion       := 0;
       v_fallos         := 0;
       v_evaluada       := false;
       j := 0;
       randomize;
       repeat
          v_indice := random(9);
       until v_anterior <> v_indice;
       v_anterior := v_indice;
       v_palabraescogida := v_palabras[v_indice].palabra;
       for i:= 1 to length(v_palabraescogida) do begin
          v_palabraformada := v_palabraformada + '_';
       end;
       repeat
          gotoxy(25,16);
          writeln(v_palabraformada);
          gotoxy(2, 2);
          write('Digite una letra: ');
          readln(v_letra);
          v_letra := upcase(v_letra);
          i := 1;
          v_evaluada := false;
          Repeat
             if  v_letras[i] = v_letra then begin
               v_evaluada := true;
             end;
             i := i + 1;
          until (i >= v_indiceletras) or (v_evaluada);
          v_indiceletras := v_indiceletras + 1;
          v_letras[v_indiceletras] := v_letra;
          if (not v_evaluada) then begin
             verifica(v_palabraescogida, v_posicion, v_letra);
             if v_posicion <> 0 then begin
                repeat
                   v_palabraformada[v_posicion]:= v_letra;
                   gotoxy(25,16);
                   write(v_palabraformada);
                   verifica(v_palabraescogida, v_posicion, v_letra);
                   writeln;
                until (v_posicion=0);
             end
             else begin
                 v_fallos := v_fallos + 1;
                 dibujo(v_fallos);
            end;
          end else begin
             v_fallos := v_fallos + 1;
             dibujo(v_fallos);
          end;
          gotoxy(20,12);
          writeln('Intentos :', v_indiceletras, ' Fallos :', v_fallos);
          gotoxy(3,5);
          writeln('Letras evaluadas: ');
          for j := 1 to v_indiceletras do begin
             gotoxy(5+(j*2),6);
             write(v_letras[j]);
          end;
       until (v_fallos = 8) or (v_palabraformada = v_palabraescogida);
       if v_palabraformada = v_palabraescogida then begin
          gotoxy(25, 17);
          textcolor(Green);
          writeln('FELICIDADES HAS GANADO!!!!!!');
       end
       else begin
          gotoxy(25, 17);
          textcolor(red);
          writeln('LO SIENTO HAS PERDIDO!!!!!!!!');
      end;
      Normvideo;
      READKEY;
    End;{Jugar}
    Procedure LlenaArreglo;
    {Llena la lista de palabras}
    Begin
        v_palabras[0].palabra:= 'AHORCADO';
        v_palabras[1].palabra:= 'EXTRAORDINARIO';
        v_palabras[2].palabra:= 'USUARIO';
        v_palabras[3].palabra:= 'TELEVISOR';
        v_palabras[4].palabra:= 'TELEFONO';
        v_palabras[5].palabra:= 'EXCELENTE';
        v_palabras[6].palabra:= 'JARDINERO';
        v_palabras[7].palabra:= 'INFORMACION';
        v_palabras[8].palabra:= 'DICCIONARIO';
        v_palabras[9].palabra:= 'PARTIDO';
    End;{LlenaArreglo}
 
 
BEGIN
  v_anterior := 0;
  Marco;
  LlenaArreglo;
  repeat
     Case  i of
       1: begin
             Jugar;
          end;
    end;
  until menu(i) = 2;
END.