Karoshi MSX Community
05 de Julio de 2021, 03:36:54 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: Pathfinding en ensamblador  (Leído 6995 veces)
0 Usuarios y 1 Visitante están viendo este tema.
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« : 05 de Mayo de 2011, 10:01:53 am »

Aprovecho este mensaje para presentarme en el foro.

Estoy intentando hacer un jueguecito y después de las peleas típicas intentando ver con qué lenguaje y herramienta lo hago, me terminé decidiendo con algo de pesar al principio por el asMSX, aunque ahora estoy más que contento por la decisión que tomé.

Incluso me he lanzado a mandarlo a MSXDev'11 a ver si así me "obligo" a terminarlo.


Ya es totalmente jugable, pero quiero meterle algo de IA a los tanquecitos (que de eso va el juego).

Para buscar el camino y que un tanque con IA se acerque a su objetivo primero pensé en hacerlo de forma más o menos aleatoria, pero como es lógico, hace muchas tonterías.
He visto el algoritmo de PATHFINDING A*, y la duda que tengo es si es viable (por el tiempo de procesador que puede necesitar) o no, pensando que puede haber hasta 4 jugadores controlados por ordenador pensando cada movimiento  Huh
Y lo último que he pensado pero no me he puesto todavía es hacerlo con la "regla de la mano derecha", pero también creo que va a hacer algunas tonterías.

¿Alguien puede echarme una mano, aunque sea la izquierda?
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #1 : 05 de Mayo de 2011, 10:27:54 am »

Hola,

Eso del pathfinding A* parece un poco complicado. Lo que te recomiendo, como solución rápida pero efectiva, es emplear un algoritmo de camino lineal entero, como puede ser el algoritmo de línea de Bresenham, que creo que es el que emplea el propio MSX para resolver el comando LINE del BASIC. No emplea decimales, por lo que es muy rápido y consume poca CPU.

Sobre este algoritmo, podrías añadir una rutina de detección de colisiones con los obstáculos, de forma que si no se puede avanzar en la línea recta definida, hay que desplazar el tanque vertical u horizontalmente hasta poder trazar una nueva línea recta hacia el objetivo. Según definas este algoritmo podrás dotar de distintas "personalidades" a los tanques controlados por la CPU.

Pero ten en cuenta que en el peor de los casos TODOS los tanques serán controlados por la CPU, por lo que necesitas un algoritmo que sea muy rápido. En cuanto al Bresenham, tendrías que poder encontrarlo ya preparado para ensamblador del Z80. Googlea un poco y suerte.

Ya nos contarás tus progresos.
En línea
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #2 : 05 de Mayo de 2011, 11:11:37 am »

El problema que hay intentándolo hacer lineal es que si un obstáculo se vuelve hacia atrás, el tanque se quedaría enganchado:
Código:
...............................
...............................
.......................#...Orig
.......................#.......
.......................#####...
...Dest........................
...............................

Por eso he pensado en hacerlo chocando (o con puntos de control más adelantados para que gire antes de llegar a chocar), y que siga el borde del obstáculo hasta que tenga a la vista al susodicho...

« Última modificación: 05 de Mayo de 2011, 11:43:35 am por assembler » En línea
burguera
Visitante
« Respuesta #3 : 05 de Mayo de 2011, 11:25:20 am »

Me da la sensación que algoritmos como A* o D* son demasiado pesados para el MSX, aunque depende del tamaño del mapa y de si el juego es en tiempo real o por turnos. Y si usas criterios locales (como el que comenta pitpan) existe la posibilidad de quedarse encerrado en obstáculos en forma de U.

Una posibilidad sería mantener un pequeño histórico de donde ha estado el tanque. En cuanto se detecte que el tanque ha estado un determinado tiempo en la misma zona, se considera que es un obstáculo tipo U y se inicia un movimiento aleatorio, o en dirección contraria a la zona donde se ha estancado.

En mi opinión, deberías jugar con lo que comenta pitpan, detección de "estancamiento" del tanque y algún que otro movimiento aleatorio. Y, sobretodo, diseñando los escenarios para evitar las situaciones conflictivas.
En línea
SapphiRe_MSX
Visitante
« Respuesta #4 : 05 de Mayo de 2011, 07:09:27 pm »

Me da la sensación que algoritmos como A* o D* son demasiado pesados para el MSX

k0ga implementó un A* para MSX en ensamblador, así que es posible
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #5 : 05 de Mayo de 2011, 08:58:54 pm »

Que se pueda hacer no quiere decir que se deba hacer. Me temo que un algoritmo así multiplicado por cuatro ejecuciones no aguantará en un Z80 si queremos ir al frame.
En línea
SapphiRe_MSX
Visitante
« Respuesta #6 : 05 de Mayo de 2011, 10:34:22 pm »

Que se pueda hacer no quiere decir que se deba hacer. Me temo que un algoritmo así multiplicado por cuatro ejecuciones no aguantará en un Z80 si queremos ir al frame.

  El algoritmo sólo debería ejecutarse cuando la posición del jugador cambie (entiendo que la idea es que los tanques enemigos escojan la ruta más directa para ir a por él), lo que no pasará cada frame. ¿Es así?
En línea
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #7 : 05 de Mayo de 2011, 11:39:54 pm »

Solo habría que hacerlo cuando el tanque choque, para poder salvar el obstáculo. Cuando lo salve, solo irá en línea recta hacia su objetivo, manteniendo las distancias.

Pensé en hacer el algoritmo en un rango reducido alrededor del tanque, teniendo en cuenta lo que dice MrSpock: no hacer obstáculos que sean conflictivos...
En línea
Imanok
Karoshi Hero
*****
Mensajes: 626


« Respuesta #8 : 06 de Mayo de 2011, 04:11:25 pm »

De todas formas, aunque recalculases la trayectoria contínuamente, no tienes por qué hacerlo en cada frame para los 4 tanques... hazlo en un frame para cada tanque y ni notarás la diferencia (en los frames que no les toque recálculo, que se muevan por inercia en la dirección que llevaban).
En línea
ARTRAG
Visitante
« Respuesta #9 : 12 de Mayo de 2011, 12:01:48 am »

assembler: any your wish is an order... look at

http://www.msx.org/forumtopicl12811.html

and at

https://sites.google.com/site/devmsx/home/a-pathfinding-for-msx
« Última modificación: 12 de Mayo de 2011, 12:04:18 am por AR » En línea
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #10 : 19 de Marzo de 2012, 06:21:07 pm »

Para mejorar M-Tanks antes de encartucharlo, he decidido meterme de lleno con el Pathfinding, para que los tanquecitos no se queden como gilis dando vueltas por la pantalla.

El resultado, generado totalmente en ensamblador se ha quedado en poco más de 1KB y necesita 1,67KB de RAM para funcionar.

Para acelerarlo:
-he creado un mapa de 16x9 casillas de 16x16. Si cualquier cuadro dentro de esa casilla tiene una pared, lo considero no traspasable
-En lugar de buscar en estrella (8 direcciones desde el nodo central), solo busco en 4 (arriba, derecha, abajo,izquierda)
-No considero la posibilidad de no encontrar camino, porque siempre lo va a haber (en el caso concreto de M-TANKS)
-Aunque es rápido, solo voy a ejecutar un ciclo de búsqueda por ciclo de programa, así no se relentiza, y lo más que puede pasar es que un tanque se quede pensando un poquito (no creo que llegue ni a medio segundo pensando)
-solo se va a ejecutar una búsqueda de camino a la vez, así que si dos tanques se quedan bloqueados, solo uno de ellos buscará, el otro se pondrá a dar vueltecitas hasta que el primero encuentre el camino
-no tiene una forma sencilla de dibujar las paredes porque eso se calculará desde el mapa cada vez que se cambie de pantalla.

Si a alguien le interesa y no ve el código del todo claro, que avise y lo comento un poco más.

En línea
ARTRAG
Visitante
« Respuesta #11 : 20 de Marzo de 2012, 09:31:37 am »

two alternative solutions one in C (A* algorithm) one in asm (full graph search)
« Última modificación: 20 de Marzo de 2012, 09:33:16 am por AR » En línea
ARTRAG
Visitante
« Respuesta #12 : 30 de Marzo de 2012, 07:50:55 am »

https://sites.google.com/site/testmsx/Home/a-pathfinding
faster C version
En línea
Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!