Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: pitpan en 26 de Mayo de 2006, 01:54:36 pm



Título: Un juego nuevo
Publicado por: pitpan en 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.  ;D

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.
;-----------------------------------------------------------------------


Título: Re: Un juego nuevo
Publicado por: SapphiRe en 26 de Mayo de 2006, 02:52:13 pm
e incluso sonido

Código:
; Eating sound
        call    BEEP

 ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D

Me he estado riendo un buen rato.

Robsy tío, eres genial!!!

 ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D


Título: Re: Un juego nuevo
Publicado por: pitpan en 26 de Mayo de 2006, 03:11:13 pm
Bueno, Sap, se trata de ser fiel a la verdad y lo he sido, ¿no?  ;) 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.)  :)


Título: Re: Un juego nuevo
Publicado por: jltursan en 26 de Mayo de 2006, 03:13:00 pm
Citar
Me he estado riendo un buen rato.

No lo pillo... ::)

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



Título: Re: Un juego nuevo
Publicado por: pitpan en 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 ;)

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.


Título: Re: Un juego nuevo
Publicado por: SapphiRe en 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 :)


Título: Re: Un juego nuevo
Publicado por: jltursan en 26 de Mayo de 2006, 03:30:31 pm
En cuanto llegue a casa le echo un vistazo  :)


Título: Re: Un juego nuevo
Publicado por: SapphiRe en 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 ;)

25 PUNTOS... esto puedo mejorarlo!!


Título: Re: Un juego nuevo
Publicado por: pitpan en 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  :)

Ya ves, con tal de justificarme, cualquier cosa.

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


Título: Re: Un juego nuevo
Publicado por: SapphiRe en 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  :)

Ya ves, con tal de justificarme, cualquier cosa.

 ;D ;D ;D ;D ;D

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 :P

  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"...



Título: Re: Un juego nuevo
Publicado por: SapphiRe en 26 de Mayo de 2006, 03:57:43 pm
31 PUNTOS!!!!!

PERO QUÉ VICIO DE JUEGO!!!!!

 :god: :god: :god: :god: :god:


Título: Re: Un juego nuevo
Publicado por: RC743 en 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:)


Título: Re: Un juego nuevo
Publicado por: pitpan en 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.


Título: Re: Un juego nuevo
Publicado por: jltursan en 26 de Mayo de 2006, 05:21:00 pm
Pues aquí teneis el .BIN y el .ROM

¡Buen trabajo Robsy! ;)

Y por cierto, 41 puntos con el BlueMSX (tras el cambio de posición del  los halt), pena que no guardara la pantalla... :P


Título: Re: Un juego nuevo
Publicado por: Jon_Cortazar en 26 de Mayo de 2006, 06:42:28 pm
Simplemente... ¡magistral!  :god: :god: :god: :god:


Título: Re: Un juego nuevo
Publicado por: pitpan en 26 de Mayo de 2006, 06:51:02 pm
Gracias JL!  ;D

A ver si me pongo y hago algo más de esta forma, ahorrando bytes!


Título: Re: Un juego nuevo
Publicado por: RC743 en 26 de Mayo de 2006, 11:32:38 pm
 Thanks Jl! y Felicidades Robsy por el microjuego, lo que me ha molado mucho es la redefinicion de los caracteres numéricos (lo más facil habria sido poner los de Basic).. endevé en que cosas me fijo... ;)


Título: Re: Un juego nuevo
Publicado por: Darth_Fistro en 27 de Mayo de 2006, 10:06:38 am
¡Enhorabuena! :D Dando lecciones como siempre ;) Ahora a ver si hay guts para hacer un Nemesis en 1024 bytes ;D


Título: Re: Un juego nuevo
Publicado por: Konamito en 28 de Mayo de 2006, 03:46:03 pm
¿Cómo hago para jugar con la ROM que ha colgado JL?

Una vez descargado el archivo txt, lo abro con el bloc de notas y lo guardo como todos los archivos con extensión ROM. Cuando intento ejecutarlo en el blueMSX, se inicializa el MSX pero luego no pasa nada ¿Qué estoy haciendo mal?  ???


Título: Re: Un juego nuevo
Publicado por: e_sedes en 28 de Mayo de 2006, 04:16:06 pm
¿Cómo hago para jugar con la ROM que ha colgado JL?

Una vez descargado el archivo txt, lo abro con el bloc de notas y lo guardo como todos los archivos con extensión ROM. Cuando intento ejecutarlo en el blueMSX, se inicializa el MSX pero luego no pasa nada ¿Qué estoy haciendo mal?  ???
Es que no es una ROM :P, es un zip, que trae dentro el juego en rom y en bin ;)


Título: Re: Un juego nuevo
Publicado por: Konamito en 28 de Mayo de 2006, 09:57:14 pm
Entonces, se supone que haciendo BLOAD se puede ejecutar el .BIN ¿no?


Título: Re: Un juego nuevo
Publicado por: jjfranco en 28 de Mayo de 2006, 09:59:21 pm
Hola a todos,

Me he quedao sorprendio, (gratamente, por supuesto). Acabo de llegar de un viaje, y nada mas entrar veo este nuevo hilo con una novedad de juego (el famoso snake en menos de 256).

Todavia no lo he probado, pero puedo asegurar que lo voy a probar. Y quisiera añadir en este post, que este juego a tirardo por tierra toda mi moral programadora. Llevo mas de un mes haciendo un pequeño programa que quería presentar a la dev, y este juego no es mas que un snake con muchas pantallas (de la que ya hice una versión en C para PC, que algundía  haré público),y sin duda este codigo me hace muy pequeño (como programador evidentemente).

Y como no quiero que nadie piense que uso el codigo de otro, voy a colgar el proyecto en su actual estado.


PD. Como no se me ocurra alguna idea mas original, me voy a replantear mi entrada en la dev.

otra PD: Como dicen los pistoleros "siempre hay alguien mas rapido". En este caso alguien mejor. ;D


Título: Re: Un juego nuevo
Publicado por: jjfranco en 28 de Mayo de 2006, 10:12:26 pm
Ahí va el archivo, solo hay que renombrar.

cambiar el nombre por d.bin y ya esta


Título: Re: Un juego nuevo
Publicado por: pitpan en 28 de Mayo de 2006, 11:49:13 pm
Jos'b: ni se te ocurre dejar el proyecto! De verdad, hay sitio para todo el mundo. Siento haber solapado el juego, pero como comprenderás, sólo era un reto de programación. El producto final cumple con mis objetivos, pero no es -ni mucho menos- un juego terminado. Si estás trabajando en una versión del SNAKE para MSXdev, sigue con ella, de verdad. Con gráficos y sonido no hay ninguna decente para MSX y menos aun si, como dices, le añades distintas pantallas. Recupera el proyecto y sigue con él.

Además, no hay mejor forma que programar un juego completo en ensamblador para aprender. De hecho, yo no había hecho nada más que alguna rutinilla suelta y tonta hasta que me metí con el GURU LOGIC. Y desde entonces no he parado.

De nuevo, siento mucho haberte "pisado" de algún modo el tema del SNAKE, pero no creo que haya motivos para que dejes de presentar el juego a la dev. Además, respecto a lo del tema del código, no te preocupes. Por una parte, el código que he usado está bastante ofuscado como para que nadie en su sano juicio lo use. Y, por otra, lo he publicado como open-source, así que si quisieras usarlo tampoco sería un problema. De verdad: SIGUE CON EL JUEGO. En beneficio de todos y, como no, también en tu beneficio. Sigue adelante y a por la dev!


Título: Re: Un juego nuevo
Publicado por: jltursan en 29 de Mayo de 2006, 10:08:07 am
....y yo aún diría más: SIGUE CON EL JUEGO. ;)

Como ya ha comentado Robsy, no todo es una cuestión de ser el primero en hacer algo, el verdadero reto está en conseguir algo especial que diferencie tu versión de las existentes. No hay muchas versiones de Snake para MSX y decentes menos. Si te vuelcas con los gráficos y la jugabilidad podrías hacer un "Snake Deluxe" con multitud de detalles; a saber:

  • Auténticos gráficos MSX.
  • Varias superficies de juego
  • Tiempo límite
  • Algún enemigo que pulule por ahí
  • Elementos como teleportadores, muros móviles, etc.
  • Power-ups

En fin, cualquier chorrada que se te ocurra y que puedes ir añadiendo poco a poco.

¡Ánimo! :)


Título: Re: Un juego nuevo
Publicado por: Jon_Cortazar en 29 de Mayo de 2006, 02:31:26 pm
Sin duda... SIGUE CON EL JUEGO, Jos'B!!!!. Robs ha hecho un planteamiento de reto de programación compacta, pero tu puedes ir por la vía que comenta jl, la de multiples escenarios, gráficos, etc...

¡No desistas!. ¡Hay MSXdev para todos!.  :D :D :D


Título: Re: Un juego nuevo
Publicado por: jjfranco en 29 de Mayo de 2006, 03:01:32 pm
Gracias a todos por el apoyo para seguir con el proyecto.

No se trata de alguien(en este caso Robsy)  me haya pisado la idea (que por otro lado tampoco es muy original a estas alturas), sino que quizas no este a la altura de la dev. Lo que demuestra que, el autentico reto es hacerlo en el minimo espacio de memoria.

De todas formas, intentaré buscar alguna idea diferente.

Y que nadie espere una gran superproduccion, yo todavía soy de los que lo hace todo a mano, incluidos graficos, y como pueda meterle musica será original mia (vais a flipar).


¿Por cierto alguien ha probado el juego? ¿algun defectillo evidente?


Título: Re: Un juego nuevo
Publicado por: Jon_Cortazar en 29 de Mayo de 2006, 03:11:07 pm
¿A la altura del MSXdev?. Pero hombre, claro que estará a la altura, ¿pues que te crees?. El espíritu del concurso es que la gente se anime a hacer cosas para MSX, y si tu consigues terminar un programa completo, ya hemos ganado todos, pues el MSX tendrá un juego más gracias a TÍ.

Ése es el espíritu del MSXdev, y no otro: con lo cual, tu posible entrada al concurso casa perfectamente con los requisitos del mismo ;).


Título: Re: Un juego nuevo
Publicado por: pitpan en 29 de Mayo de 2006, 08:07:48 pm
El propósito principal de MSXdev desde su origen no ha sido competir con otros programadores,  sino ser una excusa para que el MSX tenga cada vez más juegos. Gracias a esta y otras iniciativas, cada vez hay más programadores en activo. Se trata de poner una fecha de entrega para que la gente se tome los proyectos un poco en serio y programe con ganas. Además, hay una sana competencia al ver que los juegos van apareciendo, y que somos, año tras año, los mismos amigos los que trabajamos para que el MSX siga adelante, ampliando poco a poco el catálogo de juegos disponibles.

Creo que el auténtico reto es con uno mismo: ser capaz de hacer un juego desde 0 y para una máquina que funciona a 3,5 MHz. Es un desafío lo suficientemente grande como para resultar interesante. Al menos, ésta es mi opinión. Por eso creo que cualquier programa es bueno para aprender. Mi primer programa para MSX en ensamblador fue un PONG muy lamentable - no el de la distribución del asMSX, sino uno todavía más rudo -. Programar es la mejor forma de aprender a programar. ;)


Título: Re: Un juego nuevo
Publicado por: SapphiRe en 30 de Mayo de 2006, 10:22:54 am
Programar es la mejor forma de aprender a programar.

Y entender la recursividad es imprescindible para entender la recursividad ;D ;D


Título: Re: Un juego nuevo
Publicado por: Dioniso en 30 de Mayo de 2006, 02:25:25 pm
Programar es la mejor forma de aprender a programar. ;)

Jon ha dado con la clave. Programar, repetir, fallar, cuelges de ordenador, etc ... es la mejor forma de programar. Yo, aunque no sea un máquina de la programación, he visto una evolución grande en mí como programador. En fin, aunque hagas el peor juego de la MSXDev habrás ganado algo; mejora en la programación.

No esperes hacer un Metal Gear ... yo empecé con un juego de apuestas, porque no podía/sabía hacer nada más.

Seguro que te caerás muchas veces, pero nunca en el mismo sitio. Pa'lante, killo!