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? Es que no es una ROM :P, es un zip, que trae dentro el juego en rom y en bin ;)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: 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:
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! |