Moverse / evitar obstáculos

12

Me gustaría escribir un "juego", donde puedes colocar un obstáculo (rojo), y luego el punto negro intenta evitarlo y llegar al objetivo verde.
Estoy usando una forma muy fácil de evitarlo, si el punto negro está cerca del rojo, cambia su dirección y se mueve por un tiempo, luego avanza hacia el punto verde.
Camino "poco realista"

¿Cómo podría crear una ruta "suave" para el "jugador" controlado por computadora?
Editar: No es la suavidad el punto principal, pero para evitar el "muro" de bloqueo rojo y no chocar contra él y luego evitarlo.

¿Cómo podría implementar algún algoritmo de búsqueda de ruta si solo tengo básicamente 3 puntos?
(¿Y qué haría las cosas mucho más complicadas si pudieras colocar múltiples obstáculos?)
Camino liso

usuario
fuente

Respuestas:

9

Un enfoque muy común y general es dividir su espacio mundial en cuadrículas y usar algoritmos como A *.

Este enlace me ayudó a comenzar a comprender e implementar el algoritmo A *.

Editar :

Un pensamiento más simple que viene a mi mente es ... una vez que tienes el mundo en celdas de cuadrícula. Siempre, haga que el punto negro siga la distancia de Manhattan al punto verde. Luego, puede asignar pesos a cada celda. Los obstáculos pueden tener un alto peso en la celda de la cuadrícula y la libertad de movimiento puede tener (digamos) 0 de peso. A medida que avanza a lo largo de la distancia de Manhattan, para cada movimiento, verifique si el peso de la celda siguiente no es mayor que el peso de la celda actual. Si es más alto, verifique el peso de la celda adyacente y luego continúe.

Espero que esto ayude

brainydexter
fuente
Este artículo del algoritmo A * parece ser lo que estaba buscando, pero desafortunadamente lo que aún no sé es cómo dividir mi "mundo" en cuadrículas: S
usuario
Realmente depende Pensamiento: divide tu mundo en una cuadrícula de 32 x 32 que luego representaría posiciones en una matriz 2D. Por ejemplo, en su caso: el punto rojo está en 120, 120 píxeles (o 120/32 x 120/32: 3.75 x 3.75) 3.75 x 3.75 representa una posición en su cuadrícula mundial (o matriz 2D). Dado que las matrices están indexadas por enteros, solo desea una parte entera. Por lo tanto, el punto rojo sería a 3 x 3. Esperar que esto ayude
brainydexter
18

Los comportamientos de dirección están diseñados para este conjunto de problemas exactos.

http://www.red3d.com/cwr/steer/

Básicamente, combinaría el comportamiento para evitar obstáculos con probablemente el comportamiento de búsqueda o persecución. Esa página tiene un montón de animaciones java de los diferentes comportamientos y lo que hacen. Hay varias implementaciones de código abierto de comportamientos de dirección. Aquí hay uno.

Tétrada
fuente
Los comportamientos de dirección son perfectos para esto.
Tenpn
2

Una cosa fácil de probar es tener un punto invisible que se adelanta al punto negro y ejecuta la ruta en su primera imagen. El punto negro sigue al punto invisible a una pequeña distancia detrás.
He visto este trabajo con buenos resultados pero, por supuesto, podría no satisfacer sus necesidades.

Paulo Pinto
fuente