uN JueGo eN CoBoL
Ya se que Cobol no es un lenguaje para programar juegos, pero no por ello, no está capacitado para realizarlos. Evidentemente no estamos hablando de uno de esos juegos actuales 3D, con música estereo ni escenarios virtuales, pero os aseguro que es un juego. Además en realidad, lo importante no es el juego en si, sino su realización, la cual nos puede ayudar a comprender mejor el uso de tablas por ejemplo.

El juego que he escogido, trata de un gusano que va creciendo cada vez que come un objeto. Y desde aquí os voy a explicar todos los pasos que he seguido para realizarlo. Lo desmenuzaré por partes y luego podeis bajarlo completo para examinarlo y ejecutarlo.

Pantalla del juego del gusano loco


VARIABLES

Estas nos ayudarán a confeccionar los cuadros de delimitación de la pantalla. 01  RAYA.
     02  FILLER PIC X(30) VALUE "------------------------------".
     02  FILLER PIC X(30) VALUE "------------------------------".
     02  FILLER PIC X(20) VALUE "--------------------".
01  CUADRO.
     02  U1 PIC 99.
     02  U2 PIC 99.
     02  U3 PIC 99.
     02  U4 PIC 99.
     02  U6 PIC 9999.
01 U0 PIC 99.
01 U5 PIC 99.
Estas tablas nos ayudarán a controlar la presentación del gusano en la pantall, en ella guardaremos las posiciones que ocupa. SUBN y SUBA, serán los indices para movernos por las tablas. 01  TABLANUEVA.
     02  TNUEVA OCCURS 2000 TIMES.
          03  TNL PIC 99.
          03  TNC PIC 99.
01  TABLAACTUAL.
     02  TACTUAL OCCURS 2000 TIMES.
          03  TAL PIC 99.
          03  TAC PIC 99.
01  SUBA PIC 9999.
01  SUBN PIC 9999.
Diferentes variables para controlar la tecla pulsada, los puntos obtenidos, su longitud y la posición que ocupa en la pantalla. 01  OPCION PIC X.
01  TECLA PIC 9.
01  NADA PIC X.
01  LI PIC 99.
01  CO PIC 99.
01  LARGO PIC 9999.
01  COLI PIC 99.
01  COCO PIC 99.
01  PUNTOS PIC 9999.
01  LPUNTOS PIC ZZZ9.
En ésta variable guardaremos la hora, que nos servirá para obtener un número aleatorio donde colocar el objeto que se comerá el gusano. 01  HORARIO PIC 9(8).
01  X9     REDEFINES HORARIO.
     02  HORA PIC 99.
     02  MINU PIC 99.
     02  SEGU PIC 99.
     02  MILI PIC 99.
     02  MILIN   REDEFINES MILI.
          03  MIL1 PIC 9.
          03  MIL2 PIC 9.



DESARROLLO

En éstos primeros párrafos, dibujamos la pantalla, el título y el pie de la misma.
Tambien inicilizamos las variables necesarias.

LI.    Línea actual.
CO.  Columna actual.
LARGO. Longitud del
            gusano.
PUNTOS. Puntuación.
TECLA.  Ultima tecla 
            pulsada.

TAL.  Elemento de la tabla que guarda las líneas del gusano actual.
TAC. Igual pero para la columna.
EMPEZAMOSAJUGAR.
      DISPLAY " " LINE 1 ERASE.
      MOVE 020223780039 TO CUADRO 
               PERFORM DIBUJAR THRU DIBUJA3.
      MOVE 040321770039 TO CUADRO 
               PERFORM DIBUJAR THRU DIBUJA3.
TITULO.
      DISPLAY SPACES LINE 3 COL 4 SIZE 73 REVERSE CONTROL
               "FCOLOR=CYAN".
      DISPLAY "GuSaNo LoCo By aNDReS MoNTeS" LINE 3 COL 5
                LOW REVERSE.
      DISPLAY "............." LINE 3 COL 38 LOW REVERSE.
      DISPLAY "PuNTuAcIon .." LINE 3 COL 56 LOW REVERSE.
PIE.
      DISPLAY SPACES LINE 22 COL 4 SIZE 73.
      DISPLAY "LiNea .." LINE 22 COL 50.
      DISPLAY "CoLuMNa." LINE 22 COL 64.
      DISPLAY "(P)auSa" LINE 22 COL 4 LOW REVERSE.
      DISPLAY "(F)iN " LINE 22 COL 16 LOW REVERSE.
INICIO.
      INITIALIZE TABLANUEVA TABLAACTUAL.
      MOVE 15 TO LI TAL (1) MOVE 40 TO CO TAC (1). 
      MOVE 2 TO LARGO MOVE 0 TO PUNTOS MOVE 4 TO TECLA.
      PERFORM PONER.

El párrafo UNO, prepara la tabla nueva, para admitir los nuevos valores y controla si hemos salido de la pantalla.

El párrafo DOS, nos sirve para ir borrando y dibujando el gusano, según las posiciones que ocupe. Fijaros que le hemos puesto una cabeza distinta al gusano, según sea su dirección, eso nos ayuda a controlar mejor el movimiento.

El en párrafo 3, aceptamos la tecla para escoger el siguiente movimiento, le he puesto un time 10 para que espere un poco y no sea tan rápido, variando éste valor haremos que el gusano corra mas o menos. Además miramos si la posición que ocupa coincide con el objeto que debe de coger para ir aumentando de tamaño y si es así, colocamos otro y subimos la puntuación. Le he puesto la posibilidad de hacer una pausa pulsando la letra P o terminar el juego pulsando F.

UNO.
      INITIALIZE TABLANUEVA.
      MOVE LI TO TNL (1) MOVE CO TO TNC (1).
      MOVE 2 TO SUBN MOVE 0 TO SUBA.
      IF LI < 5 OR LI > 20 GO MAL.
      IF CO < 4 OR CO > 76 GO MAL.
DOS.
      ADD 1 TO SUBA.
      DISPLAY " " LINE TAL (SUBA) COL TAC (SUBA).
      IF SUBA = LARGO DISPLAY "·" LINE TNL (SUBA)
               COL TNC (SUBA).
      IF SUBA = 1 IF TECLA = 4
               DISPLAY "<" LINE TNL (SUBA) COL TNC (SUBA)
               CONTROL "FCOLOR=RED".
      IF SUBA = 1 IF TECLA = 2
               DISPLAY "" LINE TNL (SUBA) COL TNC (SUBA)
               CONTROL "FCOLOR=RED".
      IF SUBA = 1 IF TECLA = 8
               DISPLAY " " LINE TNL (SUBA) COL TNC (SUBA)
               CONTROL "FCOLOR=RED".
      IF SUBA = 1 IF TECLA = 6
               DISPLAY ">" LINE TNL (SUBA) COL TNC (SUBA)
               CONTROL "FCOLOR=RED".
      IF SUBA = 1 IF TECLA = 6
               DISPLAY ">" LINE TNL (SUBA) COL TNC (SUBA)
               CONTROL "FCOLOR=RED".
      IF SUBA > 1 AND SUBA < LARGO
               DISPLAY "_" LINE TNL (SUBA) COL TNC (SUBA).
      IF SUBA = LARGO MOVE TABLANUEVA TO TABLAACTUAL 
               GO TRES.
      MOVE TAL (SUBA) TO TNL (SUBN).
      MOVE TAC (SUBA) TO TNC (SUBN).
      ADD 1 TO SUBN.
      GO DOS.
TRES.
      ACCEPT OPCION LINE 1 COL 1 OFF NO BEEP TIME 10.
      DISPLAY "$" LINE COLI COL COCO
                CONTROL "FCOLOR=GREEN".
      IF TECLA = "2" ADD 1 TO LI.
      IF TECLA = "8" SUBTRACT 1 FROM LI.
      IF TECLA = "4" SUBTRACT 1 FROM CO.
      IF TECLA = "6" ADD 1 TO CO.
      IF OPCION = 2 OR OPCION = 4 OR OPCION = 6
                 OR OPCION = 8 MOVE OPCION TO TECLA.
      IF LI = COLI AND CO = COCO ADD 1 TO LARGO
                  PERFORM PONER.
      IF OPCION = "P" OR OPCION = "p" GO PAUSA.
      IF OPCION = "F" OR OPCION = "f" GO FIN.
      DISPLAY LI LINE 22 COL 59 LOW
                   CONTROL "FCOLOR=CYAN".
      DISPLAY CO LINE 22 COL 73 LOW
                   CONTROL "FCOLOR=CYAN".
      GO UNO.
Estos párrafos tienen muy clara su función, el primero para hacer una pausa, el segundo nos indica que hemos perdido por haber sacado el gusano fuera de los límites y el tercero nos sirve para finalizar la partida. PAUSA.
      DISPLAY "JueGo eN PauSa, PuLSe (C)oNTiNuaR"
               LINE 22 COL 4 CONTROL "FCOLOR=CYAN".
      ACCEPT NADA LINE 22 COL 40 PROMPT OFF NO BEEP.
      IF NADA = "C" OR NADA = "c" NEXT SENTENCE
               ELSE GO PAUSA.
      PERFORM PIE.
      GO UNO.
MAL.
      DISPLAY "¡ Lo SieNTo ! HaS PeRDiDo" LINE 22 COL 4
      CONTROL "FCOLOR=CYAN".
      ACCEPT NADA LINE 22 COL 40 OFF NO BEEP.
      GO EMPEZAMOSAJUGAR.
FIN.
      DISPLAY "eSPeRO Que Te HaYaS DiVeRTiDo" LINE 22
               COL 4 CONTROL "FCOLOR=CYAN".
      ACCEPT NADA LINE 22 COL 40 PROMPT OFF NO BEEP.
      DISPLAY " " LINE 1 ERASE.
      STOP RUN.

En éste párrafo colocamos el objeto que el gusano se debe de comer. Las posiciones las cogemos haciendo unas operaciones con la hora actual del sistema (número aleatorio). Sumamos mas puntos y los colocamos en su sitio correspondiente dentro del título. PONER.
      ACCEPT HORARIO FROM TIME.
      COMPUTE COLI = MIL1 + MIL2.
      IF COLI < 7 ADD 5 TO COLI.
      COMPUTE COCO = MIL1 + SEGU + MIL2.
      IF COCO < 6 ADD 5 TO COCO.
      IF COCO > 75 SUBTRACT 6 FROM COCO.
      DISPLAY "$" LINE COLI COL COCO 
               CONTROL "FCOLOR=GREEN".
      MOVE PUNTOS TO LPUNTOS.
      DISPLAY LPUNTOS LINE 3 COL 71 LOW
      REVERSE CONTROL "FCOLOR=CYAN".
      ADD 1 TO PUNTOS.

Esta parte es la que nos sirve para dibujar cuadros en la pantalla, aquí con el navegador los signos no salen bien, pero en el programa se ven perfectamente.  DIBUJAR.
      COMPUTE U5 = U4 - U2.
      IF U1 = U3 ADD 1 TO U5.
      DISPLAY RAYA LINE U1 COL U2 SIZE U5 
               LOW CONTROL "FCOLOR=BROWN".
      DISPLAY RAYA LINE U3 COL U2 SIZE U5
               LOW CONTROL "FCOLOR=BROWN".
DIBUJA0.
      MOVE U1 TO U0.
DIBUJA1.
      ADD 1 TO U0 IF U0 > U3 GO DIBUJA2.
      IF U0 NOT = U3 DISPLAY SPACES LINE U0 
               COL U2 SIZE U5.
      DISPLAY "¦" LINE U0 COL U2 LOW.
      DISPLAY "¦" LINE U0 COL U4 LOW.
      GO DIBUJA1.
DIBUJA2.
      DISPLAY "+" LINE U1 COL U2 LOW.
      DISPLAY "+" LINE U1 COL U4 LOW.
      DISPLAY "+" LINE U3 COL U2 LOW.
      DISPLAY "+" LINE U3 COL U4 LOW.
DIBUJA3.


Bien, una vez terminada la explicación, solo os queda apreciar el resultado, no espero que paseis horas jugando, pero si que os deis de las posibilidades que nos puede ofrecer el lenguaje. Por supuesto podeis mejorarlo y ampliarlo a vuestro gusto. Os incluyo el fuente, solo compilarlo y ejecutarlo.

Espero vuestros comentarios. También está incluido en Utilidades dentro de Varios.

Descarga     Donwload  > gusano.zip <   2 Kb


Solo recordaros que para mover el gusano, debéis utilizar los números 2,4,6,8 en el teclado numérico vienen representando las flechas.

Nota: Para los que utilicéis el compilador de Microsoft Cobol, debéis cambiar las líneas con la cláusula CONTROL en los DISPLAY de la siguiente manera:

CONTROL "FCOLOR=RED"  ------>   WITH FOREGROUN-COLOR 3.




Este artículo proviene de Cobol en español
http://www.escobol.com

La dirección de esta noticia es:
http://www.escobol.com/modules.php?name=Sections&op=viewarticle&artid=78