Galaxy Wars para ZX-Spectrum

Foro dedicado a la programación en todo tipo de sistemas clásicos.
Avatar de Usuario
radastan
Amiga 2500
Amiga 2500
Mensajes: 4542
Registrado: 11 Jun 2007, 19:29
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sega Genesis/Megadrive
Primera consola: TV Games/Pong Clone
Ubicación: Córdoba
Gracias dadas: 9 veces
Gracias recibidas: 40 veces
Contactar:

Re: Galaxy Wars para ZX-Spectrum

Mensajepor radastan » 28 Jun 2013, 13:44

Cambia:

470 IF N>5 THEN LET N=N+1

por:

470 LET N=N+(N>5)

Y también:

110 IF INKEY$="z" THEN IF X>3 THEN LET X=X-1
120 IF INKEY$="x" THEN IF X<28 THEN LET X=X+1

110 LET G$=INKEY$
120 LET X=X-(X>3 AND G$="z")+(x<28 AND G$="x")

A ver si se nota mejoría. La verdad es que el código es muy optimizable, has usado en BASIC un poco a lo burro.

Por ejemplo, cada vez que consultas el teclado con INKEY$ tarda un huevo, lo suyo es consultarlo una vez por ciclo y ya está. Usa la variable G$ que te he creado en vez de INKEY$ y verás la diferencia. La mejor forma es olvidarte de mirar por INKEY$ y usar PEEK directamente a la variable de teclado, que encima permite teclas simultáneas.
Yo tengo una máquina del tiempo, se llama ZX Spectrum, siempre me devuelve a los buenos momentos.
(\.../) (\.../) (\.../) (\.../)
( *.*) ('.'= ) ('.'= ) ('.'= )
(")_(") (")_(") (")_(") (")_(")
╔═══╦═══╦═══╦══╦══╗
║╔═╗║╔═╗║╔═╗╠╣╠╩╣╠╝
║║─║║╚══╣║─╚╝║║─║║
║╚═╝╠══╗║║─╔╗║║─║║
║╔═╗║╚═╝║╚═╝╠╣╠╦╣╠╗
╚╝─╚╩═══╩═══╩══╩══╝

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: Galaxy Wars para ZX-Spectrum

Mensajepor dancresp » 28 Jun 2013, 17:43

radastan escribió:La verdad es que el código es muy optimizable, has usado en BASIC un poco a lo burro.

>| :-s [-X

La verdad es que tal y como lo comentas tú es como suelo hacerlo en el trabajo.
Intento muchas veces reducirlo todo a la mínima expresión.

Pero cuando trabajas con un BASIC interpretado en máquinas que van a menos de 4 MHz, muchas veces lo más reducido no es lo más rápido o eficiente.
También, una de las cosas que me gustan de publicar los programas es que los menos iniciados los pueda entender con cierta facilidad, y reducir demasiado el código puede no ayudar. Te aseguro que puedo llegar a usar PEEK/POKE en lugar de LET.

De todas formas, suelo tener dilemas en como hacer una cosa ya que pueden haber varias formas de hacerlo.
Y suelo resolverlo cronómetro en mano... imagina.

Bueno, pues vamos a ver porque creo que no hago las cosas a lo burro (tranquilo que me ha hecho gracia).

Por ejemplo: Lectura del teclado

110 IF INKEY$="z" THEN IF X>3 THEN LET X=X-1
120 IF INKEY$="x" THEN IF X<28 THEN LET X=X+1

110 IF INKEY$="z" AND X>3 THEN LET X=X-1
120 IF INKEY$="x" AND X<28 THEN LET X=X+1

110 LET G$=INKEY$
120 LET X=X-(X>3 AND G$="z")+(x<28 AND G$="x")


Vamos a analizar la línea 110.
Lo más normal es hacerlo de una de estas tres formas.
Personalmente me gusta más la segunda o tercera opción, pero he optado por la primera.
¿Porque?


Lo realmente importante es ver si has pulsado la "z" y a partir de aquí compruebas si has de cambiar la posición de la nave.

1) Si no pulso la "z" el programa ignora el resto de la línea. Solo si pulso compruebo el valor de X, y si no es mayor de 3 no hago la resta. Es rápido si no pulsas la tecla.

2) En este caso el programa evalúa dos condiciones antes de decidir si hace la resta. ¿Para que comprobar el valor de X si no he pulsado la tecla "z"?

3) En este caso se hacen una suma y una resta del resultado de dos AND que contienen dos condiciones cada uno, metidos en dos paréntesis. Si no pulsas ninguna tecla estas continuamente sumando 0 y restando 0. Sin duda, más lento.

Pero... ¿Ventaja del método tres? (ojo, que lo solía hacer así)
Estabiliza la velocidad del programa, porque pulses las tecla o no siempre acaba tardando el mismo tiempo en ejecutarse la línea.

Pero yo he preferido hacer que si no se pulsa ninguna tecla el programa vaya más rápido, y para eso lo mejor es el método 1.

Programar es tomar decisiones y yo las he intentado tomar con cierta lógica.

Por cierto, el programa es una traslación casi línea a línea de la versión del COMMODORE-16 y allí si que he metido el valor del INKEY$ en una variable.
Aquí se me pasó, pero no lo he podido debugar todo lo que me habría gustado. "Mardito" tiempo...

Si queréis abrimos un hilo y nos dedicamos a hacer pruebas de optimización de código, aunque cambia entre sistemas. Te lo digo yo.

Para terminar, sois libres de modificar, mejorar o hacer lo que queráis con el código.
Y si encima publicáis los cambios... de coña.

Un saludo


EDITO:
Acabo de ejecutar 3 programas en un SINCLAIR ZX-SPECTRUM+ real.

Programa-1
10 LET X=5
20 LET F=0
110 LET G$=INKEY$
120 LET X=X+(X>3 AND G$="z")-(X<28 AND G$="x")

180 LET F=F+1
190 PRINT AT 0,0;F
200 IF F<1000 THEN GOTO 110


Programa-2 [Método usado en el programa]
10 LET X=5
20 LET F=0
110 IF INKEY$="z" THEN IF X>3 THEN LET X=X-1
120 IF INKEY$="x" THEN IF X>28 THEN LET X=X+1
180 LET F=F+1
190 PRINT AT 0,0;F
200 IF F<1000 THEN GOTO 110


Programa-3
10 LET X=5
20 LET F=0
110 LET K$=INKEY$
120 IF K$="z" THEN IF X>3 THEN LET X=X-1
130 IF K$="x" THEN IF X>28 THEN LET X=X+1
180 LET F=F+1
190 PRINT AT 0,0;F
200 IF F<1000 THEN GOTO 110

Resultados:
Programa-1 sin pulsar teclas: 40:85 segundos.
Programa-2 sin pulsar teclas: 28:93 segundos.
Programa-3 sin pulsar teclas: 33:53 segundos.

El programa-2 es el más rápido y el programa-1 es un 41% más lento.

Programa-1 pulsando tecla "Z": 41:97 segundos.
Programa-2 pulsando tecla "Z": 33:30 segundos.
Programa-3 pulsando tecla "Z": 37:25 segundos.

El programa-2 es el más rápido y el programa-1 es un 27% más lento.

El resultado es lógico:
Como no tiene sentido pulsar la tecla "z" y "x" a la vez, no es necesario comprobar en cada pasada si se están pulsando las dos teclas y comprobando si el valor de la variable X está entre los límites para dar las dos condiciones por buenas.

Respecto a almacenar el valor de INKEY$ en una variable, para el BASIC es más lento almacenar y consultar la variable que revisar el teclado.

De todas formas, esto demuestra que el programa-1 es el más regular ya que solo hay 1 segundo de diferencia entre si hay una tecla pulsada o no.
Pero en el caso del programa-2 solo hay una diferencia de 4 segundos lo que es casi inapreciable durante la ejecución de un programa bastante más rápido.

Pues visto lo visto, veo mi solución como la menos elegante pero sin duda es la más rápida.

Ya digo que uso mucho el cronómetro... pero es que es BASIC.

Otro saludo
Buscando la IP de la W.O.P.R.

Avatar de Usuario
radastan
Amiga 2500
Amiga 2500
Mensajes: 4542
Registrado: 11 Jun 2007, 19:29
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sega Genesis/Megadrive
Primera consola: TV Games/Pong Clone
Ubicación: Córdoba
Gracias dadas: 9 veces
Gracias recibidas: 40 veces
Contactar:

Re: Galaxy Wars para ZX-Spectrum

Mensajepor radastan » 28 Jun 2013, 23:37

Pues mire usted, muchas gracias, nunca se acuesta uno sin aprender algo más. Yo estaba equivocado.
Yo tengo una máquina del tiempo, se llama ZX Spectrum, siempre me devuelve a los buenos momentos.
(\.../) (\.../) (\.../) (\.../)
( *.*) ('.'= ) ('.'= ) ('.'= )
(")_(") (")_(") (")_(") (")_(")
╔═══╦═══╦═══╦══╦══╗
║╔═╗║╔═╗║╔═╗╠╣╠╩╣╠╝
║║─║║╚══╣║─╚╝║║─║║
║╚═╝╠══╗║║─╔╗║║─║║
║╔═╗║╚═╝║╚═╝╠╣╠╦╣╠╗
╚╝─╚╩═══╩═══╩══╩══╝

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1489
Registrado: 07 Nov 2009, 11:38
Sistema Favorito: C64
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo SNES
Ubicación: Madrid
Gracias dadas: 14 veces
Gracias recibidas: 244 veces

Re: Galaxy Wars para ZX-Spectrum

Mensajepor BlackHole » 29 Jun 2013, 00:09

dancresp escribió:Ya digo que uso mucho el cronómetro... pero es que es BASIC

Usa la variable del sistema FRAMES (23672/23673/23674) que se incrementa 50 veces por segundo y así no necesitas estar esperando con cronómetro en mano 8-)

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: Galaxy Wars para ZX-Spectrum

Mensajepor dancresp » 29 Jun 2013, 00:32

radastan escribió:Pues mire usted, muchas gracias, nunca se acuesta uno sin aprender algo más. Yo estaba equivocado.

Desgraciadamente hoy en día se programa como tú has indicado. Yo el primero muchas veces.

En sistemas que corren a 2,6 GHz se piensa... va, no pasa nada, que la máquina es muy rápida.
Pero en sistemas a 1 MHz o 3,5 MHz hay que cambiar el chip e intentar que todo sea lo más eficiente posible, porque sino el programa no tira.

Por eso, en 8 bits lo hago como lo hago y en mi vida profesional lo hago como indicas tú.

En 8 bits prefiero programar en ensamblador, pero le he cogido el gusto a programar en BASIC porque es todo un reto el intentar optimizarlo todo al límite.
Cuando veo el "STAR WARS - The Empire Strikes Back" de MSX me cuesta cree que lo he hecho en BASIC. Entre otros.

Blackhole, conozco la variable del sistema que indicas, pero como no es tan cómoda de usar como el TIME del MSX me da palo usarlo...

Un saludo
Buscando la IP de la W.O.P.R.

Avatar de Usuario
NeilParsons
Amiga 1200
Amiga 1200
Mensajes: 1281
Registrado: 02 Ago 2007, 16:47
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: C64
consola_favorita: Sony PlayStation 1
Ubicación: Digamos que del sur, en frente del peñón.
Gracias dadas: 3 veces

Re: Galaxy Wars para ZX-Spectrum

Mensajepor NeilParsons » 09 Jul 2013, 16:57

Una pregunta, ¿el archivo WAV está bien? No consigo cargarlo con el Spectaculator ni tampoco con el ZX Spin. Haría falta que el programa estuviera tambièn en formato TAP o TZX.

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1489
Registrado: 07 Nov 2009, 11:38
Sistema Favorito: C64
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo SNES
Ubicación: Madrid
Gracias dadas: 14 veces
Gracias recibidas: 244 veces

Re: Galaxy Wars para ZX-Spectrum

Mensajepor BlackHole » 10 Jul 2013, 01:23

NeilParsons escribió:Una pregunta, ¿el archivo WAV está bien? No consigo cargarlo con el Spectaculator ni tampoco con el ZX Spin. Haría falta que el programa estuviera tambièn en formato TAP o TZX.

No está bien "del todo", porque es estéreo. Hay que eliminar un canal para que lo pillen ciertos emuladores.
Puedes usar el TAP que puse el otro día en el hilo de RetroWiki sobre el Galaxy Wars.
El TAP lleva la versión original y además otra versión compilada a C/M en una prueba rápida, ya que andábamos comentando el tema, para ver velocidades.

Avatar de Usuario
NeilParsons
Amiga 1200
Amiga 1200
Mensajes: 1281
Registrado: 02 Ago 2007, 16:47
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: C64
consola_favorita: Sony PlayStation 1
Ubicación: Digamos que del sur, en frente del peñón.
Gracias dadas: 3 veces

Re: Galaxy Wars para ZX-Spectrum

Mensajepor NeilParsons » 10 Jul 2013, 16:37

Gracias BlackHole.

+1

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: Galaxy Wars para ZX-Spectrum

Mensajepor dancresp » 03 Ene 2014, 13:38

Subo el hilo porque he añadido un enlace al fichero ".tap" para poder ejecutarlo en emulador.
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 8 invitados