SOLITARIO para ZX-80

dancresp
Mensajes: 5669
Registrado: 13 Nov 2010 02:08
Agradecido : 343 veces
Agradecimiento recibido: 470 veces

SOLITARIO para ZX-80

Mensajepor dancresp » 12 Jun 2020 23:30

Solitaire.png
Solitaire.png (2.66 KiB) Visto 362 veces


EL JUEGO
Basado en un juego de mesa, aparentemente inventado en Francia durante el siglo XVII por un noble encarcelado en La Bastille. Hay diferentes variantes respecto a la forma del tablero y el número de casillas.

En esta versión el tablero se compone de 45 casillas, ocupadas todas por una ficha, excepto la central.
Mediante una serie de movimientos se van eliminando las fichas, hasta dejar una única ficha que debe ser la que estaba vacía al principio de la partida.
Los movimientos consisten en hacer saltar una ficha sobre una de las adyacentes siempre que a continuación la casilla esté vacía. En este caso hay que eliminar la ficha sobre la que hemos saltado.

El movimiento se indica introduciendo 4 numeros comprendidos entre el 1 y el 9:
- Fila inicial / Columna inicial / Fila destino / Columna destino

Ejemplo de movimiento:
“3555” para saltar de la fila 3 columna 5 a la fila 5 columna 5.


Descargar el juego en formato ".o":
Solitaire.rar
(489 Bytes) Descargado 13 veces



BLOQUES
He dividido el listado en 3 bloques:
- Impresión del tablero.
- Introducir la tirada y comprobar el tipo de movimiento a realizar.
- Comprobar si el movimiento es correcto y actualizar las fichas.


COMO FUNCIONA
A continuación detallo, línea por línea, el funcionamiento del programa.

Se utilizan las siguientes variables:
B - Número de bolas que quedan.
F - Variable usada para diversas acciones.
P - Puntero a la primera posición después del 9 en inverso del REM de la línea 1.
X – Variable para coordenada horizontal al dibujar la pantalla o entrar el movimiento.
Y – Variable para coordenada vertical al dibujar la pantalla o entrar el movimiento.
A$ - Entrada del movimiento a realizar

1 – Línea REM que contiene la cabecera del tablero en pantalla y las 81 casillas de juego.
2 – Guardamos el puntero a la línea REM en la variable “P”.
3 - Guardamos en la variable "F" el valor de la variable "P".
4 – Inicio del bucle vertical que inicializa la zona de juego.
5 – Inicio del bucle horizontal que inicializa la zona de juego.
6 – POKE que pone un "." o un "O" según corresponda a su posición.
7 - Incrementa la variable "F" en 1.
8 – Final del bucle horizontal de inicialización.
9 – Final del bucle vertical de inicialización.
10 - POKE al REM correspondiente a la zona central del tablero.
20 - Guarda en la variable "F" el puntero al primer carácter de la línea REM.
21 - Guardamos en la variable "B" el valor 0.
22 - Borrado de pantalla.
23 – Inicio del bucle que controla la posición vertical de la impresión de la pantalla.
24 – Mostramos el número de fila en vídeo inverso.
25 - Inicio del bucle que controla la posición horizontal de la impresión de la pantalla.
26 - Mostrar el carácter correspondiente de la línea REM.
27 - Si el carácter impreso es una "O", se incrementa la variable "B" en 1.
28 – Incrementa “I” en 1 para avanzar en el puntero al REM.
29 – Final del bucle horizontal.
30 – Salto de línea en pantalla.
31 - Final del bucle vertical.
40 – Salto de línea en pantalla.
41 – Muestra en pantalla el número de bolas que quedan.
42 – Salto de línea en pantalla.
43 – Muestra en pantalla el formato de la entrada del movimiento.
44 – Entrar el movimiento en la variable “A$”.
45 - Calcula la posición inicial en función de los dos primeros dígitos introducidos.
46 - Quita los dos primeros caracteres de la variable "A$".
47 - Calcula la posición final en función de los dos dígitos que quedan en "A$".
48 - Verifica que el movimiento inicial sea correcto.
49 - Verifica que el movimiento FINAL sea correcto.
50 - POKE a la línea REM para poner un "." en la posición de inicio.
51 - POKE a la línea REM para poner un "." en la posición central del movimiento.
52 - POKE a la línea REM para poner un "O" en la posición de final.
53 - Saltar a la línea 20.

EL PROGRAMA

Solitario_List.png
Solitario_List.png (10.09 KiB) Visto 362 veces


APUNTES FINALES
Este juego es otra adaptación de un juego publicado el 10 de julio del 2014 para un ZX-81 con 1K.

En un principio yo publiqué un listado en BASIC, pero seis días después mcleod_ideafix publicó una adaptación mejor y más corta. Así que he usado su versión como base para esta versión de ZX-80.

El REM de la línea 1 debe contener 90 caracteres. Los 9 primeros indican las columnas, y los otros 81 hacer de buffer de pantalla e indican el estado del tablero. Al introducir estos 81 caracteres se puede poner cualquier carácter ya que las líneas 3 a 9 del programa se encargan de inicializarlos correctamente.

Cómo adaptar un programa del ZX-81 al ZX-80
El ZX-80 es mucho más simple y limitado que el ZX-81, pero se le puede sacar mucho más rendimiento a ese 1 KB de RAM, ya que tanto las líneas como las variables numéricas ocupan menos. Incluso en algunas cosas es más rápido ya que siempre trabaja en modo FAST.

Solitario_8081.png
Solitario_8081.png (338.26 KiB) Visto 362 veces


El principal engorro al programar en el ZX-80 es el hecho de no poder acceder libremente a la pantalla, ya que no hay el AT del ZX-81 o del SPECTRUM. Para capear este problema, monto un buffer de pantalla en una línea REM, que puedo POKEar libremente, y después mediante una variable a modo de puntero y un doble bucle la paso a la pantalla. El resultado salta a la vista.

Otra limitación es que, salvo que desconozca como hacerlo, no se pueden introducir caracteres en vídeo inverso directamente desde el teclado, a diferencia del ZX-81. Así, la única forma que he encontrado de introducirlos en el propio listado del programa es POKEando directamente en la memoria. En este caso, la primera fila y la primera columna muestran números en vídeo inverso. Para las columnas he tenido que POKEar en la línea del REM y para las filas mediante un PRINT con un CHR$.


Para terminar
Hay artículos en los que se comentan las estrategias que hay para solucionar el juego en sus múltiples variantes, consistente en agrupar las fichas en zonas con una forma concreta y aplicar unos movimientos determinados para solucionar cada una de las zonas, todo ello en un orden concreto.

Solucion.jpg
Solucion.jpg (81.15 KiB) Visto 362 veces


Os invito a probarlo…
Buscando la IP de la W.O.P.R. he encontrado mi índice

Volver a “Lenguajes de Programación y herramientas Dev”

¿Quién está conectado?

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