Ayuda para crear un bot

Iniciado por metamax, 25 Junio 2018, 19:30 PM

0 Miembros y 1 Visitante están viendo este tema.

metamax

Hola bueno pues quiero crear un bot para un juego.  Actualmente estoy trabajando en python y quiero saber que tengo que hacer o por donde empezar. Tambien uso c++.
La idea del bot es simple( bueno relativamente  ;D ) que mate a los bichos segun el mapa en el que se encuentre. Que recoja cosas que encuentre por ahi y escape de ataques. Tengo unos avances PERO no exactamente de bot sino mas bien de interactuar con el equipo. (Tomar una captura de pantalla, hacer click en tal posicion, oprimir tal tecla) La idea es que parezca que es un humano y no solamente un programa.
Si pueden ayudarme con informacion o ejemplos que me sirvan me ayudarian mucho...
Gracias

Tachikomaia

No sé mucho del tema, pero me da la impresión de que quien debe dar información eres tú.

En 1er lugar, cuando leí bot, pensé que te referías a un programa que haga cosas por Internet. Pero no se me pasó por la cabeza que pudiera ser para un videojuego. Según he visto usaste bien la palabra, pero si se trata de algo así entonces lo asocio con una inteligencia artificial. No sé los demás, pero capaz que entraron al tema pensando que hablabas de un "chateador" y al ver que era otra cosa no pudieron ayudarte, y los que sí pueden no entraron al tema porque no sabían que hablabas de algo que no es "chatear". Es una hipótesis...

Por último, hablas de matar en un mapa ¿pero cuántas dimensiones tiene? ¿tiene obstáculos? ¿plataformas? ¿cómo mata? ¿hablas de un shooter o más bien algo como Warcraft 3?

También uno se podría preguntar como qué humano, o cómo es un humano, pero digamos que es demasiado. Yo te recomendaría, si otro no dice algo, que pienses en "copiarte", o sea, crear una copia de ti, pensar qué harías tú.

En caso de videojuego estilo Warcraft, por ejemplo, si uno de tus soldados se encuentra con algún enemigo, lejos de tu base:
¿Crees que le ganas?
   S: Machacarlo.
   N: ¿Crees que conoce donde está tu base?
      S: ¿Crees que va distraídamente a ella?
         S: Machacarlo.
         N: ¿Crees que conviene machacarlos en tu base?
            S: ¿Tu soldado tiene menos rango que el enemigo?
               S: ¿Crees conveniente que tu soldado corra a la base?
                  S: Que corra a tu base.
                  N: Machacar al enemigo.
                  Nota: Otra opción sería alejarse, pero si el enemigo lo persigue entonces probablemente lo hiera y se aleje de la base.
               N: Mientras tenga rango y resistencia suficiente, atacar. Si se acercan, acercarte a tu base.
            N: ¿Tu soldado tiene menos rango que los enemigos?
               S: Mientras lo estén persiguiendo, huir al punto más alejado de ellos y las bases.
               N: Mientras tenga rango y resistencia suficiente, atacarlos. Si se acercan, acercarte al punto más alejado de ellos y las bases.
      N: ¿Crees que va distraídamente a ella?
         S: Machacarlo.
Bueno, me cansé, pero la idea es atacar, acercarte a tu base o alejarse, según la ocasión. Parece que es más fácil hacerlo a la inversa:

Si ves un enemigo lejos de tu base:

Atacar si:
- Supones que vencerías a tu enemigo.
- No tiene el rango suficiente como para contraatacar.
- No conoce la ubicación de tu base, se dirige a ella, y tú tienes la resistencia suficiente como para atacar, que te ataque, comenzar a huir (lejos de tu base) y que te persiga.
- Conoce la ubicación de tu base, no se dirige a ella, crees conveniente atacarlo cerca de ella, y tienes la resistencia suficiente como para atacarlo, que te ataque, comenzar a huir (hacia tu base) y que te persiga.

Acercarte a tu base si:
- Conoce su ubicación, crees conveniente atacarlo cerca de ella, y te está persiguiendo.

Alejarte de tu y del enemigo base si:
- No conoce su ubicación y te está persiguiendo.

También depende del tipo de soldado.

Tendrías que hacer esto para más casos, por ejemplo si un enemigo llega a tu base. Aunque en ese caso parece obvio qué hacer.

Lo ideal sería que la IA pudiera aprender, pero es muy difícil así como para empezar.


Por otro lado, yo te intenté responder sobre la estrategia, pero codificar cómo aplicar las acciones también es difícil, quizá más. Pero para eso se necesita tener un poco del código del juego, si no das más datos menos puedo ayudarte.

Suerte y si hallas una solución publícala en lo posible!

metamax

Gracias por responder.
Bueno si creo que no especifique que no quiero un chatbot.
La idea es un programa que interactue con un juego en base a algo que se le especifique.

Citar
Por último, hablas de matar en un mapa ¿pero cuántas dimensiones tiene? ¿tiene obstáculos? ¿plataformas? ¿cómo mata? ¿hablas de un shooter o más bien algo como Warcraft 3?
Es un juego en 2d visto desde arriba que tiene dos cosas simples: enemigos y cosas para recojer nada mas.
Hay varios tipos de enemigos unos mas fuertes que otros y es en base a eso que debe decidir si atacar o escapar.


Actualmente trabajo con open cv para identificar a los enemigos y objetos a recojer en la pantalla.
Citar
En caso de videojuego estilo Warcraft, por ejemplo, si uno de tus soldados se encuentra con algún enemigo, lejos de tu base:
Código:
¿Crees que le ganas?
   S: Machacarlo.
   N: ¿Crees que conoce donde está tu base?
      S: ¿Crees que va distraídamente a ella?
         S: Machacarlo.
         N: ¿Crees que conviene machacarlos en tu base?
            S: ¿Tu soldado tiene menos rango que el enemigo?
               S: ¿Crees conveniente que tu soldado corra a la base?
                  S: Que corra a tu base.
                  N: Machacar al enemigo.
                  Nota: Otra opción sería alejarse, pero si el enemigo lo persigue entonces probablemente lo hiera y se aleje de la base.
               N: Mientras tenga rango y resistencia suficiente, atacar. Si se acercan, acercarte a tu base.
            N: ¿Tu soldado tiene menos rango que los enemigos?
               S: Mientras lo estén persiguiendo, huir al punto más alejado de ellos y las bases.
               N: Mientras tenga rango y resistencia suficiente, atacarlos. Si se acercan, acercarte al punto más alejado de ellos y las bases.
      N: ¿Crees que va distraídamente a ella?
         S: Machacarlo.
jeje le diste en el clavo.
Por ejemplo

si el enemigo3 es mas fuerte que jugador entonces escapar sino atacar.

EL problema aqui es que lo unico que he logrado avanzar es en que el programa reconozca las imagenes del juego tales como enemigos y objetos para recojer pero mas nada.
Lo que necesito es un ejemplo de como interactuar con esa informacion.


Citar
Tendrías que hacer esto para más casos, por ejemplo si un enemigo llega a tu base. Aunque en ese caso parece obvio qué hacer.
Exacto pero no logro encajar esos datos con instrucciones.( ni me imagino siquiera como)

Citar
Lo ideal sería que la IA pudiera aprender, pero es muy difícil así como para empezar.
En eso pense porque la idea ( o lo que creo) es que el programa tenga la menor asistencia posible.
Los humanos no somos perfectos ni hacemos las cosas exactamente es por eso que deberia tener comportamientos erráticos espontáneos  que simulen a un ser humano.
Por ejemplo equivocarse al tomar una decision o desplazarse a algun lugar sin tener realmente un motivo para hacerlo( no hay enemigos ni tampoco objetos).

Esto es lo que tengo ( omito la parte de buscar imagenes ):
Código (python) [Seleccionar]

-----
class accion (pem):
        def __init__(self, arg):
        super(accion, self).__init__()
        self.arg = arg
        global enemigo,x,y
                        if enemigo ==3:
escapar(x,y)
else:
atacar(x,y)
                       
        def m_m(x, y):
pyautogui.moveTo(x, y)
    pyautogui.click()


def press(p):
    pyautogui.press(p)


def atacar(posX, posY):
m_m(posX, posY)
press("c")


def escapar(x, y):
if x < 10 or x > 220:
x = 100
if y < 35:
y = y + 10
m_m(x, y)

Algun ejemplo paractico al respecto me serviara de ayuda.
gracias

Tachikomaia

#3
Cita de: metamax en  7 Julio 2018, 23:00 PMEL problema aqui es que lo unico que he logrado avanzar es en que el programa reconozca las imagenes del juego tales como enemigos y objetos para recojer pero mas nada.
Lo que necesito es un ejemplo de como interactuar con esa informacion.
Sigo sin entender bien de qué hablas, quizá ignoro demasiado del tema.

Me imagino por ejemplo que si el enemigo está a la derecha y tu bot quiere escapar de él entonces debería moverse hacia la izquierda esquivando obstáculos, ideando un trayecto para no quedar en un hueco, aunque eso último es un tanto difícil de lograr, por ejemplo en Age of Empires 2 no lo lograron del todo...
También deberías considerar varios enemigos a la vez porque si hay uno en la izquierda y otro en la derecha entonces le convendrá moverse hacia abajo o arriba.

Lo de agarrar objetos es cosa más bien tuya, los eliminas de la pantalla y de la lista de cosas en la pantalla. Y los agregas en la lista de objetos de tu bot.

CitarExacto pero no logro encajar esos datos con instrucciones.( ni me imagino siquiera como)
Creo que haciendo muchas funciones. Función huir, función atacar, función buscar enemigo, acercarse a objeto...

Adermás, olvido esto pero creo que se puede, en vez de usar ifs, hacer llamadas a funciones variables. Por ejemplo: Llamar función "Peligro"+poderenemigo. Creo que requiere eval, no sé si tu lenguaje lo permite. Lo que logras con eso es que se active Peligro1, o Peligro2, etc, según el caso. Puedes sumar cosas en la llamada de modo que abarques todas las situaciones posibles que te interesen. Tenés que ver qué cosas te interesan y si puedes manifestarlas con un número o palabra, en lo posible sin usar ifs.
Un ejemplo:
BotfunciónBLFFFR
Significa:
El enemigo nro1 está cerca de tu Base, y cerca de ti, en Left.
El enemigo nro2 está Far de tu base, y Far de ti.
El enemigo nro3 está Far de tu base, y carca de ti, en Right.
Con eso armas la función como quieras, o sea pones en ella qué quieres que se haga. Y así con cada función posible. Puedes usar subfunciones para evitar repetir cosas.

No sé hasta qué punto es un buen método, pero a falta de otras respuestas...

CitarEn eso pense porque la idea ( o lo que creo) es que el programa tenga la menor asistencia posible.
¿A qué llamas asistencia? ¿que no requiera constantes instrucciones de ti como jugador?

CitarLos humanos no somos perfectos ni hacemos las cosas exactamente es por eso que deberia tener comportamientos erráticos espontáneos  que simulen a un ser humano.
Entonces en tu caso una IA que aprenda me parece ultra complicada, no puedo ayudarte, nunca pensé ni me interesa hacer una que cometa "errores a propósito" xD
Ponele random, o sea, posibilidad de hacer ciertas tonterías en ciertos casos.


A ver, me imagino un juego de este estilo:
https://www.youtube.com/watch?v=MO9Buh0B494
Capaz que en tu caso se pueden mover en diagonal o se ve en diagonal (tipo Final Fantasy Tactics), aunque te recomiendo este
https://www.youtube.com/watch?v=PJ2KJc61WZ4

¿Lograste que tu tanque se mueva según lo indiques?
¿que no pueda pasar por obstáculos?
¿que agarre los ítems y tengan efecto o se agreguen a la lista de usables, y realmente sean usables y tengan efecto?
¿que dispare cuando lo indiques?
¿que el disparo rompa cosas?
------------------
¿aparecen tanques enemigos?
¿se mueven?
¿chocan con obstáculos?
¿te buscan?
¿te disparan?
¿sus disparos te matan?
¿tú los matas con tus disparos?
----------------
¿tu bot se mueve en busca de enemigos?
¿les dispara?
¿sus disparos los matan?
¿lo pueden matar?
¿huye?
¿te ayuda si ve que estás en peligro?
¿busca ítems?
¿tienen efecto?

¿algo más?

metamax

Bueno estoy trabajando con los cambios que me indicaste. Voy a ver si me funciona. En cuanto este listo mi bot lo voy a publicar xD