BATTLESHIPS para ZX-80

dancresp
Mensajes: 5647
Registrado: 13 Nov 2010 02:08
Agradecido : 334 veces
Agradecimiento recibido: 459 veces

BATTLESHIPS para ZX-80

Mensajepor dancresp » 26 Jun 2020 22:03

BattleShips_Screen.png
BattleShips_Screen.png (2.58 KiB) Visto 250 veces


EL JUEGO
Este programa es una sencilla versión del clásico juego de los barquitos para jugar contra el ZX-80.

Cada contrincante dispone de una flota de 5 barcos de dos posiciones cada uno.

En el tablero de 10x10 casillas se muestran las posiciones de los barcos del jugador y las tiradas que va realizando el ZX-80. El jugador deberá llevar el control de sus jugadas en una hoja de papel o jugando de memoria.

Inicia la partida el ZX-80 y de forma alternativa se van realizando las tiradas. En caso de que el ZX-80 toque un barco del jugador, vuelve a realizar una nueva tirada. A continuación tira el jugador introduciendo un valor formado por una letra y un número, correspondientes al formato "fila/columna”.

El primer jugador que hunde los cinco barcos del adversario gana la partida.

Para iniciar una nueva partida se debe detener el programa con “BREAK” y hacer “RUN”.


Descargar el juego en formato ".o":
BattleShips.rar
(555 Bytes) Descargado 9 veces


BLOQUES
He dividido el listado en 6 bloques:

- Inicializar tablero.
- Introducir la posición de los barcos de los dos jugadores.
- Tirada del ZX-80.
- Comprobar tirada del jugador.
- Mostrar el tablero.
- Tirada del jugador.


COMO FUNCIONA
A continuación detallo el funcionamiento de las 47 líneas del programa.

Se utilizan las siguientes variables:
A – Variable auxiliar en varios puntos.
F – Variable para bucles, o auxiliar en varios puntos.
I – Variable para bucles, o auxiliar en varios puntos.
N – Variable para bucles, o auxiliar en varios puntos.
P - Puntero al primer carácter de la línea REM
E(5) - Matriz donde se guardan la primera posición de los barcos del ZX-80.
A$ - Casilla donde se tira.

1 - REM que se usa como búfer de pantalla, posición de los barcos del jugador y tiradas del ZX-80.
2 - Declaremos la matriz donde se guardan la primera posición de los barcos del ZX-80.
3 - Guardamos en la variable "P" el puntero al carácter número 11 del REM de la línea 1.
5 - Modificamos la generación de números aleatorios.
10 - Inicio del bucle que pone puntos en 100 posiciones del REM de la línea 1.
11 - POKE en el REM de la línea 1 con el carácter "."
12 - Final del bucle
20 - Inicio del bucle que controla la introducción de los barcos del jugador.
21 - Salta a la subrutina de la línea 70 que muestra el tablero en pantalla.
22 - Muestra el mensaje que avisa que hemos de introducir nuestros barcos.
23 - Salta a la subrutina de la línea 90 que nos permite introducir una posición.
24 - POKE a la posición indicada en la línea REM para indicar la primera posición de un barco del jugador.
25 - POKE a la siguiente posición en la línea REM para indicar la segunda posición de un barco del jugador.
26 - Guardamos en la matriz "E" la posicón de uno de los barcos del ZX-80.
27 - Final del bucle de introducción de los barcos.
30 - Guardamos en la variable "N" la tirada del ZX-80.
31 - Se guarda en la variable "A" el carácter correspondiente en la línea REM.
32 - Si el carácter en "A" corresponde a un barco tocado o una posición donde ya se ha disparado salta a 30.
33 - Pone un carácter en la posición del REM según si hay barco o no.
34 - Si no se ha tocado a un barco del jugador, salta a la línea 40.
35 - Incrementa en 1 la posición donde ha disparado el ZX-80.
36 - Salta a la línea 31 para ´realizar un nuevo disparo.
40 - Salta a la subrutina de la línea 70 que muestra el tablero en pantalla.
41 - Salta a la subrutina de la línea 90 que nos permite introducir una posición.
42 - Inicio del bucle que controla si hemos tocado alguno de los barcos del ZX-80.
43 - Si la posición indicada o la siguiente no está en una posición de la matriz salta a la línea 46.
44 - Muestra el mensaje de que hemos tocado una posición de un barco del ZX-80.
45 - INPUT de espera a que pulsemos una tecla para seguir ejecutando el programa.
46 - Final del bucle que comprueba si hemos tocado un barco del ZX-80.
47 - Saltamos a la línea 30 para que el ZX-80 vuelva a hacer una tirada.
70 - Guardamos en la variable "A" la posición al primer carácter del REM de la línea 1.
71 - Borramos la pantalla.
72 - Inicio del bucle que controla la posición vertical de la impresión del tablero.
73 - Se muestra la letra en negrita que identifica la fila.
74 - Inicio del bucle que controla la posición horizontal de la impresión del tablero.
75 - Mostramos un carácter del REM.
76 - Incrementamos el puntero guardado en "A".
77 - Final del bucle de control horizontal.
78 - Salto de línea en pantalla.
79 - Final del bucle de control vertical.
80 - Salto de línea en pantalla.
81 - Retorno de la subrutina.
90 - Muestra el mensaje del formato de la entrada del tiro del jugador.
91 - Introducción de la tirada en la variable A$.
92 - Calculamos la posición a partir de los dos caracteres de A$.
93 - Salta a la línea 91 si la tirada es menor de 0 o mayor de 99.
94 - Retorno de la subrutina.


EL PROGRAMA
BattleShips_List.png
BattleShips_List.png (11.73 KiB) Visto 250 veces


APUNTES FINALES
Este juego es otra adaptación de un juego que ya he publicado previamente para el ZX-81 con 1 KB, y como en los anteriores casos el resultado ha sido superior a la versión original.

BattleShips_8081.png
BattleShips_8081.png (319.18 KiB) Visto 250 veces


Dibujando el tablero
Como en otras ocasiones, he usado el REM de la línea 1 como búfer del contenido de la pantalla, y en este caso también para controlar que tiradas ha realizado el ZX-80 y dónde están posicionados los barcos del jugador. Todo ello en 110 caracteres.

Los primeros 10 caracteres se han tenido que POKEar manualmente ya que el ZX-80 no permite introducir caracteres en negrita desde el teclado.

Colocando los barcos
Cada jugador debe introducir 5 barcos que ocupan dos posiciones. En el caso del jugador, salvo que haya mala intención, la colocación debe ser correcta. Pero en el caso del ZX-80 hay que evitar que dos barcos puedan ocupar la misma posición, y con una simple línea y algo de ingenio lo he conseguido.

Vamos a repetir las siguientes líneas un total de cinco veces. Una por barco y usando el valor del bucle “N” como contador.

Para que el jugador coloque un barco se llama a la subrutina que hay en la línea 90. Nos pide introducir una posición con el formato “fila/columna”. Con estos dos valores ponemos el gráfico del barco en la posición correspondiente del tablero. Todo Bastante simple.

Para las posiciones de los barcos del ZX-80 la cosa se complica.

Primero hay que pensar donde se van a guardar. ¿Solución? Uso una matriz de 5 elementos para guardar la primera posición de cada barco, calculada aleatoriamente.

Para evitar que la posición de dos barcos coincida, he dividido el tablero en 5 zonas de dos líneas cada una, así el primer barco debe estar entre la fila 1 y 2, el segundo entre la 3 y la 4, etc. De esta forma no hay que hacer ninguna comprobación, aunque sí se sabe el “truco” cuando hundes un barco en una fila no hace falta seguir buscando en las dos filas correspondientes.

Tira el ZX-80
Para evitar que el ordenador tire dos veces en la misma casilla y ya que no tengo espacio para guardar las posiciones donde ya ha tirado, voy a usar los caracteres de la línea REM para controlarlo. Así, genero un número aleatorio y consulto en la memoria de la línea REM si hay una “O” en negrita o un punto. En caso negativo vuelvo a generar otro número, hasta que la tirada es correcta.

Si el ZX-80 ha tocado una parte de un barco, se activa una sencilla rutina de “inteligencia artificial” que lo que hace es incrementar en 1 la posición horizontal de la tirada realizada (a la derecha) y vuelve a comprobar que hay en esa posición. Es un pequeño hándicap que favorece al ZX-80.

Tira el jugador
El jugador debe controlar las casillas donde ya ha tirado mediante una hoja de papel o con una hoja de Excel que se ejecute en un PC con un Intel i7, 16 GB de RAM y doble disco duro SSD.

En este caso vamos a ir a la subrutina de la línea 90, la cual a partir de unas coordenadas nos devuelve una posición absoluta.

A continuación se inicia un bucle que se repite 5 veces y que sirve para comprobar si el valor absoluto de las coordenadas indicadas coincide con la primera posición de uno de los cinco barcos del ZX-80 o con la posición contigua, ya que el barco ocupa dos posiciones. El valor absoluto se calcula multiplicando la coordenada vertical por diez y sumándole la horizontal.

Si hemos tocado un barco aparece el texto “HIT”.

Final de partida
Como en ningún momento se controla el número de impactos de ninguno de los contendientes, la partida puede entrar en un bucle sin fin cuando el ZX-80 ha llenado todas las casillas. Así que cuando uno de los contendientes haya localizado las 10 partes de los barcos, se deberá hacer un “BREAK” y un “RUN” para iniciar otra partida.

Y si ya has tenido bastante, siempre nos quedará “NEW”.


Pues nada más. Con sus limitaciones el programa funciona más que bien y hasta es entretenido, así que…

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

Avatar de Usuario
Alki
Mensajes: 64
Registrado: 23 Nov 2016 10:05
Agradecido : 5 veces
Agradecimiento recibido: 11 veces

Re: BATTLESHIPS para ZX-80

Mensajepor Alki » 26 Jun 2020 22:59

Que envidia me das.. Y en tan pocas lineas.. Enhorabuena


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 1 invitado