
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.

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
 |
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.
|
|