Karoshi MSX Community
05 de Julio de 2021, 07:42:41 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2 3
  Imprimir  
Autor Tema: Un juego nuevo  (Leído 13626 veces)
0 Usuarios y 1 Visitante están viendo este tema.
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« : 26 de Mayo de 2006, 01:54:36 pm »

Hola a todos. Como os adelanté en otros temas, he invertido algo de tiempo en hacer un juego compacto, y el resultado os lo dejo aquí mismo, para que lo disfrutéis. Se trata del juego de la serpiente de toda la vida, en una implementación muy sencilla, pero funcional, con gráficos e incluso sonido en sólo 256 bytes de código.

Si alguien se anima, que compile las versiones BIN y ROM y que las suba al foro mismo como descarga, que desde donde estoy no puedo hacerlo yo mismo. Gracias por vuestra ayuda.

Espero que lo disfrutéis. Eso sí, el código está bastante ofuscado. Más que analizarlo, deberíais jugarlo.  Grin

Código:
;-----------------------------------------------------------------------
; TINY SNAKE v.0.10
;-----------------------------------------------------------------------
; The classic snake game coded for MSX in only 256 bytes!
;-----------------------------------------------------------------------
; (C) 2006, Karoshi Corporation
; Coded by Eduardo Robsy Petrus
;-----------------------------------------------------------------------
; Started on 24th May 2006
; Finished on 26th May 2006
;-----------------------------------------------------------------------
; asMSX directives
;-----------------------------------------------------------------------
; Headers to create a ROM
;-----------------------------------------------------------------------
;       .bios
;       .page   2
;       .rom
;       .start  INIT
;       .db     "[KO03] SNAKE CLASSIC v.0.10",1Ah
;       VARIABLES       equ     0C000h
;-----------------------------------------------------------------------
; Headers to create a Basic binary
;-----------------------------------------------------------------------
        .bios
        .page   3
        .basic
        .start  INIT
        VARIABLES       equ     0C100h
;-----------------------------------------------------------------------

;-----------------------------------------------------------------------
; VRAM position constants
;-----------------------------------------------------------------------
        NAMTBL  equ     1800h
;-----------------------------------------------------------------------

;-----------------------------------------------------------------------
; Program code
;-----------------------------------------------------------------------
INIT:

; Init SCREEN 1
        call    INIT32

; Clear RAM space
        ld      hl,LENGTH
@@CLEAR:
        ld      [hl],0
        inc     hl
        ld      a,0C8h
        cp      h
        jr      nz,@@CLEAR

; Draw vertical lines
        ld      hl,SCREEN+32
        ld      de,SCREEN+32*23
        ld      b,32
        ld      a,219
@@BOUNDS:
        ld      [hl],a
        ld      [de],a
        inc     hl
        inc     de
        djnz    @@BOUNDS
; Draw horizontal lines
        ld      de,SCREEN+95
        ld      [de],a
        ld      [hl],a
        inc     de
        ld      bc,32*20
        ldir

; Init snake position
        ld      hl,SCREEN+32*12+15
        ld      [SNAKE],hl

; Init food position
        inc     h
        ld      [hl],4

; Init snake length
        ld      hl,LENGTH
        inc     [hl]

; Main program
MAIN_LOOP:

; Copy positions
        ld      hl,SNAKE+511
        ld      de,SNAKE+513
        ld      bc,512
        lddr

; Read cursor/joystick
        xor     a
        call    GTSTCK

; Convert to direction code
        ld      c,a
        ld      b,0
        ld      hl,CONVERSION
        add     hl,bc
        ld      a,[hl]

; Store direction code
        ld      hl,DIRECTION
        or      a
        jr      z,@@MOVE

; Not opposite direction
        ld      c,a
        ld      a,[hl]
        add     c
        cp      5
        jr      z,@@MOVE

; Store new direction
        ld      [hl],c

; Convert direction to movement
@@MOVE:
        ld      a,[hl]
        add     a
        ld      c,a
        ld      hl,MOVEMENTS
        add     hl,bc
        ld      e,[hl]
        inc     hl
        ld      d,[hl]

; Update position
        ld      hl,[SNAKE]
        add     hl,de
        ld      [SNAKE],hl

; Check if element present
        ld      a,[hl]
        or      a
        jr      z,@@EMPTY

; Check if it is food or block
        rlca
        jr      nc,@@FOOD

; Collision: wait space to restart
@@WAIT:
        xor     a
        call    GTTRIG
        jr      z,@@WAIT
        jp      INIT

; Relocate food
@@FOOD:
        ld      a,r
        add     a
        ld      c,a
        ld      hl,SCREEN+65
        add     hl,bc
        add     hl,bc
        ld      a,[hl]
        or      a

; If destination is not empty, relocate
        jr      nz,@@FOOD

; Put it on the buffer
        ld      [hl],4

; Increase length
        ld      hl,LENGTH
        inc     [hl]

; Check if maximum size (255)
        jr      nz,@@BIGGER
        dec     [hl]

@@BIGGER:

; Increase score
; -First byte
        ld      hl,SCORE
        ld      a,01h
        add     [hl]
        daa
        ld      [hl],a
; -Second byte
        inc     hl
        ld      a,[hl]
        adc     b
        daa
        ld      [hl],a

; Dump to screen buffer
        ex      de,hl
        ld      hl,SCREEN
        ld      b,2

; BCD byte to ASCII codes
@@NUMBER:
        ld      a,[de]
        ld      c,a
        rra
        rra
        rra
        rra
        and     0Fh
        add     30h
        ld      [hl],a
        inc     hl
        ld      a,c
        and     0Fh
        add     30h
        ld      [hl],a
        inc     hl
        dec     de
        djnz    @@NUMBER

; Eating sound
        call    BEEP

@@EMPTY:

; Render snake
        ld      a,[LENGTH]
        ld      b,a
        ld      hl,SNAKE
        push    hl
@@RENDER:
        ld      e,[hl]
        inc     hl
        ld      d,[hl]
        inc     hl
        ld      a,219
        ld      [de],a
        djnz    @@RENDER

; Update screen
        halt
        halt
        halt
        ld      hl,SCREEN
        ld      de,NAMTBL
        ld      b,3
        call    LDIRVM

; Erase trail
        ld      a,[LENGTH]
        dec     a
        ld      c,a
        pop     hl
        add     hl,bc
        add     hl,bc
        ld      e,[hl]
        inc     hl
        ld      d,[hl]
        ex      de,hl
        ld      [hl],b

; Loop
        jp      MAIN_LOOP
;-----------------------------------------------------------------------

;-----------------------------------------------------------------------
; Tables
;-----------------------------------------------------------------------
; Stick results to directions
CONVERSION:
        db      0,1,0,3,0,4,0,2,0

; Directions to screen offsets
MOVEMENTS:
        dw      0,-32,-1,1,32
;-----------------------------------------------------------------------

;-----------------------------------------------------------------------
; Print code size
;-----------------------------------------------------------------------
FINISH:
.print FINISH-INIT
;-----------------------------------------------------------------------

;-----------------------------------------------------------------------
; Variables
;-----------------------------------------------------------------------
        .org    VARIABLES

; Length of the snake
LENGTH:
        ds      1

; Snake direction
DIRECTION:
        ds      1

; Score (2 bytes packed BCD)
SCORE:
        ds      2

; Screen buffer
SCREEN:
        ds      0400h

; Snake positions
SNAKE:
        ds      0200h
;-----------------------------------------------------------------------

;-----------------------------------------------------------------------
; And that's all, folks! Enjoy it.
;-----------------------------------------------------------------------
En línea
SapphiRe
Visitante
« Respuesta #1 : 26 de Mayo de 2006, 02:52:13 pm »

e incluso sonido

Código:
; Eating sound
        call    BEEP

 Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin

Me he estado riendo un buen rato.

Robsy tío, eres genial!!!

 Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #2 : 26 de Mayo de 2006, 03:11:13 pm »

Bueno, Sap, se trata de ser fiel a la verdad y lo he sido, ¿no?  Wink Si hubiese dicho "música" habría resultado más difícil de creer. Pero bueno, ¿lo has probado ya? Sólo lo he optimizado hasta llegar al tamaño meta, que eran los 256 bytes que me había fijado.

A ver si puedo hacer algún jueguecillo más de este tamaño (léase PONG, TRON, etc.)  Smiley
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #3 : 26 de Mayo de 2006, 03:13:00 pm »

Citar
Me he estado riendo un buen rato.

No lo pillo... Roll Eyes

Ahora yo declararía abierto el campeonato de "¡Reduce todavía más esto (si hay huevos)!"  Grin

En línea

Doom dee doom dee doom
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #4 : 26 de Mayo de 2006, 03:19:40 pm »

Pues se pueden seguir robando bytes, claro que sí, pero mi objetivo era encajarlo en 256 bytes, para hacer mi primer juego 100h. Y hasta aquí he llegado. Creo que hay alguna técnica interesante de cara a programas "serios", pero el código es bastante oscuro. De hecho, basta con cambiar el orden de las variables para que deje de funcionar Wink

Por cierto, ¿alguien lo ha probado? Siento ser un pesado, pero porfaplis, probad el engendro final -y subid al foro el .BIN y el .ROM, que yo no puedo.

Gracias.
En línea
SapphiRe
Visitante
« Respuesta #5 : 26 de Mayo de 2006, 03:25:11 pm »

Pues no lo he probado, voy a enchufar el portátil y lo pruebo en un momento Smiley
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #6 : 26 de Mayo de 2006, 03:30:31 pm »

En cuanto llegue a casa le echo un vistazo  Smiley
En línea

Doom dee doom dee doom
SapphiRe
Visitante
« Respuesta #7 : 26 de Mayo de 2006, 03:42:26 pm »

Bien, acabo de compilar el código y voy a probarlo, escribo aquí lo que encuentre:

-Ocupa 263 bytes, es decir, no has tenido en cuenta la cabecera de 7 bytes a la hora de contar los 256 bytes.
-No has quitado el sonido de las teclas cuando son pulsadas
-No se puede salir del juego
-JODER QUÉ VICIO!!!

  Si puedes realmente quitar bytes mira a ver si puedes reducir 10 más y así ignoramos las dos primeras líneas de comentarios Wink

25 PUNTOS... esto puedo mejorarlo!!
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #8 : 26 de Mayo de 2006, 03:46:43 pm »

No cuento la cabecera, ni para el BASIC ni para el ROM. Por eso digo 256 bytes de CÓDIGO.

Respecto al tema del click de las teclas y lo otro, la verdad, es que no lo considero grave. Digamos que es la pantalla de "options" que no pude incluir dentro del juego. Por eso se puede cambiar desde fuera, tanto el sonido de teclas (con SCREEN,,) como el color de tinta y fondo, que no altero. Y luego haces un BLOAD  Smiley

Ya ves, con tal de justificarme, cualquier cosa.

Eso sí, me parece que tiene un bug por ahí.
En línea
SapphiRe
Visitante
« Respuesta #9 : 26 de Mayo de 2006, 03:53:48 pm »

No cuento la cabecera, ni para el BASIC ni para el ROM. Por eso digo 256 bytes de CÓDIGO.

Respecto al tema del click de las teclas y lo otro, la verdad, es que no lo considero grave. Digamos que es la pantalla de "options" que no pude incluir dentro del juego. Por eso se puede cambiar desde fuera, tanto el sonido de teclas (con SCREEN,,) como el color de tinta y fondo, que no altero. Y luego haces un BLOAD  Smiley

Ya ves, con tal de justificarme, cualquier cosa.

 Grin Grin Grin Grin Grin

Citar
Eso sí, me parece que tiene un bug por ahí.

  Pues me he topado con un bug: tras comerme un rombito no me ha aparecido otro!! Tengo una captura de pantalla que lo prueba Tongue

  La gente del departamento lo ha probado, te copio algunos comentarios: "Va muy rápido", "Puedo hacerlo mejor, espera", "hay un retardo entre que pulso la tecla y se va para donde yo quiero"...

En línea
SapphiRe
Visitante
« Respuesta #10 : 26 de Mayo de 2006, 03:57:43 pm »

31 PUNTOS!!!!!

PERO QUÉ VICIO DE JUEGO!!!!!

 :god: :god: :god: :god: :god:
En línea
RC743
Karoshi Maniac
****
Mensajes: 495


No Pain, No Gain!


Email
« Respuesta #11 : 26 de Mayo de 2006, 04:20:44 pm »

Arrgh!!!  Spank Dejad de comer delante de los pobres y subid una version Rom PUÑETAS!!!!!!!!!!.. quiero decir, PORFAVOR  sjp:)
En línea

Obsoletobots : Transformense y Avancen!
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #12 : 26 de Mayo de 2006, 04:41:44 pm »

El tema del retardo está localizado: basta con mover los HALTs después del CALL LDIRVM y así el usuario no tendrá la impresión de retardo.

En cuanto al "extraño bug", lo he identificado también, pero no he encontrado ninguna solución que quepa en 256 bytes todavía. En breve publicaré la versión 0.11.
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #13 : 26 de Mayo de 2006, 05:21:00 pm »

Pues aquí teneis el .BIN y el .ROM

¡Buen trabajo Robsy! Wink

Y por cierto, 41 puntos con el BlueMSX (tras el cambio de posición del  los halt), pena que no guardara la pantalla... Tongue
« Última modificación: 26 de Mayo de 2006, 05:22:51 pm por jltursan » En línea

Doom dee doom dee doom
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #14 : 26 de Mayo de 2006, 06:42:28 pm »

Simplemente... ¡magistral!  :god: :god: :god: :god:
En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
Páginas: [1] 2 3
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!