próximamente instrucciones
Apuntes:
Hay que comer una seta antes de que el primer temporizador llegue a 0.
Hay que comer todas las setas antes de que el segundo temporizador llegue a 0.
Conforme se pasan fases la dificultad aumenta apareciendo bichos que compiten con el prota, el número de setas por comer aumenta, en tiempo para comerlas todas disminuye, la velocidad del juego aumenta.
ComeSetas 2.03
(click para ampliar)
Código: Seleccionar todo
100 REMark ComeSetas
110 REMark Come todas las setas que puedas... antes de que se te acabe el tiempo
120 REMark controles:
130 REMark flechas de cursor y O P Q A
140 REMark ESC para salir
150 :
160 nombre$ = "ComeSetas": REMark nombre del programa
170 version$ = "2.03": REMark version del programa
180 velocidad = 1: REMark 1=normal 0.5=doble 2=mitad
190 :
200 REMark ##########################################
210 REMark funciones comunes
220 REMark ##########################################
230 :
240 DEFine PROCedure espera(ratico)
250 REMark espera un ratico
260 LOCal d
270 FOR d = 0 TO velocidad*ratico: REMark pausa
280 END DEFine espera
290 :
300 DEFine FuNction cero$(v, n)
310 REMark justifica valor con ceros por la izquierda
320 LOCal rl
330 r$ = "0000000"&v: rl = LEN(r$)
340 RETurn r$(rl-n+1 TO rl)
350 END DEFine ceros
360 :
370 :
380 REMark ##########################################
390 REMark funciones del juego
400 REMark ##########################################
410 :
420 DEFine PROCedure pinta(chj, x, y, c$, c)
430 REMark pinta en la ventana de juego (canal chj) el caracter c$ con el color c en (x,y)
440 INK #chj, c: AT #chj, y, x: PRINT #chj, c$
450 END DEFine pinta
460 :
470 DEFine PROCedure fin(chj, chm)
480 REMark finalizacion del programa
490 limpiateclas
500 udgUnset(chj)
510 udgUnset(chm)
520 REMark restaurar las ventanas
530 WINDOW #0, 512, 50, 0, 206: PAPER #0, 0: INK #0, 4: CLS
540 WINDOW #1, 256, 202, 256, 0: BORDER #1, 1, 255: PAPER #1, 0: INK #1, 7: CLS
550 WINDOW #2, 256, 202, 0, 0: BORDER #2, 1, 255: PAPER #2, 0: INK #2, 4: CLS
560 MODE 2
570 END DEFine fin
580 :
590 DEFine PROCedure limpiateclas
600 LOCal kk$: kk$ = INKEY$(0): REMark limpia las teclas pendientes en la cola del teclado
610 END DEFine limpiateclas
620 :
630 DEFine PROCedure pantalla(chj, ww, wh, color)
640 REMark presentacion de pantalla
650 LOCal lm, tm
660 lm = (512-ww) DIV 2: REMark margen izquierdo
670 tm = wh+16: REMark margen superior de la ventana de marcadores
680 MODE 8: OPEN #chj, "scr_"&ww&"x"&wh&"a"&lm&"x16": PAPER #chj, color(0): CLS #chj: BORDER #chj, 1, color(3)
690 OPEN #chm, "scr_"&ww&"x12a"&lm&"x"&tm: PAPER #chm, color(0): CLS #chm: BORDER #chm, 1, color(3)
700 END DEFine pantalla
710 :
720 DEFine PROCedure marcador(chm, setas, puntos, tiempo, tiempofase, vidas, seta$, cw, color)
730 REMark muestra puntuaciones
740 PAPER #chm, color(0): CURSOR #chm, 10, 0
750 INK #chm, color(1): PRINT #chm, cero$(vidas, 1);
760 AT #chm, 0, 2
770 INK #chm, color(1): PRINT #chm, CHR$(135);" ";
780 INK #chm, color(1): PRINT #chm, cero$(tiempo, 1);
790 INK #chm, color(2): PRINT #chm, "s ";
800 INK #chm, color(1): PRINT #chm, cero$(tiempofase, 2);
810 INK #chm, color(2): PRINT #chm, "s ";
820 INK #chm, color(1): PRINT #chm, cero$(setas, 2);
830 INK #chm, color(2): PRINT #chm, seta$;" ";
840 INK #chm, color(1): PRINT #chm, cero$(puntos, 7);
850 INK #chm, color(2): PRINT #chm, "p";
860 END DEFine marcador
870 :
880 DEFine PROCedure coordenadasAleatorias(nx, ny, set_n, x, y, x2, y2, cw, ch)
890 REMark calcula un par de coordenadas aleatorias para un elemento
900 LOCal i
910 nx = RND(cw-1): ny = RND(ch-1): REMark nuevas coordenadas aleatorias
920 IF x == nx AND y == ny THEN GO TO 910: REMark si coincide con el avatar, escoge otras
930 REMark FOR i = 0 TO set_n: PRINT set_n;" "; i;" "; nx;" "; ny;" ": IF nx == x2(i) AND ny == y2(i) THEN GO TO 640: REMark si coincide con un elemento previo, escoge otras
940 END DEFine coordenadasAleatorias
950 :
960 DEFine PROCedure nuevaSeta(d, seta_n, x, y, x2, y2, cw, ch)
970 REMark crea una nueva seta
980 y2(d) = -1: coordenadasAleatorias x2(d), y2(d), seta_n, x, y, x2, y2, cw, ch
990 END DEFine nuevaSeta
1000 :
1010 DEFine PROCedure mueve(p, dp, l, r)
1020 REMark mueve una coordenada
1030 p = p+dp
1040 IF p < 0 THEN
1050 dp = -dp*(1-2*RND(r)): p = 0
1060 ELSE
1070 IF p >= l THEN dp = -dp: p = l-1
1080 END IF
1090 END DEFine mueve
1100 :
1110 DEFine FuNction mueveComesetas(chj, x, y, x2, y2, cw, ch, setas, puntos, tiempo, tiempofase, vidas, borrado$, color)
1120 REMark mueve el avatar
1130 LOCal dx, dy, i, ox, oy
1140 dx = 0: dy = 0: ox = x: oy = y
1150 IF KEYROW(1) && 8 THEN RETurn 1: REMark ESC
1160 IF KEYROW(1) && 16 OR KEYROW(4) && 32 THEN dx = 1: x = x+1: IF x >= cw THEN x = 0: REMark flecha derecha y P
1170 IF KEYROW(1) && 128 OR KEYROW(4) && 16 THEN dy = 1: y = y+1: IF y >= ch THEN y = 0: REMark flecha abajo y A
1180 IF KEYROW(1) && 2 OR KEYROW(5) && 128 THEN dx = -1: x = x-1: IF x < 0 THEN x = cw-1: REMark flecha izquierda y O
1190 IF KEYROW(1) && 4 OR KEYROW(6) && 8 THEN dy = -1: y = y-1: IF y < 0 THEN y = ch-1: REMark flecha arriba y Q
1200 IF ox <> x OR oy <> y THEN
1210 REMark comprobar colision con setas
1220 FOR i = 0 TO seta_n
1230 IF x = x2(i) AND y = y2(i) THEN
1240 REMark cuenta y muestra los puntos
1250 setas = setas-1: tiempo = 9: marcador chm, setas, puntos, tiempo, tiempofase, vidas, seta$, cw, color
1260 REMark crea y muestra la nueva seta
1270 nuevaSeta i, seta_n, x, y, x2, y2, cw, ch: pinta chj, x2(i), y2(i), seta$, color(2)
1280 REMark sale porque no es neceario comprobar mas setas
1290 EXIT i
1300 END IF
1310 END FOR i
1320 REMark calculo del avatar
1330 anim = NOT anim: IF anim THEN avatar$ = CHR$(137): ELSE avatar$ = CHR$(128 + 3*dx + dy + 4)
1340 REMark borra y pinta el avatar
1350 pinta chj, ox, oy, borrado$, color(1): pinta chj, x, y, avatar$, color(1)
1360 END IF
1370 RETurn 0
1380 END DEFine mueveComesetas
1390 :
1400 DEFine FuNction mueveBichos(chj, bicho_n, seta_n, bx, by, bdx, bdy, x, y, x2, y2, cw, ch, color)
1410 REMark mueve los bichos
1420 LOCal cx, cy, dx, dy, i, ib, ox, oy
1430 IF bicho_n < 0 THEN RETurn 0
1440 ox = x: oy = y
1450 FOR ib = 0 TO bicho_n
1460 cx = bx(ib): cy = by(ib)
1470 dx = bdx(ib): dy = bdy(ib)
1480 ox = cx: oy = cy
1490 REMark cambio de direccion?
1500 IF dy=-2 OR RND(9) > 7 THEN dx = RND(-1 TO 1): dy = RND(-1 TO 1)
1510 REMark mueve bicho
1520 cx = cx + dx: cy = cy + dy
1530 REMark limites de la ventana
1540 IF cx < 0 THEN cx = cw-1: ELSE IF cx >= cw THEN cx = 0
1550 IF cy < 0 THEN cy = ch-1: ELSE IF cy >= ch THEN cy = 0
1560 REMark comprobar colision con setas
1570 FOR i = 0 TO seta_n
1580 IF cx = x2(i) AND cy = y2(i) THEN
1590 REMark crea y muestra la nueva seta
1600 nuevaSeta i, seta_n, x, y, x2, y2, cw, ch: pinta chj, x2(i), y2(i), seta$, color(2)
1610 REMark sale porque no es neceario comprobar mas setas
1620 EXIT i
1630 END IF
1640 END FOR i
1650 IF cx<>ox AND cy<>oy THEN
1660 REMark borra y pinta el bicho
1670 pinta chj, ox, oy, borrado$, color(4): pinta chj, cx, cy, bicho$, color(4)
1680 REMark guarda los datos del bicho
1690 bx(ib) = cx: by(ib) = cy
1700 bdx(ib) = dx: bdy(ib) = dy
1710 END IF
1720 REMark comprobar colision con avatar
1730 IF cx == x AND cy == y THEN RETurn 1
1740 NEXT ib
1750 RETurn 0
1760 END DEFine mueveBichos
1770 :
1780 DEFine PROCedure grandote(chj, sx, sy, ww, wh, nombre$)
1790 REMark pinta una cadena en caracteres grandes con fondo
1800 CSIZE 2, 1: OVER 0
1810 CURSOR #chj, sx-1, sy+1: STRIP #chj, 0: PRINT #chj, FILL$(' ', LEN(t$))
1820 CURSOR #chj, sx-1, sy+1: OVER 0: STRIP #chj, 3: INK#chj, 0: PRINT #chj, t$
1830 CURSOR #chj, sx , sy+2: OVER 1: INK #chj, 7: PRINT #chj, t$
1840 STRIP #chj, 0: CSIZE 0,0: OVER 0
1850 END DEFine grandote
1860 :
1870 DEFine PROCedure muestraNombre(chm, cw, ch)
1880 REMark muestra el nombre del programa
1890 INK #chm, 5: AT #chm, 0, (cw-LEN(nombre$)-LEN(version$)-1) DIV 2: PRINT #chm, nombre$;" ";version$
1900 END DEFine muestraNombre
1910 :
1920 DEFine PROCedure intro(chj, cw, ch, ww, wh, nombre$, avatar$, seta$, color)
1930 REMark presentacion del juego
1940 LOCal a$, anim, espera_tecla, f, i, l, t, t$, sx, sy, mx, my, tl, ty
1950 limpiateclas: l = LEN(nombre$): f = (cw - l) DIV 2
1960 anim = 0: t = 0
1970 t$ = FILL$(' ', f)&nombre$&FILL$(' ', f): l = LEN(t$)
1980 sx = ww DIV 2 - 6*l: sy = wh DIV 3 - 12
1990 REPeat espera_tecla
2000 mx = RND(cw-1): my = RND(ch-2): AT #chj, my, mx: INK #chj, 1: PRINT #chj, seta$;
2010 grandote chj, sx, sy, ww, wh, nombre$
2020 mx = cw DIV 2 - 4: my = ch DIV 2 + 3: tl = ch DIV 2: ty = tl
2030 IF anim THEN a$ = avatar$: ELSE a$ = CHR$(135)
2040 AT #chj, ty, t: INK #chj, color(1): PRINT #chj, " "; a$
2050 IF anim THEN t = t+1: IF t < cw-2 THEN INK #chj, color(2): FOR i = 2*((t+2) DIV 2) TO cw-2 STEP 2: AT #chj, ty, i: PRINT #chj, seta$: ELSE AT #chj, ty, t: PRINT #chj, " ": t = 0: IF ty > tl THEN ty = 3: ELSE IF ty == tl THEN ty = 3*ch DIV 4 + 1: ELSE ty = tl
2060 anim = (anim + 1) && 1
2070 INK #chj, 5: OVER #chj, -1: AT #chj, my, mx: PRINT #chj, "COMENZAR": OVER #chj, 0: espera 40000
2080 IF INKEY$(0) <> "" THEN EXIT espera_tecla
2090 END REPeat espera_tecla
2100 END DEFine intro
2110 :
2120 DEFine PROCedure listo(chj, cw, ch)
2130 REMark nueva vida
2140 LOCal i, mx, my
2150 mx = cw DIV 2 - 3: my = ch DIV 2 - 1
2160 OVER #chj, -1: INK #chj, 7
2170 FOR i = 0 TO 5: AT #chj, my, mx: PRINT #chj, "LISTO?": espera 75000
2180 OVER #chj, 0
2190 END DEFine listo
2200 :
2210 DEFine PROCedure tablero(chj, chm, x, y, x2, y2, cw, ch, avatar$, seta$, puntos, tiempo, tiempofase, vidas, color)
2220 REMark muestra el tablero de juego
2230 CLS #chj: FOR i = 0 TO seta_n: pinta chj, x2(i), y2(i), seta$, color(2)
2240 CLS #chm: marcador chm, setas, puntos, tiempo, tiempofase, vidas, seta$, cw, color
2250 pinta chj, x, y, avatar$, color(1)
2260 listo chj, cw, ch
2270 END DEFine tablero
2280 :
2290 DEFine PROCedure nuevafase(chj, chm, cw, ch, ww, wh, setasfase, puntos, tiempofase, fase, vidas, color)
2300 REMark cambio de fase
2310 LOCal a$, anim, contadores, espera_tecla, f, i, l, t, t$, setas, sx, sy, mx, my, tl, ty
2320 t$ = "FASE # "&fase: l = LEN(t$): f = (cw - l) DIV 2
2330 t$ = FILL$(' ', f)&t$&FILL$(' ', f): l = LEN(t$)
2340 my = wh/2.5
2350 sx = ww DIV 2 - 6*l: sy = wh DIV 3 - 12
2360 limpiateclas
2370 CLS #chj: grandote chj, sx, sy, ww, wh, t$
2380 CLS #chm: muestraNombre chm, cw, ch, nombre$, version$
2390 REMark espera 100000
2400 CSIZE 2, 1: i = 0: setas = setasfase
2410 REPeat contadores
2420 CURSOR #chj, 145, my: INK #chj, color(2): PRINT #chj, seta$;
2430 CURSOR #chj, 160, my+6: INK #chj, color(1): PRINT #chj, " ";cero$(setas, 2)
2440 IF NOT i THEN espera 100000
2450 CURSOR #chj, 85, my+30: INK #chj, color(2): PRINT #chj, "Tiempo ";
2460 CURSOR #chj, 160, my+30: INK #chj, color(1): PRINT #chj, " ";cero$(tiempofase, 2)
2470 IF NOT i THEN espera 100000
2480 CURSOR #chj, 85, my+60: INK #chj, color(2): PRINT #chj, "Puntos ";
2490 CURSOR #chj, 160, my+60: INK #chj, color(1): PRINT #chj, " ";cero$(puntos, 7)
2500 i = 1
2510 IF setas THEN setas = setas-1: puntos = puntos + 10: ELSE i = i + 1
2520 IF tiempofase THEN tiempofase = tiempofase-1: puntos = puntos + 20: ELSE i = i + 1
2530 IF i > 2 THEN EXIT contadores
2540 espera 25000
2550 END REPeat contadores
2560 fase = fase+1
2570 REMark ajuste de la dificultad del juego
2580 bicho_n = fase DIV 3 - 1: IF bicho_n > bicho_nmax THEN bicho_n = bicho_nmax
2590 setasfase = 20 + 5*(fase DIV 5)
2600 IF fase > 10 THEN i = 1: velocidad = 0.95*velocidad: ELSE i = 1.5
2610 tiempofase = INT(i*setasfase + .99)
2620 CSIZE 0, 0: limpiateclas: PAUSE 150
2630 END DEFine nuevafase
2640 :
2650 REMark ##########################################
2660 REMark funciones UDG
2670 REMark ##########################################
2680 :
2690 DEFine PROCedure udgSet(ch, n)
2700 REMark define UDG set (User Defined Graphics)
2710 LOCal i, p, v
2720 system_variables_base_address = 163840: REMark default QL ROM system variables address
2730 v$ = VER$: IF v$ == "JSL1" OR v$ == "HBA" THEN system_variables_base_address = VER$(-2)
2740 channel_base_address = PEEK_L(system_variables_base_address)
2750 channel_header_address = PEEK_L(channel_base_address + 4*ch)
2760 REMark get and save font2 base address
2770 pointer_enviroment_offset = 0: REMark 0 or 48
2780 font2_base_address = PEEK_L(46 + pointer_enviroment_offset + (PEEK_L(PEEK_L(system_variables_base_address + 120) + 4*ch)))
2790 REMark get udg memory space & set udg address
2800 udg_address = RESPR(9*(n + 2) + 2)
2810 POKE_L 46 + pointer_enviroment_offset + (PEEK_L(PEEK_L(system_variables_base_address + 120) + 4*ch)), udg_address
2820 p = udg_address
2830 POKE p, 127: POKE p + 1, n: p = p + 2
2840 FOR i = 1 TO 9: POKE p, 0: p = p + 1
2850 FOR i = 1 TO 9*n: READ v: POKE p, v: p = p + 1
2860 FOR i = 1 TO 9: POKE p, 0: p = p + 1
2870 END DEFine udgSet
2880 :
2890 DEFine PROCedure udgUnset(ch)
2900 REMark restore system font pointers
2910 POKE_L 46 + pointer_enviroment_offset + (PEEK_L(PEEK_L(system_variables_base_address + 120) + 4*ch)), font2_base_address
2920 END DEFine udgUnset
2930 :
2940 REMark ##########################################
2950 REMark datos UDG (9x6 pixels)
2960 REMark ##########################################
2970 :
2980 DATA 0, 24, 28, 28, 252, 252, 252, 120, 0: REMark izquierda-arriba
2990 DATA 0, 120, 252, 60, 28, 60, 252, 120, 0: REMark izquierda
3000 DATA 0, 120, 252, 252, 252, 28, 28, 24, 0: REMark izquierda-abajo
3010 DATA 0, 0, 132, 204, 204, 252, 252, 120, 0: REMark arriba
3020 DATA 0, 0, 0, 0, 120, 252, 180, 48, 0: REMark seta
3030 DATA 0, 120, 252, 252, 204, 204, 132, 0, 0: REMark abajo
3040 DATA 0, 96, 224, 224, 252, 252, 252, 120, 0: REMark derecha-arriba
3050 DATA 0, 120, 252, 240, 224, 240, 252, 120, 0: REMark derecha
3060 DATA 0, 120, 252, 252, 252, 224, 224, 96, 0: REMark derecha-abajo
3070 DATA 0, 120, 252, 252, 252, 252, 252, 120, 0: REMark centro
3080 DATA 0, 132, 180, 120, 48, 120, 120, 180, 132: REMark bicho
3090 :
3100 REMark ##########################################
3110 REMark programa principal
3120 REMark ##########################################
3130 :
3140 REMark LOCal ciclo, contador, final, i, muerte, nombre$
3150 :
3160 REMark datos del programa
3170 :
3180 chj = 1: REMark ventana de juego
3190 chm = 2: REMark ventana de marcadores
3200 cw = 25: ch = 20: REMark anchura, altura y media anchura en caracteres
3210 ww = 12*cw+4: wh = 10*ch+2: REMark anchura, altura y media anchura en pixeles
3220 :
3230 REMark colores
3240 :
3250 DIM color(4)
3260 color(0) = 0: REMark color para el fondo
3270 color(1) = 6: REMark color para el avatar
3280 color(2) = 2: REMark color para las setas
3290 color(3) = 3: REMark color del borde
3300 color(4) = 5: REMark color para los bichos
3310 :
3320 REMark avatar
3330 :
3340 avatar$ = CHR$(137): REMark caracter para el avatar
3350 borrado$ = " ": REMark caracter para borrar personaje
3360 x = cw DIV 2: y = ch DIV 2: REMark posicion del avatar
3370 vidas = 3: anim = 0: REMark vidas y estado de la animacion del avatar
3380 :
3390 REMark setas
3400 :
3410 seta$ = CHR$(132): REMark caracter para las setas
3420 seta_n = 9: REMark numero de setas - 1
3430 DIM x2(seta_n), y2(seta_n): REMark posiciones de las setas
3440 FOR i = 0 TO seta_n: y2(i) = -1: nuevaSeta i, seta_n, x, y, x2, y2, cw, ch
3450 :
3460 REMark bichos
3470 :
3480 bicho$ = CHR$(138): REMark caracter para los bichos
3490 bicho_n = -1: bicho_nmax = 9: REMark numero de bichos - 1 y maximo numero de bichos - 1
3500 DIM bx(bicho_nmax), by(bicho_nmax), bdx(bicho_nmax), bdy(bicho_nmax): REMark posiciones y dirección de los bichos
3510 FOR i = 0 TO bicho_n: by(i) = -1: bdy(i) = -2: nuevaSeta i, seta_n, x, y, bx, by, cw, ch
3520 :
3530 REMark fase, puntuacion y tiempo
3540 :
3550 fase = 1: puntos = 0: tiempo = 9: tiempofase = 30: contador = 0: setasfase = 20: setas = setasfase
3560 :
3570 REMark crea las ventanas
3580 :
3590 pantalla chj, ww, wh, color
3600 :
3610 REMark UDG
3620 :
3630 RESTORE 2980: udgSet chj, 11: REMark define UDG
3640 RESTORE 2980: udgSet chm, 11: REMark define UDG
3650 :
3660 REMark presentacion
3670 :
3680 muestraNombre chm, cw, ch
3690 intro chj, cw, ch, ww, wh, nombre$, avatar$, seta$, color
3700 :
3710 REMark muestra el tablero de juego con las setas
3720 :
3730 tablero chj, chm, x, y, x2, y2, cw, ch, avatar$, seta$, puntos, tiempo, tiempofase, vidas, color
3740 :
3750 REMark ciclo principal del juego
3760 :
3770 final = 0
3780 REPeat ciclo
3790 IF mueveComesetas(chj, x, y, x2, y2, cw, ch, setas, puntos, tiempo, tiempofase, vidas, borrado$, color) THEN EXIT ciclo
3800 muerte = mueveBichos(chj, bicho_n, seta_n, bx, by, bdx, bdy, x, y, x2, y2, cw, ch, color)
3810 contador = contador+1: IF contador = 9 THEN
3820 contador = 0: tiempo = tiempo-1 : tiempofase = tiempofase-1
3830 marcador chm, setas, puntos, tiempo, tiempofase, vidas, seta$, cw, color
3840 IF NOT tiempo OR NOT tiempofase THEN muerte = 1: tiempo = 9
3850 END IF
3860 IF NOT setas THEN nuevafase chj, chm, cw, ch, ww, wh, setasfase, puntos, tiempofase, fase, vidas, color: setas = setasfase: tiempo = 9: marcador chm, setas, puntos, tiempo, tiempofase, vidas, seta$, cw, color: tablero chj, chm, x, y, x2, y2, cw, ch, avatar$, seta$, puntos, tiempo, tiempofase, vidas, color
3870 IF muerte THEN vidas = vidas - 1: marcador chm, setas, puntos, tiempo, tiempofase, vidas, seta$, cw, color: final = NOT vidas: IF final THEN EXIT ciclo: ELSE listo chj, cw, ch: tablero chj, chm, x, y, x2, y2, cw, ch, avatar$, seta$, puntos, tiempo, tiempofase, vidas, color
3880 espera 25000
3890 END REPeat ciclo
3900 IF final THEN AT #chj, ch DIV 2, cw DIV 2-5: INK #chj, 7: PRINT #chj, "GAME OVER"
3910 PAUSE
3920 fin chj, chm