M-TANKS: Dilema programático

Por assembler

Champion (404)

Imagen del assembler

05-12-2011, 20:28

Buenas noches.

Se me está atragantando la IA del M-Tanks, y me estoy planteando sustituirla por modos de juego que permitan disfrutar de él a un solo jugador (cuando se de el caso).

La parte en la que el tanque que controla el ordenador apunta a su objetivo, le dispara y esquiva objetos para alcanzarlo, la tengo lista, pero son demasiado "tontos" para que me convenza, y llevo tiempo con escasez de memoria, así que no puedo comprobar muchas más variables para hacerlos más "inteligentes".

En su lugar he pensado poner un modo de entrenamiento con dianas aleatorias y otro para recoger objetos en un tiempo límite. El primero se podría jugar de 1 a 4 jugadores y el otro solo para 1 jugador.
Esto es mucho más sencillo y me dejaría memoria para un par de mapas nuevos o más músicas.

¿Me podíais decir que opción os parece más interesante para implementarla?

Quiero terminarlo para la MSXDEV'11 y con las tonterías ya solo me quedan 2 meses oO

Saludos MSXeros

Login sesión o register para postear comentarios

Por kabish

Master (223)

Imagen del kabish

06-12-2011, 09:58

No se que decirte. Independientemente de los modos de juego que tenga, lo importante es que sea divertido y se pueda jugar. Es lo mas importante de un juego.

Quizas para la IA podrias hacer unos caminos ya predefinidos. Segun la posicion del enemigo, elige un camino u otro.

Un saludo.

Por mesiasmsx

Prophet (3327)

Imagen del mesiasmsx

06-12-2011, 12:42

Totalmente de acuerdo con la primera parte del mensaje de Kabish.

Por NapalM

Master (234)

Imagen del NapalM

06-12-2011, 22:40

Piensa en el PACMAN, cada fantasma tiene una IA simple, pero como cada uno tiene una diferente da el pego Wink

Por nanochess

Master (222)

Imagen del nanochess

11-12-2011, 20:41

Yo pondría varias IA simples, una vez hice uno de texto donde un tanque enfrentaba una docena de tanques aleatorios con la misma IA, era entretenido, vi la captura de pantalla de tu juego en el MSXDev.
Una idea para una IA sería:
o Girar hasta mirar al jugador, avanzar, si hay campo libre, disparar.
o Si no hay campo libre, avanzar hasta topar con pared y girar a la izquierda, avanzar hasta que el lado izquierdo deje de tener pared, entonces volver al primer paso. (opción, si topa con pared, volver a girar a la izquierda, entonces solito buscaría la salida)
Ahora la IA puede variar si en lugar de girar a la izquierda se gira a la derecha o el giro se hace aleatorio.
Este tipo de IA consume muy poco espacio y recursos Smile, y hay otras ideas, es cuestión de ser un poco excéntrico (¿qué tal un tanque que huya cuando el jugador lo tiene a tiro? Tongue )

Por pitpan

Prophet (3144)

Imagen del pitpan

15-12-2011, 12:18

En cualquier caso, no me atrevería a llamar IA a lo del PAC-MAN. Es un simple algoritmo, totalmente determinista, pero que cumple su papel a nivel de juego.

Terminología aparte, para el juego que nos ocupa, sería partidario de mantener ambas opciones: un modo 1P en plan pruebas y un modo 1P vs CPU. Para ello, efectivamente, rutinas que combinen algoritmos sencillos (moverse, apuntar, disparar), un control de bloqueo por tiempo, para cambiar de rutina si no hay progreso, y un elemento aleatorio (viva LD A,R).

Pero, evidentemente, todo dependerá de la cantidad de memoria disponible, tanto ROM (programa) como RAM (complejidad del algoritmo empleado).

Por assembler

Champion (404)

Imagen del assembler

15-12-2011, 12:30

Estoy haciendo pruebas para pasar el límite de los 32KB. No sé si me quedaré en los 48KB, o saltaré al megarom (aunque se quede medio vacío). Superado el límite, solo me falta pelearme con la IA.

@nasnochess: Eso que dices es lo que hago. La única diferencia es que dependiendo de que "sensor" es el que toca la pared, gira en un sentido u otro. Si el tanque tiene como dirección las 2 (en un reloj de los de agujita), si choca primero el sensor delantero izquierdo, para empezar a salvar el obstáculo, deberá girar a la derecha hasta ponerse mirando a las 3, andar hasta que el sensor externo trasero izquierdo pase el obstáculo, o bien choque de frente, en cuyo caso tendría que volver a girar a la derecha, así hasta sortearlo. Si el choque inicial hubiera sido con el derecho, los giros serían a izquierda.

@pitpan: para el cálculo aleatorio, encontré una rutina por los interneles que me da unos números decentemente aleatorios. LD A,R es suficientemente aleatorio?

Por NapalM

Master (234)

Imagen del NapalM

15-12-2011, 13:12

LD A,R solo da un resultado "aleatorio" si no lees valores seguidos. Sí solo lees uno, o entre uno y otro esperas una pulsación de tecla o algo así, entonces sí.
Porque si no, los valores serán una incrementacion del anterior, y pierde casi todo el sentido de aleatoriedad.
Haz pruebas, ya veras a que me refiero.

Por Warchild

Paragon (1285)

Imagen del Warchild

15-12-2011, 20:11

Si no entendí mal el registro R se incrementa con cada instrucción que ejecuta el procesador, por lo que lo más normal es que tarde o temprano acabes repitiendo un mismo patrón. En basic recuerdo que utilizando RND(-TIME) en lugar de RND(X) se conseguía salvar eso. Habría forma de hacerlo en ensamblador?

Por assembler

Champion (404)

Imagen del assembler

15-12-2011, 21:42

inicia_aleatorio:

ld hl,LFSRSeed0
ld de,LFSRSeed
ld bc,8
ldir
      
aleatorio:
push hl
push de
push bc
        ld hl,LFSRSeed+4
        ld e,[hl]
        inc hl
        ld d,[hl]
        inc hl
        ld c,[hl]
        inc hl
        ld a,[hl]
        ld b,a
        rl e
rl d
        rl c
rla
        rl e
rl d
        rl c
rla
        rl e
rl d
        rl c 
rla
        ld h,a
        rl e
rl d
        rl c
rla
        xor b
        rl e
rl d
        xor h
        xor c
        xor d
        ld hl,LFSRSeed+6
        ld de,LFSRSeed+7
        ld bc,7
        lddr
        ld [de],a

pop bc
pop de
pop hl
        ret
Esa es la rutina que uso. La saque de una pagina que hablaba de como sacar números aleatorios en spectrum. La inicialización copia un bloque de 8 bytes aleatorios (calculados inicialmente en tiempo de compilación). La rutina se encarga de ir modificando.

Para asegurar una secuencia distinta en cada partida, durante el bucle del menú se están obteniendo números aleatorios, así al empezar el juego, el indice de la secuencia puede estar en cualquier punto