先放上几个网站……不然到时候不知道从哪找
庙算的门户:
庙算 (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模式,多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.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)
用于初始化(我看待时候竟然习惯于找头文件……不得不说还是python更方便)
在step中开发者需要体现AI的策略。step函数传入的参数是对局的态势信息,输出的则是AI的动作列表。因为AI所作出的一切动作都必须要通过step函数来返回,所以开发者需要在step函数中完成接受态势以及生成动作的功能。态势数据和动作参数的具体格式及含义见4.1 态势数据说明以及4.2 动作示例及参数说明。
【这部分下一篇细说】
在一场对局结束后,AI需要调用reset清空AI在对局中调用的数据、模型、资源等。为避免对接下来的对局过程中AI的决策产生意外的影响。