Una de lenguajes clásicos: el COBOL

Últimamente se ha hablado en la empresa de lenguajes de programación clásicos con los que todos crecimos como el Basic o el Turbo Pascal (por los que cierto bastante afecto, todo sea dicho). De todos los clásicos uno de los más persistentes es el COBOL (y a la postre de los más feos), aún utilizado masivamente en grandes empresas que se sienten incapaces de migrar sus mastodónticos sistemas a otros lenguajes, o simplemente obtienen la fiabilidad deseada.

No pretendo dar un curso de COBOL, pero para los más pirados aquí dejo el código del juego del ahorcado que he hecho en COBOL. Pruébalo, funciona:

      * Juego del ahorcado.

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. AHORCADO.

000300 ENVIRONMENT DIVISION.

000400 DATA DIVISION.
000410 WORKING-STORAGE SECTION.
       01  TEMP PIC 9 VALUE 0.
       01  CONT PIC 99 VALUE 0.
       01  CARACTER PIC X VALUE SPACE.
       01  LIFE PIC 9 VALUE 4.
       01  ENCONTRADO PIC 9 VALUE 0.
       01  LONGITUD PIC 9 VALUE 0.
       01  LONGITUD-INICIAL PIC 9 VALUE 0.
       01  SCORE PIC 99 VALUE 0.

       01  CADENA PIC X(9) VALUE SPACES.
      * Copiaremos la cadena origen a una tabla de caracteres.
       01  PALABRA.
           02 ORIGEN OCCURS 9 TIMES PIC X.
      * La palabra de salida.
       01  RESULTADO.
           02 DESTINO OCCURS 9 TIMES PIC X.


000500 PROCEDURE DIVISION.

000700 PROGRAM-BEGIN.

           PERFORM INICIAR-JUEGO.
           PERFORM LIMPIAR-PANTALLA.
           PERFORM PRINCIPAL UNTIL (ENCONTRADO = 1) OR
           (LIFE <= 0) OR (CARACTER = 'Q').
           IF ENCONTRADO = 1
              DISPLAY "Solucion: " PALABRA
              DISPLAY "Has salvado el cuello" LINE 20 COL 30.
           IF LIFE = 0
              DISPLAY "Solucion: " PALABRA
              DISPLAY "Tu cuerpo alimentara los buitres" LINE 20 COL 25
              PERFORM DIBUJAR-PLATAFORMA
              PERFORM DIBUJAR-PERSONAJE.


001000 PROGRAM-DONE.
001100     STOP RUN.

001100 INICIAR-JUEGO.
           PERFORM LIMPIAR-PANTALLA.
           DISPLAY "Introduzca palabra minuscula (max. 9 car.): ".
           ACCEPT CADENA.

      * Contar caracteres hasta primer espacio (sirve para medir
      * la longitud de la palabra). Como esta variable irá decreciendo
      * salvamos la longitud inicial.
           INSPECT CADENA TALLYING LONGITUD FOR CHARACTERS BEFORE
           INITIAL SPACE.
           MOVE LONGITUD TO LONGITUD-INICIAL.
      * Metemos la palabra en la matriz de caracteres e iniciamos
      * el destino con *.
           MOVE CADENA TO PALABRA.
           PERFORM VARYING CONT FROM 1 BY 1 UNTIL CONT > LONGITUD
              MOVE '*' TO DESTINO(CONT)
           END-PERFORM.
      * Limpiamos pantalla y comienza el juego.

001100 LIMPIAR-PANTALLA.
      * Limpiar pantalla
           PERFORM 25 TIMES
              DISPLAY " "
           END-PERFORM.

001100 PRINCIPAL.

           DISPLAY "Salir con 'Q' " LINE 24 COL 1.
           DISPLAY "Adivina la palabra: " LINE 5 COL 30.
           DISPLAY "SCORE: " LINE 1 COL 10
           DISPLAY SCORE LINE 1 COL 18
           DISPLAY "VIDA: " LINE 1 COL 60.
           DISPLAY LIFE LINE 1 COL 67.
           DISPLAY " ".
           PERFORM DIBUJAR-PLATAFORMA.
           PERFORM DIBUJAR-PERSONAJE.
           DISPLAY RESULTADO LINE 6 COL 30.
           ACCEPT CARACTER LINE 7 COL 30.
           PERFORM CONTAR-OCURRENCIAS.
      * Cuando Longitud a decrecido a 0 es que se han encontrado
      * todos los caracteres.
           IF LONGITUD <= 0
              MOVE 1 TO ENCONTRADO.


001100 CONTAR-OCURRENCIAS.
      * ¿Existe la letra?
           INSPECT CADENA TALLYING TEMP FOR ALL CARACTER.
           IF TEMP > 0
      * Si es así reemplazamos todas sus ocurrencias por '-' para
      * que no vuelva a aparecer y buscamos en la tabla sus posiciones.
              INSPECT CADENA REPLACING ALL CARACTER BY '-'
              PERFORM ACTUALIZAR-CADENA
           ELSE
              COMPUTE LIFE = LIFE - 1
           END-IF.
           MOVE 0 TO TEMP.

001100 ACTUALIZAR-CADENA.

           PERFORM VARYING CONT FROM 1 BY 1 UNTIL
           (CONT > LONGITUD-INICIAL)
              IF ORIGEN(CONT) = CARACTER
                 MOVE ORIGEN(CONT) TO DESTINO(CONT)
                 COMPUTE LONGITUD = LONGITUD - 1
                 ADD 1 TO SCORE
              END-IF
           END-PERFORM.

001100 DIBUJAR-PLATAFORMA.
           DISPLAY "|''|" LINE 12 COL 35.
           DISPLAY "|" LINE 13 COL 35.
           DISPLAY "|" LINE 14 COL 35.
           DISPLAY "|" LINE 15 COL 35.
           DISPLAY "|" LINE 16 COL 35.
           DISPLAY "=====" LINE 17 COL 35.
           DISPLAY "=====" LINE 18 COL 35.

001100 DIBUJAR-PERSONAJE.
           IF LIFE < 4
              DISPLAY "" LINE 13 COL 38.
           IF LIFE < 3
              DISPLAY "|" LINE 14 COL 38.
           IF LIFE < 2
              DISPLAY "/" LINE 14 COL 37
              DISPLAY "\" LINE 14 COL 39.
           IF LIFE < 1
              DISPLAY "/" LINE 15 COL 37
              DISPLAY "\" LINE 15 COL 39.

No me digaís que no es bonito…