大家好 我认为从标题很明显,我们将讨论人工智能(以下简称为AI)的创建,做出的决定以及最终发生的事情。 但是首先,您需要快速入门。
游戏是用Lua编程语言编写的,因此,我将提供使用该语言编写的代码示例。
我将描述一些对AI重要的游戏细节:
- 游戏是回合制策略。 首先,玩家行走,然后AI针对每个国家/地区进行动作。 仅当您单击“下一步”时,AI才起作用,并且不知道下次会发生什么。
- 游戏中有一张地图,您可以在其中招募/移动/部署部队。 AI必须对其进行分析并做出必要的决策。
- 在游戏中,您可以达成和平/宣战/签署不侵略条约/建立并终止同盟。 AI必须能够应付这一点。
- 技术和政治机构仅对玩家可用。 与玩家不同,人工智能奖金从游戏开始就不会改变。
负责开始下一步操作的函数如下所示:
function next_step()
您一定已经注意到魔术函数
calc_ai
,它负责机器人的所有操作。 您仍然可以看到一个有趣的细节:该功能在每个国家/地区交替执行。
现在我们回答这个问题,
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
在我们深入了解AI如何在政治中做出决策之前,我们需要注意以下几点:
- 检查一下AI是否不会意外地进入玩家或无法理解的Undeveloped_land。 这只是没有国家的土地(实际上,一个省应该总是有一个拥有它的国家,因此Undeveloped_land是主要用于游戏的名称)。
- AI根据玩家是否控制国家来选择与国家互动的不同表格。
- AI首先动员军队,然后才招募。
fixed_ai_data
表本身。 之所以这样命名,是因为它不会更改(更确切地说,该变量始终引用根表)。
ai_data
表格本身,它根据机器人是否与玩家
ai_data
而变化(变量仅引用所需的表格)。
实际上,该游戏只有一张与AI相关的表,看起来像这样:
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
-难度等级。 难度有多个级别,不同表中的值也有所不同。
peace
,国家的
war
。
peace
表用于任何行动,
war
表仅用于与敌人的行动。
第三个
player
表包含值已更改的
peace
和
war
表。 如您所知,在AI游戏中,玩家和机器人的态度可能有所不同。
我认为表中的值按名称清晰可见。 但是无论如何,我们都会考虑其中的一些。
同时,我们需要弄清楚AI在游戏中的运作方式。 此处的一切都很简单,根据状态,机器人可以从列表中选择任何值。 上面的数字是每个事件发生的概率。 考虑一个例子:
pact = 0.005
意味着一个国家有0.005的机会将提供另一个国家缔结一项非侵略协定。 是的,一切都很简单。 您可以说:“知道AI随机地做完所有事情后,您如何玩?” 实际上,事实并非如此,我们稍后会对此进行分析。
同时,请看以下函数:
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
-从0到1的随机数
state
-国家
get_answer
函数只是返回一个随机动作。 为什么需要它,为什么您不能仅
option
<动作机会,我认为没有必要解释。
在AI的所有可能操作中都检查了此功能:
if __ and get_answer(option, ai_data.peace) == "pact" then _ end
一切都很简单。 这似乎可以完成,但没有。
让我们澄清一些要点:
- AI向机会不同的邻居和非邻居
war
( war
, war_neighbour
) - 与大国相比,小国加入工会的可能性更大(
alliance
, alliance_small
) - 人工智能令人羡慕。 名称尚不完全清楚,但这是该国根据游戏能力标准宣战的机会。
- 我们忘记了奖金表。 它存储的价值与对其他国家的态度毫无关系,例如,人口增长的奖金或改善该省的机会。
这并没有到此结束(当然,除非您有兴趣)。 当一个国家无缘无故宣战时,这是很奇怪的;而在没有为这场战争做好准备的情况下,那就更奇怪了。 因此,游戏中的AI具有策略。 我将解释说,在大多数情况下,该国开始采取战略,而不是突袭。
保存文件中的每个国家/地区都有以下字段:
strategy
- strategy
标识符。 它发生:
retreat
-一个国家为了节省钱而裁减军队。recruit
-国家雇用了最大的军队。
target
是目标。 这是我们的AI决定宣战但开始采取战略的任何国家。ultimatum
零,如果没有最后通n,则最后通data的数据(如果有)。- value-宣战前的行动次数。 抱歉,我无法提供更好的变量名。
也就是说,如果AI启动策略,那么他:
- 减少他的军队并节省金钱。
- 雇用最高级别的军队。
- 向玩家宣战。

一个国家有一定机会提出最后通atum,取消战争的实施。 例如:
将您在利佩茨克省的军队减少到5,000人,否则我们将向您宣战。有趣的是:当国家要求裁减该省的军队时,存在一个有趣的错误,甚至是一个缺陷,玩家设法失去最后通until,直到它到期为止。 大赦国际没有考虑到该省,如果未遵守最后通atum,便宣战。

有两个变量负责支持玩家(向玩家转移金币)。 第一个始终有效,但与要计算的国家的战争状态除外。 当存在一个共同的敌人时,第二个意义重大。
还增加了各种变量,例如恐惧(为了使AI开始思考世界,敌军应该超出自己的数量)。 完成所有这些操作是为了使AI的动作看起来更加合乎逻辑且易于理解。 但是无论如何,现在我们知道这实际上是一次普通的变相事故。
我还注意到,玩家确实为AI赋予了一些他不寻常的功能。 例如,如果某个时刻某个玩家向多个国家宣战,他首先会认为这是对他的阴谋,而不仅仅是巧合。 如果玩家被要求缔结一项不侵略条约,他会认为邻居担心自己的土地。 但是,不幸的是,事实并非如此。 现实充满了失望。