先放上几个网站……不然到时候不知道从哪找
庙算的门户:
庙算 (ia.ac.cn)http://wargame.ia.ac.cn/main图灵网:
人机对抗首页 (ia.ac.cn)http://turingai.ia.ac.cn/
下载完社区开发版、用Python可以运行之后,开始思考怎么写AI。
这是徐师兄写的帮助文档:
《庙算 陆战指挥官》兵棋推演平台AI开发指南 (yuque.com)
AI开发需要自行编写名为Agent的类,继承BaseAgent类并重载一些方法:
-
- setup
- step
- reset
这些方法均来自BaseAgent类
一、外部对AI(重写的agent类)的调用
AI控制种类分为单agent模式,多agent模式;本篇先研究一下单agent模式。
图引用自上面链接中的《平台AI开发指南》
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的决策产生意外的影响。