先放上几个网站……不然到时候不知道从哪找

庙算的门户: 

庙算 (ia.ac.cn)

庙算兵棋推演AI开发初探(1-调用结构)_数据

http://wargame.ia.ac.cn/main图灵网:

人机对抗首页 (ia.ac.cn)

庙算兵棋推演AI开发初探(1-调用结构)_数据

http://turingai.ia.ac.cn/


下载完社区开发版、用python可以运行之后,开始思考怎么写AI。

这是徐师兄写的帮助文档:

《庙算 陆战指挥官》兵棋推演平台AI开发指南 (yuque.com)

AI开发需要自行编写名为Agent的类,继承BaseAgent类并重载一些方法:

这些方法均来自BaseAgent类

一、外部对AI(重写的agent类)的调用

AI控制种类分为单agent模式,多agent模式;本篇先研究一下单agent模式。

run_offline_games.py

找到main函数

重写了【注释】来说明一下内容

def main():
    run_in_single_agent_mode()
    # run_in_multi_agents_mode()


def run_in_single_agent_mode():
    """
    单 agent 模式
    """
    print("running in single agent mode...")
    # instantiate agents and env
    red1 = Agent()
    blue1 = Agent()
    env1 = TrainEnv()
    begin = time.time()

    # 读取地图、想定等数据【之后字典赋值的都是来源于这里】
    。。。。。。

    # 回放数据初始化。它是一个空列表,用于存储游戏过程中的环境状态。
    all_states = []

    # 玩家数据初始化(包含两个字典的列表)
    player_info = [。。。。。。

    # 交互环境初始化(一个字典)
    env_step_info = {。。。。。。

    # 传入刚定义的字典,把GREEN的状态添加到回访数据列表中
    state = env1.setup(env_step_info)
    all_states.append(state[GREEN])
    print("Environment is ready.")

    # 双方Agent类初始化(把自己的属性字典赋值进去)
    red1.setup(
        {。。。。。。
    )
    blue1.setup(
        {。。。。。。
    )
    print("agents are ready.")

    # 主循环
    print("steping")
    done = False
    while not done:
        actions = []
        actions += red1.step(state[RED])
        actions += blue1.step(state[BLUE])
        state, done = env1.step(actions)
        all_states.append(state[GREEN])

    #打扫清理
    env1.reset()
    red1.reset()
    blue1.reset()
    
    print(f"Total time: {time.time() - begin:.3f}s")

    # 保存回放资料
    。。。。。。

碎碎念:这里总喜欢用setup()做初始化函数的命名……我比较喜欢用Init()来命名……

二、Agent类解读

0.行为定义

agent.py文件中的ActionType类定义了都有哪些行为

class ActionType:
    (
        Move,
        Shoot,
        GetOn,
        GetOff,
        Occupy,
        ChangeState,
        RemoveKeep,
        JMPlan,
        GuideShoot,
        StopMove,
        WeaponLock,
        WeaponUnFold,
        CancelJMPlan,
        Fork,
        Union,
        ChangeAltitude,
        ActivateRadar,
        EnterFort,
        ExitFort,
        LayMine,
    ) = range(1, 21)

1.setup函数

用于初始化(我看待时候竟然习惯于找头文件……不得不说还是python更方便)

2.step函数

在step中开发者需要体现AI的策略。step函数传入的参数是对局的态势信息,输出的则是AI的动作列表。因为AI所作出的一切动作都必须要通过step函数来返回,所以开发者需要在step函数中完成接受态势以及生成动作的功能。态势数据和动作参数的具体格式及含义见4.1 态势数据说明以及4.2 动作示例及参数说明

【这部分下一篇细说】

3.reset函数

在一场对局结束后,AI需要调用reset清空AI在对局中调用的数据、模型、资源等。为避免对接下来的对局过程中AI的决策产生意外的影响。