Campo Minado en MBASIC

Foro dedicado a la programación en todo tipo de sistemas clásicos.
dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Campo Minado en MBASIC

Mensajepor dancresp » 06 Abr 2013, 23:18

Mine0.jpg
Mine0.jpg (87.83 KiB) Visto 8212 veces


EL JUEGO
El objetivo del juego consiste en encontrar todas las minas del tablero.

El tamaño del tablero de juego y la cantidad de minas pueden ser definidos antes de empezar cada partida.

Al introducir la columna (letra) y el número de fila (número) de una de las casillas del tablero se nos indica si hay minas alrededor. Introduciendo un asterisco (*) antes de la posición de la celda podemos marcar/desmarcar una celda donde se cree que puede haber una de las minas.

Descargar el fuente en formato MBASIC y ASCII:
CampoMinas.rar
(3.53 KiB) Descargado 312 veces


BLOQUES
He dividido el listado en 10 bloques:

- Instrucciones y entrada de parámetros.
- Generar el campo de minas.
- Introducir la celda.
- Revisar la celda y alrededores.
- Fin juego: El jugador gana.
- Fin juego: El jugador pierde al tocar una mina.
- Error: Se introduce una celda errónea.
- Rutina que comprueba la celda indicada.
- Imprimir el tablero de juego.
- Rutina de pausa hasta pulsar una tecla.


COMO FUNCIONA
Por temas de claridad y debido a lo poco cómodo del editor del MBASIC (igual al de los DRAGON) he optado por estructurar el programa en muchas líneas.

Se utilizan las siguientes variables principalmente:
P$() = Matriz donde se guardan lo que muestra el tablero de juego.
V() = Matriz donde se guarda la posición de las minas (0) y las vacias (0).
V = Tamaño vertical del tablero.
H = Tamaño horizontal del tablero.
M = Número de minas.
T = Total de casillas a seleccionar. T=V*H-M.
C = Casillas marcadas como “mina” (con el *).

70 – Inicio de la pantalla de instrucciones.
170 – Entrada de los parámetros de juego.
260 – Se genera el tablero de juego.
340 – Se genera una posición X e Y aleatoreamente y si está vacía “V(Y,X)=0” se marca como 1.
410 – Se llama a la subrutina que imprime el tablero de juego.
420 – Se introduce la casilla.
440 – Si introducimos “00” se acaba la partida.
450 - Se revisa si la celda empieza con “*”.
460 – Se comprueba que la posición vertical es correcta. Sino se muestra un error.
470 – Se comprueba que la posición horizontal es correcta. Sino se muestra un error.
480 – Se comprueba que la celda no se ha marcado nunca (-) o esta marcada como mina (*).
500 – Si la casilla indicada empieza con * se marca/desmarca en función de su estado.
520 – Si la casilla indicada contiene una mina salta al final de la partida.
560 – Este bloque comprueba si en la celda indicada o alrededor hay una mina. Si hay una mina se detiene, sino amplia el tamaño de la zona a revisar.
680 – Si T=0 quiere decir que se han destapado todas las casillas y finaliza el juego, sino vuelve a pedir la casilla.
720 – Se muestra el tablero de juego y finaliza la partida con una felicitación.
790 – Al tocar una mina se muestra la posición de todas las minas del tablero y finaliza la partida.
910 – Si la casilla indicada es errónea se muestra un mensaje de error y vuelva a pedir una nueva casilla.
980 – Esta rutina revisa si hay una mina alrededor de la casilla indicada. Para ello suma los valores de la matriz V, teniendo en cuenta que si hay mina vale 1 y sino 0. El resultado final es el número de minas que hay alrededor de esa posición.
1060 – Subrutina que mediante un doble bucle imprime el tablero de juego, en función de su tamaño.
1210 – Subrutina que espera que se pulse una tecla. Se divide en dos partes por si hay una tecla pulsada al hacer la llamada.


EL PROGRAMA

Código: Seleccionar todo

10 DIM P$(22,27)
20 DIM V(22,27)
30 RANDOMIZE
40 REM
50 REM *** Instrucciones y entrada parametros
60 REM
70 PRINT:PRINT:PRINT:PRINT TAB(30);"*** CAMPO MINADO ***"
80 PRINT:PRINT:PRINT TAB(29);"(C) SCAINET SOFT, 2013"
90 PRINT:PRINT:PRINT "Completa el tablero sin seleccionar ninguna casilla que contenga una mina"
100 PRINT "para ganar la partida."
110 PRINT:PRINT "Al introducir una casilla se indican las minas que hay a su alrededor."
120 PRINT:PRINT "Para indicar la casilla introduce primero la columna y despues la fila."
130 PRINT "Para marcar la casilla de una mina, introduce un * antes de la casilla."
140 PRINT:PRINT "Ejemplos: G10   H5   *C12 (marca/desmarca casilla)
150 PRINT:PRINT:PRINT "Por defecto se genera un tablero de 10 filas, 25 columnas y 30 minas."
160 PRINT:PRINT:PRINT "Introduce las caracteristicas del tablero:":PRINT
170 INPUT "Filas (entre 10 y 20) ";V
180 IF V<10 OR V>20 THEN V=10
190 INPUT "Columnas (entre 10 y 25) ";H
200 IF H<10 OR H>25 THEN H=25
210 INPUT "Minas (minimo 10) ";M
220 IF M<10 OR M>V*H-1 THEN M=30
230 REM
240 REM *** Generar el campo de minas
250 REM
260 PRINT:PRINT "Generando tablero de";STR$(V);" filas,";STR$(H);" columnas y";STR$(M);" minas."
270 C=0:T=V*H-M
280 FOR Y=0 TO V+1
290 FOR X=0 TO H+1
300 P$(Y,X)="-":V(Y,X)=0
310 NEXT X
320 NEXT Y
330 FOR F=1 TO M
340 Y=INT(RND(1)*V)+1:X=INT(RND(1)*H)+1
350 IF V(Y,X)=1 THEN 340 ELSE V(Y,X)=1
360 NEXT F
370 PRINT
380 REM
390 REM *** Introducir la celda
400 REM
410 GOSUB 1060
420 PRINT USING "Minas:###/### -> ";C;M;
430 INPUT "Casilla ";T$
440 IF T$="00" THEN END
450 Z=0:IF LEFT$(T$,1)="*" THEN Z=1:T$=MID$(T$,2)
460 Y=VAL(MID$(T$,2)):IF Y<1 OR Y>V THEN 910
470 X=ASC(LEFT$(T$,1))-64:IF X<1 OR X>H THEN 910
480 IF P$(Y,X)<>"-" AND P$(Y,X)<>"*" THEN 910
490 IF Z=0 THEN 520
500 IF P$(Y,X)="-" THEN P$(Y,X)="*":C=C+1 ELSE P$(Y,X)="-":C=C-1
510 PRINT:GOTO 410
520 IF V(Y,X)=1 THEN 790
530 REM
540 REM *** Revisar celda indicada y alrededor
550 REM
560 PRINT:G=0:W=0
570 Y1=Y-G:IF Y1<1 THEN Y1=1
580 Y2=Y+G:IF Y2>V THEN Y2=V
590 X1=X-G:IF X1<1 THEN X1=1
600 X2=X+G:IF X2>H THEN X2=H
610 FOR F=Y1 TO Y2
620 FOR I=X1 TO X2
630 IF V(F,I)=1 THEN W=1:GOTO 650
640 IF P$(F,I)="-" THEN GOSUB 980
650 NEXT I
660 NEXT F
670 IF W=0 THEN G=G+1:GOTO 570
680 IF T>0 THEN 410
690 REM
700 REM *** Fin juego: El jugador gana
710 REM
720 GOSUB 1060
730 PRINT "FELICIDADES !!!   -- FIN JUEGO --";
740 GOSUB 1230
750 GOTO 70
760 REM
770 REM *** Fin juego: Se toca una mina
780 REM
790 FOR F=1 TO V
800 FOR I=1 TO H
810 IF V(F,I)=1 THEN P$(F,I)="*"
820 NEXT I
830 NEXT F
840 P$(Y,X)="X":GOSUB 1060
850 PRINT "* MINA !!!          -- FIN JUEGO --"
860 GOSUB 1230
870 GOTO 70
880 REM
890 REM *** Error: Se introduce una posicion erronea
900 REM
910 PRINT "* POSICION ERRONEA !!!";
920 GOSUB 1230
930 PRINT:PRINT
940 GOTO 410
950 REM
960 REM *** Rutina que comprueba la celda indicada
970 REM
980 T=T-1:N=V(F,I-1)+V(F,I+1)
990 N=N+V(F-1,I-1)+V(F-1,I)+V(F-1,I+1)
1000 N=N+V(F+1,I-1)+V(F+1,I)+V(F+1,I+1)
1010 IF N=0 THEN P$(F,I)=" " ELSE P$(F,I)=MID$(STR$(N),2):W=1
1020 RETURN
1030 REM
1040 REM *** Imprimir el tablero de juego
1050 REM
1060 PRINT "   ";
1070 FOR F=1 TO H
1080 PRINT CHR$(64+F)+" ";
1090 NEXT F
1100 PRINT
1110 FOR Y=1 TO V
1120 PRINT USING "## ";Y;
1130 FOR X=1 TO H
1140 PRINT P$(Y,X);" ";
1150 NEXT X
1160 PRINT
1170 NEXT Y
1180 PRINT
1190 RETURN
1200 REM
1210 REM *** Rutina de pausa hasta pulsar una tecla
1220 REM
1230 IF INKEY$<>"" THEN 1230
1240 IF INKEY$="" THEN 1240
1250 RETURN



APUNTES FINALES
El juego es una adaptación del clásico “Minefield” de Windows, entre otras versiones, pero desarrollado con MBASIC en un ZENITH Z-120 bajo CP/M-86.

Respecto al equipo, se podría definir como “una experiencia muy especial” el programar cualquier cosa en un equipo de estas características. El tipo de equipo, su excelente teclado y el monitor de fósforo verde en modo texto crear un “algo” único.

Evidentemente, y a diferencia de la versión Windows, esta versión funciona en modo texto, cosa que ha limitado el tamaño tanto vertical como horizontal para facilitar la introducción de la casilla, limitándolo a una letra y uno o dos dígitos.

El código fuente ha sido traspasado a otro PC mediante el programa 22DSK, y de aquí a un disquete CP/M-86 de un PC AMSTRAD PC-1512, desde el que he listado el programa mediante una impresora matricial. Como el AMSTRAD es más rápido que el ZENITH, el juego funciona un poco más rápido.

Para evitar los típicos problemas de control de pantalla del CP/M-86, por no estar estandarizados, me he limitado a hacer SCROLL del contenido de la pantalla. De esta forma me aseguro que funcione sin ningún problema en cualquier equipo. Funciona en MBASIC bajo CP/M-86 y CP/M-80 (el ZENITH Z-120 funciona con los dos), y lo he probado en el QBASIC y el GW-BASIC funcionando perfectamente también. Por la sencillez del código podría ser implementado en cualquier equipo que funcione con BASIC.

La principal dificultad ha consistido en conseguir un funcionamiento rápido, sobretodo en la rutina que revisa el estado de una celda. Si no encuentra ninguna mina a su alrededor amplia el rango pasando de 1x1 celda a 3x3, 5x5 y así sucesivamente. Afortunadamente el juego funciona bastante rápido tanto en esta parte como en su impresión en pantalla.

El tema del * es una forma sencilla de marcar/desmarcar las celdas “sospechosas” de contener una mina.

Sea como sea, es un juego simple pero muy entretenido. Ideal para hacer funcionar nuestra cabeza y nuestros retro-equipos.

Os invito a probarlo.

Mine1.jpg
Mine1.jpg (91.58 KiB) Visto 8212 veces

Mine2.jpg
Mine2.jpg (126.54 KiB) Visto 8212 veces

Mine3.jpg
Mine3.jpg (135.83 KiB) Visto 8212 veces

Mine4.jpg
Mine4.jpg (137.11 KiB) Visto 8212 veces

Mine5.jpg
Mine5.jpg (72.83 KiB) Visto 8212 veces

Mine6.jpg
Mine6.jpg (107.23 KiB) Visto 8212 veces

Mine7.jpg
Mine7.jpg (72.3 KiB) Visto 8212 veces
Buscando la IP de la W.O.P.R.

Avatar de Usuario
PabloMarmol
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 171
Registrado: 03 Sep 2012, 17:32
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Primera consola: Nintendo NES/Clónica
Ubicación: León, España
Gracias dadas: 16 veces
Gracias recibidas: 18 veces

Re: Campo Minado en MBASIC

Mensajepor PabloMarmol » 07 Abr 2013, 02:30

Me encanta tu serie de "programaciones" para sistemas retro.

Avatar de Usuario
zitror
Amiga 2500
Amiga 2500
Mensajes: 5349
Registrado: 02 Jul 2006, 00:16
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Ubicación: El interior de un Z80
Gracias dadas: 248 veces
Gracias recibidas: 103 veces
Contactar:

Re: Campo Minado en MBASIC

Mensajepor zitror » 07 Abr 2013, 21:11

Joder, esto sí que tiene retro-pintaza y más en ese Zenith =D>
(C) 1.982 Sinclair Research Ltd

La buhardilla de Zitror

Avatar de Usuario
digipure
Atari 1040 STf
Atari 1040 STf
Mensajes: 694
Registrado: 08 Jul 2009, 04:34
Sistema Favorito: Amstrad CPC
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Turbografx/PC Engine
Primera consola: (Otro)
Ubicación: Tokyo
Contactar:

Re: Campo Minado en MBASIC

Mensajepor digipure » 08 Abr 2013, 11:22

Buen trabajo!
No sabia que el BASIC de msoft tenia tanta compatibilidad entre versiones! Voy a probar si funciona en MSX también.

Por cierto, la maquina de la primera foto es una preciosidad!

Update

Quitando el randomize de la linea 30, parece que funciona bien en MSX ^^
Adjuntos
snapshot0001.png
MSX2+
snapshot0001.png (24.28 KiB) Visto 8126 veces

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Re: Campo Minado en MBASIC

Mensajepor dancresp » 08 Abr 2013, 12:32

digipure escribió:Buen trabajo!
No sabia que el BASIC de msoft tenia tanta compatibilidad entre versiones! Voy a probar si funciona en MSX también.

Por cierto, la maquina de la primera foto es una preciosidad!

Hombre, ya que lo has picado, ¿que tal si subes la versión MSX? :D

De todas formas, si usas el SCREEN 0 y pones un WIDTH 40 quedará mejor.
Y si tienes un MSX-2 y pones un WIDTH 80 quedará igualito al de la foto (con un KEY OFF).

Y si, esa máquina es una preciosidad tanto por dentro como por fuera.
Un equipo dual, equipado con un 8085 (8 bits) y un 8088 (16 bits) ambos a 5 MHz.
Con esto puedes usar el CP/M y el CP/M-86 sin problemas.
Buscando la IP de la W.O.P.R.

Avatar de Usuario
jotego
Atari 1040 STf
Atari 1040 STf
Mensajes: 657
Registrado: 16 Ene 2013, 23:25
Sistema Favorito: Atari ST
primer_sistema: Amstrad CPC
consola_favorita: Sony PlayStation 2
Primera consola: Atari Lynx
Ubicación: Valencia (España)
Gracias dadas: 27 veces
Gracias recibidas: 44 veces
Contactar:

Re: Campo Minado en MBASIC

Mensajepor jotego » 08 Abr 2013, 23:34

Por entradas como esta merece la pena leer el foro =D>

Avatar de Usuario
digipure
Atari 1040 STf
Atari 1040 STf
Mensajes: 694
Registrado: 08 Jul 2009, 04:34
Sistema Favorito: Amstrad CPC
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Turbografx/PC Engine
Primera consola: (Otro)
Ubicación: Tokyo
Contactar:

Re: Campo Minado en MBASIC

Mensajepor digipure » 09 Abr 2013, 03:02

Ya que nos ponemos así, aquí esta la versión MSX :D .
mines.zip
Campo Minado MSX
(2.98 KiB) Descargado 344 veces


snapshot0002.png
snapshot0002.png (23.08 KiB) Visto 8071 veces


Le he puesto en el modo de que dijiste, y con fondo negro / color verde para que sea aun mas parecido y en una imagen de disco con auto-arranque ^.^

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Re: Campo Minado en MBASIC

Mensajepor dancresp » 09 Abr 2013, 09:39

digipure escribió:Ya que nos ponemos así, aquí esta la versión MSX :D .

Le he puesto en el modo de que dijiste, y con fondo negro / color verde para que sea aun mas parecido y en una imagen de disco con auto-arranque ^.^

Olé, Olé !!! =D>
Clavadito a la versión original.

Que ilusión poder jugar sin tenerlo que teclear yo. :tecle:

Muchas gracias !!! :jumper:

¿Alguien se anima a adaptarlo a otros sistemas con el mínimo número de cambios posible? :-ss
Buscando la IP de la W.O.P.R.

Avatar de Usuario
xgipe
Atari 1040 STf
Atari 1040 STf
Mensajes: 941
Registrado: 26 May 2010, 15:59
Sistema Favorito: MSX
primer_sistema: MSX
consola_favorita: Sega Master System
Primera consola: Videopac
Ubicación: Ankh-Morpork
Gracias dadas: 88 veces
Gracias recibidas: 69 veces

Re: Campo Minado en MBASIC

Mensajepor xgipe » 09 Abr 2013, 11:47

Si tengo un ratillo intentaré pasarlo al TA Alphatronic... aunque tengo que revisar mi cable de cassette, que creo que fallaba.
O:)
BLOAD "CAS:",R
Found: WIN3.11

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Re: Campo Minado en MBASIC

Mensajepor dancresp » 09 Abr 2013, 11:54

xgipe escribió:Si tengo un ratillo intentaré pasarlo al TA Alphatronic... aunque tengo que revisar mi cable de cassette, que creo que fallaba.
O:)

En el Alphatronic es otro sistema en el que ha de funcionar tal cual. :rezo

Venga, venga, a animarse !!! :tecle:
Buscando la IP de la W.O.P.R.


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados