按照原计划,这次是要讲解手柄的,pygame有着良好的控制手柄支持pygame.joystick,不过…… 我们暂时的目标是制作小游戏,小游戏晚了不少感觉使用手柄的好像还没看到过,用了感觉实在有些高深了。
有鉴于此,这一章先保留,后期需要的话再追加。绝对不是偷懒!真的,我很勤快的,真的不是偷懒~~
我们已经学习了游戏的图像和输入编程,接下来是什么?声音?没错,不过我们要晚一点再说声音。游戏中还有什么那么重要?哦是的,趣味性。
游戏的趣味是游戏生命的重要组成部分,其重要性甚至凌驾于任何元素,包括画面之上,之所以大家不太想得到,是因为这是个比较难定量的东西,难以直接用个什么方法测量出来。那么支持游戏趣味的是什么呢?是规则和智能。
规则是游戏的玩法,比如围棋,尽量扩大自己的领地;比如俄罗斯方块,把不同的方块组合起来,不留缝隙;再比如粘土世界,把小球连起来到达目的地。这就是游戏规则的具体体现,好的规则简单让人很容易理解,但是又能产生足够多的变化让我们无法穷尽它的方方面面。书写好的规则是天才或者干脆上天干的事,本系列文章还无法触及,请读者自己修炼了……
我们要学习游戏的另外一个支撑物,智能,或者帅气一点称为AI(Artificial Intelligence,人工智能,因为游戏里的智能肯定是人赋予的)。玩家操作我们自己的角色,那么NPC(nonplayer characters)呢?交由AI去操作,所以如果游戏中有何你相同地位的角色存在的话,你就是在和AI对垒。智能意味着对抗,“与人斗其乐无穷”,就是因为人足够聪明,要想“玩游戏其乐无穷”,我们都得赋予游戏足够的AI。
为游戏创建人工智能
也许你希望能在Pygame中发现一个pygame.ai模块,不过每个游戏中的智能都是不同的,很难准备一个通用的模块。一个简单的游戏中并不需要多少AI编程的代码,比如俄罗斯方块,你只需要随机的落下一个方块组合,然后每次下降完毕扫描一下落下的方块就好了,这甚至不能称为AI。但比如魔兽争霸,这里面的AI就非常的复杂,一般人都要学习一段时间才能打败电脑,可想而知其高度了。
尽管一般游戏中的人工智能都是用来对付人类的,不过随着游戏发展,AI也可能是我们朋友,甚至AI互相影响从而改变整个游戏世界,这样的游戏就有了更多的深度和未知,无法预知的东西总是吸引人的不是么?
游戏的AI编程不是一件简单的事情,幸运的是AI代码往往可以重用,这个我们以后再讲。
我们接下来要讲述游戏AI的技术,赋予游戏角色以生命,应该说人工智能是很高端的技术,花费几十年都未必能到达怎么的一个高度,所以这里的几章还是以讲解重要概念为主。作为参考,个人推荐Mat Buckland的《AI Techniques for Game Programming》,中文版《游戏编程中的人工智能技术》由清华大学出版社出版,很不错的一本入门书籍。
什么是人工智能
出于严谨性,我们应该给人工智能下一个定义。每个人都会对智能有一个概念,但又很难给它下一个确切的定义。著名的美国斯坦福大学人工智能研究中心尼尔逊教授对人工智能下了这样一个定义:“人工智能是关于知识的学科――怎样表示知识以及怎样获得知识并使用知识的科学。”而另一个美国麻省理工学院的温斯顿教授认为:“人工智能就是研究如何使计算机去做过去只有人才能做的智能工作。”这些说法反映了人工智能学科的基本思想和基本内容。即人工智能是研究人类智能活动的规律,构造具有一定智能的人工系统,研究如何让计算机去完成以往需要人的智力才能胜任的工作,也就是研究如何应用计算机的软硬件来模拟人类某些智能行为的基本理论、方法和技术。但这些说辞太麻烦了,我觉得,人工智能就是自我感知和反应的人造系统,足矣。
智能是一件玄妙的事情,在游戏中的人工智能更是如此,我们用程序中的一些数据结构和算法就构筑了NPC的大脑,听起来太酷了!更酷的是,Python非常适合用来编写人工智能。
人工智能初探
举超级玛丽为一个例子,那些走来走去的老乌龟,我们控制英雄踩到它们头上就能杀死它们,而平时,它们就在两根管子之间走来走去(这样的人生真可悲……),如果我们打开它们的脑袋看一下,可能会看到这样的代码:
1 2 3 |
self.move_forward() if self.hit_wall(): self.change_direction() |
无比简单,向前走,一撞墙就回头,然后重复。它只能理解一种状态,就是撞墙,而一旦到达这个状态,它的反应就是回头。
在考虑一个会发子弹的小妖怪,它的脑袋可能是这么长的:
1 2 3 4 5 6 7 8 9 10 |
if self.state == "exploring": self.random_heading() if self.can_see(player): self.state = "seeking" elif self.state == "seeking": self.head_towards("player") if self.in_range_of(player): self.fire_at(player) if not self.can_see(player): self.state = "exploring" |
它就有了两个状态,搜寻和锁定。如果正在搜寻,就随处走动,如果发现目标,就锁定他,然后靠近并试着向其开火,而一旦丢失目标(目标走出了视线范围或者被消灭),重新进入搜寻状态。这个AI也是很简单的,但是它对玩家来说就有了一定的危险性。如果我们给它加入更多的状态,它就会变得更厉害,游戏的趣味性也就可能直线上扬了。
OK,这就是我们下一次要讲的主题,状态机。