博舍

[Python]游戏编程 python人工智能游戏脚本

[Python]游戏编程

游戏中的人工智能3

应该接着填坑了,把精力都放在机器学习上了,等掌握了再来写机器学习的。预留传送门

‘Festinationefacitvastum’

环境

Win10(神奇的我给kali装了Nivdia驱动,崩了)

Python2.7orPython3.6

Pycharm

蚂蚁实例

我们得先有身体–实例,才能有他的大脑,所以我们来写一个蚂蚁实例(继承于GameEntity):

classAnt(GameEntity):def__init__(self,world,image):#执行基类构造方法GameEntity.__init__(self,world,"ant",image)#创建各种状态exploring_state=AntStateExploring(self)seeking_state=AntStateSeeking(self)delivering_state=AntStateDelivering(self)hunting_state=AntStateHunting(self)self.brain.add_state(exploring_state)self.brain.add_state(seeking_state)self.brain.add_state(delivering_state)self.brain.add_state(hunting_state)self.carry_image=Nonedefcarry(self,image):self.carry_image=imagedefdrop(self,surface):#放下carry图像ifself.carry_image:x,y=self.locationw,h=self.carry_image.get_size()surface.blit(self.carry_image,(x-w,y-h/2))self.carry_image=Nonedefrender(self,surface):#先调用基类的render方法GameEntity.render(self,surface)#额外绘制carry_imageifself.carry_image:x,y=self.locationw,h=self.carry_image.get_size()surface.blit(self.carry_image,(x-w,y-h/2))

蚂蚁类呢先调用了父类的__init____init__,carry_image变量,保持了现在蚂蚁正在搬运物体的图像,或许是一片树叶,或许是一只死蜘蛛。这里我们写了一个加强的render函数,因为还需要画一下搬的东西。

来!写大脑!

有了身体,我们就应该写出他的身体了,这样才能满足我们的状态机(蚂蚁),在建造之前,我们首先来看一下都有啥状态:

状态行为探索(Exploring)随机的走向一个坐标搜集(Seeking)往一片树叶走去搬运(Delivering)搬移(树叶、蜘蛛)回家狩猎(Hunting)攻击蜘蛛

状态之间的变换条件也应该有(很多),举个列子:

条件状态发现树叶搜集(Seeking)有只猪(蜘蛛)狩猎(Hunting)

来来来,画一下状态机,打开我的Sai:如果你看一眼就懂了,那就说明你直接根据这个状态图写代码了,不过我们还是先建一个State类,保存我们的状态,就是一个框架:

classState():def__init__(self,name):self.name=namedefdo_actions(self):passdefcheck_conditions(self):passdefentry_actions(self):passdefexit_actions(self):pass

接下来,我们要建立一个状态机类来管理这些状态啦,整个代码的核心类(当当当):

classStateMachine():def__init__(self):self.state={}#用来储存状态self.active_state=None#当前的有效状态defadd_state(self,state):"""增加状态"""self.state[state.name]=statedefthink(self):ifself.active_stateisNone:return#执行有效状态的动作,并且做转移检查self.active_state.do_actions()new_state_name=self.active_state.check_conditions()ifnew_state_nameisnotNone:self.set_state(new_state_name)defset_state(self,new_state_name):"""更改状态,执行进入/退出动作"""ifself.active_stateisnotNone:self.active_state.exit_actions()self.active_state=self.active_state[new_state_name]self.active_state.entry_actions()

然后我们就可以愉快地通过继承State创建一系列的实际状态了,这些状态传递给StateMachine保留并运行。StateMachine类的think方法是检查当前有效状态并执行其动作的,最后还可能会调用set_state来进入下一个状态。

我们应该根据上面的四个状态表格建立状态了,一次性给出完整代码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇