Mientras escribía AI para la estrategia por turnos

Hola a todos Creo que desde el encabezado está claro que hablaremos sobre la creación de inteligencia artificial (en adelante, simplemente IA), sobre qué decisiones se tomaron y qué sucedió finalmente. Pero primero debes ponerte al día.

El juego está escrito en el lenguaje de programación Lua, por lo que daré ejemplos de código en este idioma.

Describiré algunos detalles del juego que son importantes para la IA:

  1. El juego es una estrategia por turnos. Primero, el jugador camina, luego la IA realiza sus acciones para cada país. La IA solo funciona cuando haces clic en Siguiente movimiento y no tiene idea de lo que sucede en otro momento.
  2. El juego tiene un mapa en el que puedes reclutar / mover / desplegar tropas. La IA debe analizarlo y tomar las decisiones necesarias.
  3. En el juego, puedes hacer las paces / declarar la guerra / firmar un pacto de no agresión / celebrar y terminar alianzas. La IA debe ser capaz de hacer frente a esto.
  4. La tecnología y las instituciones políticas están disponibles solo para el jugador. Las bonificaciones de IA no cambian desde el comienzo del juego, a diferencia del jugador.

La función que es responsable de comenzar el próximo movimiento se ve así:

function next_step() --     --   ,    for k, v in pairs(game_data.lands) do calc_ai(k) end --  End 

Debes haber notado la función mágica calc_ai , que es responsable de todas las acciones de los bots. Todavía puede ver un detalle interesante: la función se realiza alternativamente para cada país.

Ahora respondemos a la pregunta, ¿qué sucede en calc_ai ?

 function calc_ai(land) if land == game_data.player_land or land == "Undeveloped_land" or not game_data.lands[land] then return end --    ,     for k, v in pairs(game_data.lands) do local option = math.random() --  ,       . if k == game_data.player_land then ai_data = fixed_ai_data[game_data.difficulty].player else ai_data = fixed_ai_data[game_data.difficulty] end end move_army( math.random(), land) --  balance_army( math.random(), land) --   end 

Hasta que comprendamos profundamente cómo la IA toma decisiones en política, observamos lo siguiente:

  1. Hay una comprobación de que la IA no va accidentalmente para el jugador o para la incomprensible Undeveloped_land. Esto es solo tierra sin un país (de hecho, una provincia siempre debe tener un país que lo posea, por lo que Undeveloped_land es la designación principalmente para el juego).
  2. La IA selecciona diferentes tablas para interactuar con el país, dependiendo de si el jugador lo controla o no.
  3. La IA primero mueve al ejército, y solo luego contrata.

fixed_ai_data : la tabla misma. Se llama así porque no cambia (más precisamente, la variable siempre se refiere a la tabla raíz).
ai_data : la tabla en sí, que cambia dependiendo de si el bot trata con el jugador o no (la variable simplemente se refiere a la tabla deseada).

De hecho, el juego solo tiene una tabla relacionada con la IA, y se ve así:

 local ai = { standard = { peace = { conquer = 0.0001, war = 0.0002, war_neighbour = 0.004, pact = 0.005, agree_pact = 0.018, alliance = 0.001, alliance_small = 0.002, agree_alliance = 0.002, kick = 0.0005, envy = 0.02 }, war = { agree_peace = 0.005, }, player = { peace = { war = 0.0002, war_neighbour = 0.002, pact = 0.008, agree_pact = 0.08, alliance = 0.001, alliance_small = 0.002, agree_alliance = 0.002, kick = 0.0005, support = 0.005, voluntary_support = 0.002, envy = 0.01 }, war = { agree_peace = 0.02, } }, bonuses = { population_increase = 1.4, money_increase = 1.5, upgrade_province = 0.005 } }, } 

standard - nivel de dificultad. Hay varios niveles de dificultad, y los valores en diferentes tablas varían.

peace , war - estado del país. La mesa de peace se usa para cualquier acción, la mesa de war es solo para acciones con el enemigo.

La mesa del tercer player contiene las tablas de peace y war con los valores cambiados. Como ya sabes, en un juego de IA puedes tener una actitud diferente hacia el jugador y el bot.

Los valores en las tablas, creo, son claros por nombre. Pero en cualquier caso, consideraremos algunos de ellos.

Mientras tanto, tenemos que descubrir cómo funciona la IA en el juego. Aquí todo es simple, dependiendo del estado, el bot puede seleccionar cualquier valor de la lista. Los números anteriores son la probabilidad de ocurrencia de cada evento. Considere un ejemplo:
pact = 0.005 - significa que con una probabilidad de 0.005 un país ofrecerá a otro país para concluir un pacto de no agresión. Si, todo es simple. Puedes decir: "¿Cómo puedes jugar, sabiendo que la IA hace todo al azar?" En realidad, no es así, y lo analizaremos un poco más tarde.

Mientras tanto, mira la siguiente función:

 function get_answer(option,state) local sum_option = 0 for k, v in pairs(state) do sum_option = sum_option + v if option < sum_option then return k end end if sum_option > 1 then print("AI Error, sum_option > 1") end end 

option : número aleatorio de 0 a 1
state - Estado del país
La función get_answer simplemente devuelve una acción aleatoria. ¿Por qué es necesario y por qué no puede simplemente seleccionar la option <posibilidad de acción? Creo que no es necesario explicarlo.

Esta función está marcada en todas las acciones posibles para AI:

 if __ and get_answer(option, ai_data.peace) == "pact" then _ end 

Todo es simple Esto, al parecer, se puede terminar, pero no.

Aclaremos algunos puntos:

  1. AI declara la guerra a los vecinos y no vecinos con diferentes posibilidades ( war , war_neighbour )
  2. Los países pequeños tienen más probabilidades de unirse a los sindicatos que los grandes ( alliance , alliance_small )
  3. La IA tiene envidia. El nombre no está del todo claro, pero esta es una oportunidad con la que el país declarará la guerra demasiado fuerte según los estándares del poder del juego.
  4. Nos olvidamos de la mesa de bonos. Almacena valores que de ninguna manera están relacionados con la actitud hacia otros países, por ejemplo, una bonificación al crecimiento de la población o una oportunidad de mejorar la provincia.

Esto no terminó allí (a menos que esté interesado, por supuesto). Es extraño cuando un país declara la guerra sin razón, y aún más extraño cuando no está listo para esta guerra. Por lo tanto, la IA en el juego tiene estrategias. Explicaré que en lugar de un ataque sorpresa, en la mayoría de los casos, el país comienza una estrategia.

Cada país en el archivo de guardar tiene los siguientes campos:

  • strategy : identificador de la estrategia. Sucede:
    1. retreat : un país reduce su ejército para ahorrar dinero.
    2. recruit - el país emplea el ejército máximo.
  • target es el objetivo. Este es cualquier país por el cual nuestra IA decidió declarar la guerra, pero comenzó una estrategia.
  • ultimatum - nulo, si no hay ultimátum, datos sobre el ultimátum, si los hay.
  • value : el número de movimientos antes de la declaración de guerra. No pude encontrar un mejor nombre de variable, lo siento.

Es decir, si AI comienza una estrategia, entonces él:

  1. Reduce su ejército y ahorra dinero.
  2. Contrata al ejército más alto posible.
  3. Declara la guerra al jugador.



Con cierta posibilidad, un país puede presentar un ultimátum, en cuya implementación se cancela la guerra. Por ejemplo:
Reduce tu ejército en la provincia de lipetsk a 5,000, de lo contrario te declararemos la guerra.

De lo divertido: hay un error interesante o incluso un defecto cuando el país exige reducir el ejército en la provincia, y el jugador logra perder el ultimátum hasta que expire. La IA no tiene en cuenta la provincia y, si no se respeta el ultimátum, declara la guerra.



Hay dos variables que son responsables de la posibilidad de apoyar al jugador (transferir oro al jugador). El primero siempre funciona, excepto por el estado de guerra con el país para el que se calcula. Y el segundo, con gran importancia, se tiene en cuenta cuando hay un enemigo común.

También se agregaron varias variables, por ejemplo, el miedo (cuánto debería superar el ejército enemigo para que la IA comience a pensar en el mundo). Todo esto se hace para que las acciones de IA parezcan más lógicas y comprensibles. Pero de todos modos, ahora sabemos que esto es en realidad un accidente encubierto ordinario.

También noté que los jugadores realmente dotan a la IA de algunas características inusuales para él. Por ejemplo, si en un momento determinado un jugador declara la guerra a varios países, primero pensará que se trata de una conspiración contra él, y no solo una coincidencia. Y si al jugador se le envía una propuesta para concluir un pacto de no agresión, pensará que el vecino teme por sus tierras. Pero, desafortunadamente, esto no es así. La realidad está llena de decepciones.

Source: https://habr.com/ru/post/473952/


All Articles