dancresp escribió:EL LISTADOCódigo: Seleccionar todo
0 VARIABLE X 0 VARIABLE H 0 VARIABLE V 0 VARIABLE U 0 VARIABLE L
0 VARIABLE N 0 VARIABLE R 0 VARIABLE P 0 VARIABLE S 0 VARIABLE D
: CLRSCR 2 0 AT 608 SPACES ;
: PAUSA 0 DO 200 0 DO LOOP LOOP ;
: USING AT DUP DUP DUP 1000 < IF 48 EMIT THEN 100 < IF 48 EMIT THEN 10 < IF 48 EMIT THEN . ;
: RND 15403 C@ 31 AND ;
: GRAFICOS 1 3 7 13 15 5 8 4 128 192 224 176 240 160 16 32 1 3 7 13 15 2 10 128 192 224 176 240 64 160 80 8 36 47 59 63 31 8 16 32 72 232 184 248 240 32 16 8 4 15 27 63 63 40 6 32 64 224 176 248 248 40 192 3 31 63 57 63 14 25 12 192 248 252 156 252 112 152 48 3 31 63 57 63 6 13 48 192 248 252 156 252 96 176 12 1 3 3 127 255 255 255 255 0 128 128 252 254 254 254 254 0 7 31 63 109 255 57 16 0 224 248 252 182 255 156 8 4 34 16 8 96 4 18 36 64 136 16 32 12 32 144 72 0 1 1 1 1 1 0 0 66 32 71 15 30 76 135 35 2 100 240 250 217 240 196 18 251 251 251 0 223 223 223 0 0 0 0 0 0 0 255 0 3 28 35 32 33 35 33 32 224 28 226 2 194 226 194 130 37 47 46 38 32 28 3 0 82 122 58 50 2 28 224 0 12039 12255 DO I C! -1 +LOOP ;
: INSTRU CLS 1 8 AT ." NUCLEAR INVADERS" 6 4 AT ." CONTROLS: LEFT = Z" 7 14 AT ." RIGHT = X" 8 14 AT ." FIRE = ENTER" 14 6 AT ." *PRESS KEY TO START*" 21 6 AT ." C SCAINET SOFT, 2013" BEGIN INKEY UNTIL 9 PAUSA ;
: PRESENTA CLS ." SCORE<1> HI-SCORE SCORE<2>" S @ 1 3 USING R @ 1 14 USING 5 14 AT ." PLAY" 7 8 AT ." NUCLEAR INVADERS" 10 5 AT ." *SCORE ADVANCE TABLE*" 12 9 AT ." op =? MYSTERY" 14 9 AT ." cd =30 POINTS" 16 9 AT ." gh =20 POINTS" 18 9 AT ." kl=10 POINTS" 22 4 AT ." mnmn" 13 SPACES ." CREDIT 00" BEGIN INKEY UNTIL CLRSCR 21 1 AT ." wwwwwwwwwwwwwwwwwwwwwwwwwwwwww" 22 2 AT ." 3" 11 9 AT ." PLAY PLAYER<1>" 10 0 DO 1 3 AT 4 SPACES 3 PAUSA 1 3 AT ." 0000" 3 PAUSA LOOP 3 L ! 2 N ! 0 S ! ;
: INICIO CLRSCR 15 15 N @ - DUP U ! AT N @ 2 * 2 + DUP 0 DO ." v" LOOP 4 U @ AT 0 DO ." v" LOOP 3 13 DO U @ DUP I SWAP AT ." v" N @ 0 DO ." xy" LOOP ." v" I 1+ SWAP AT ." v" N @ 0 DO ." z{" LOOP ." v" -2 +LOOP 99 103 DUP 107 DUP 3 13 DO I 1 AT DUP EMIT DUP 1+ EMIT I 29 AT DUP EMIT 1+ EMIT -2 +LOOP 3 0 5 0 99 3 0 7 0 103 3 0 9 0 103 3 0 11 0 107 3 0 5 29 99 3 0 7 29 103 3 0 9 29 103 3 0 11 29 107 3 0 13 29 107 9999 10049 DO I C! -1 +LOOP -200 U ! 3 X ! 0 V ! 10000 P ! 30 D ! ;
: MOVER X @ DUP 27 < IF INKEY 120 = IF X @ 1+ X ! THEN THEN 3 > IF INKEY 122 = IF X @ 1- X ! THEN 20 X @ 1- AT ." mn " ;
: INVASOR P @ C@ O> IF P @ 1+ C@ 0= IF RND D @ 5 < IF 10 ELSE 26 THEN > IF 1 P @ 1+ C! THEN 0 ELSE P @ 10025 < IF 1 ELSE -1 THEN DUP DUP P @ 3 + C@ + P @ 3 + C! P @ 2 + C@ P @ 3 + C@ AT 0> IF SPACE THEN P @ 4 + C@ P @ 3 + C@ 2 MOD 0> IF 2 - THEN DUP EMIT 1+ EMIT 0< IF SPACE THEN P @ 3 + C@ DUP 14 N @ - = IF DROP 1 ELSE 15 N @ + = IF 1 ELSE 0 THEN THEN THEN ELSE 0 THEN P @ 10045 = IF 10000 ELSE P @ 5 + THEN P ! ;
: UFO U @ DUP 0< IF 1+ U ! ELSE DUP 27 > IF 3 SWAP AT 3 SPACES -200 U ! ELSE 1+ DUP U ! 3 SWAP AT ." op" THEN THEN ;
: DISPARO V @ 0= IF INKEY 13 = IF X @ H ! 19 V ! THEN ELSE V @ DUP H @ AT SPACE 5 < IF 0 V ! ELSE V @ 2- V ! IMPACTO 0= IF V @ H @ AT 115 EMIT THEN THEN THEN ;
: IMPACTO 9216 V @ 32 * + H @ + C@ 32 = IF 0 ELSE V @ 15 < IF V @ 3 = IF 3 U @ 1+ AT ." tu" 18 12 DO I 15 BEEP LOOP RND 12 / 1+ 50 * DUP 3 U @ 1+ AT . S @ + DUP S ! 1 3 USING 20 PAUSA 3 U @ AT 4 SPACES 200 U ! ELSE D @ 1- D ! V @ 3 - 2 / H @ 15 > IF 5 + THEN V @ DUP 5 = IF DROP 30 ELSE 10 > IF 10 ELSE 20 THEN THEN S @ + DUP S ! 1 3 USING 1- 5 * 10000 + V ! V @ 2 + C@ V @ 3 + C@ DUP 15 < IF 1+ THEN 2 PICK 2 PICK AT ." qr" 10 100 BEEP AT 2 SPACES V @ DUP C@ 1- SWAP C! V @ C@ 0> IF 0 V @ 1+ C! H @ 15 < IF 0 ELSE 29 THEN V @ 3 + C! V @ 2 + C@ V @ 3 + C@ AT H @ 15 < IF SPACE THEN V @ 4 + C@ DUP EMIT 1+ EMIT THEN THEN THEN 0 V ! 1 THEN ;
: VIDAS 100 200 DO I 20 BEEP -5 +LOOP 30 PAUSA L @ 1- DUP DUP 0> IF DUP 22 AT . DUP 2 * 2 + 22 SWAP AT 2 SPACES ELSE 17 11 AT ." GAME OVER" S @ R @ > IF S @ R ! THEN THEN L ! 0= ;
: FASE D @ 0= IF N @ DUP 5 < IF 1+ THEN N ! 100 PAUSA INICIO THEN ;
: RUN 9 PAUSA GRAFICOS INSTRU BEGIN PRESENTA BEGIN INICIO BEGIN 2 PAUSA MOVER DISPARO UFO FASE INVASOR UNTIL VIDAS UNTIL 200 PAUSA 0 UNTIL ;
Te felicito tanto por el juego en sí, que me parece muy atractivo y logrado (aunque aún no he podido probarlo porque antes tengo que volver a compilar los emuladors xAce o Canace y tengo alguna pega por resolver). como por la explicación tan detallada. Me gustan los juegos con resolución de texto, y el mapa de pantalla de Jupiter ACE es ideal para ello.
He empezado a hacer una versión de tu juego para mi Solo Forth para ZX Spectrum, e iré mostrando el progreso. El caso es que al empezar a adaptar el código me han surgido algunas dudas sobre cómo hiciste el desarrollo:
¿Cómo obtuviste este listado? ¿Es la fuente original y la escribiste en un editor del sistema anfitrión para después hacer que el emulador la «tecleara» en la Jupiter ACE? ¿O escribiste la fuente en la máquina emulada y después extrajiste el listado de alguna manera? Ninguna de las dos opciones me cuadra, porque he encontrado alguna errata que impediría ejecutar la fuente tal cual está. ¿O tal vez tecleaste después la fuente original para poder mostrarla en el foro? Pero si la hubieras tecleado la habrías indentado, supongo. Por todo esto me he quedado con la duda de cómo hiciste el desarrollo.
También me ha sorprendido mucho que escribieras palabras tan largas, de más 600 octetos de fuente, cuando lo habitual y lo más eficaz en Forth (para desarrollar rápidamente, hacer que el código sea legible, fácil de depurar y mantener) es escribir palabras muy cortas (de una o dos líneas y unas pocas palabras) que hagan funciones muy concretas y reutilizables, con nombres claros. De hecho, pienso que el formato de la fuente del juego es la causa de que afirmes que Forth te resulta difícil de probar y depurar: escrito con ese formato, con palabras larguísimas y tantos condicionales anidados, es muy difícil después seguir el código.
Lógicamente, la factorización supone una pérdida de rendimiento en tiempo de ejecución, que en una máquina como Jupiter ACE puede ser apreciable. ¿Escribiste el código de esta manera para ganar velocidad, a pesar de que en alguna parte explicas que tuviste que frenar el juego? ¿O lo escribiste así de forma inconsciente al trasladar los algoritmos de tu versión en BASIC para MSX?