本文转自:http://eyehere.net/2011/python-pygame-novice-professional-13/

我们已经学习了游戏的图像和输入编程,接下来是什么?声音?没错,不过我们要晚一点再说声音。游戏中还有什么那么重要?哦是的,趣味性。

游戏的趣味是游戏生命的重要组成部分,其重要性甚至凌驾于任何元素,包括画面之上,之所以大家不太想得到,是因为这是个比较难定量的东西,难以直接用个什么方法测量出来。那么支持游戏趣味的是什么呢?是规则和智能。

规则是游戏的玩法,比如围棋,尽量扩大自己的领地;比如俄罗斯方块,把不同的方块组合起来,不留缝隙;再比如粘土世界,把小球连起来到达目的地。这就是游戏规则的具体体现,好的规则简单让人很容易理解,但是又能产生足够多的变化让我们无法穷尽它的方方面面。书写好的规则是天才或者干脆上天干的事,本系列文章还无法触及,请读者自己修炼了……

我们要学习游戏的另外一个支撑物,智能,或者帅气一点称为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. self.move_forward()
  2. if self.hit_wall():
  3. self.change_direction()

无比简单,向前走,一撞墙就回头,然后重复。它只能理解一种状态,就是撞墙,而一旦到达这个状态,它的反应就是回头。

在考虑一个会发子弹的小妖怪,它的脑袋可能是这么长的:

  1. if self.state == "exploring":
  2. self.random_heading()
  3. if self.can_see(player):
  4. self.state = "seeking"
  5. elif self.state == "seeking":
  6. self.head_towards("player")
  7. if self.in_range_of(player):
  8. self.fire_at(player)
  9. if not self.can_see(player):
  10. self.state = "exploring"

它就有了两个状态,搜寻和锁定。如果正在搜寻,就随处走动,如果发现目标,就锁定他,然后靠近并试着向其开火,而一旦丢失目标(目标走出了视线范围或者被消灭),重新进入搜寻状态。这个AI也是很简单的,但是它对玩家来说就有了一定的危险性。如果我们给它加入更多的状态,它就会变得更厉害,游戏的趣味性也就可能直线上扬了。

OK,这就是我们下一次要讲的主题,状态机。

如何用Pygame写游戏(十三)相关推荐

  1. 如何用Pygame写游戏(十)

    本文转自:http://eyehere.net/2011/python-pygame-novice-professional-10/ 有时候无聊在网上翻翻小说看看,绝大多数那叫一个无聊.比如说修炼的境 ...

  2. 如何用Pygame写游戏(一)

    转载地址:http://eyehere.net/2011/python-pygame-novice-professional-1/ Pygame的历史  Pygame是一个利用SDL库的写就的游戏 ...

  3. 如何用Pygame写游戏(二十二)

    本文转自:http://eyehere.net/2011/python-pygame-novice-professional-22/ 辛苦啦~ 这次是我们系统的pygame理论学习的最后一章了,把这次 ...

  4. 如何用Pygame写游戏(十九)

    本文转自:http://eyehere.net/2011/python-pygame-novice-professional-19/ 3D世界 让我们现在开始写一个3D的程序,巩固一下这几次学习的东西 ...

  5. 如何用Pygame写游戏(十八)

    本文转自:http://eyehere.net/2011/python-pygame-novice-professional-18/ 3D是非常酷的技术,同时也就意味着更多的工作,上次的简单介绍之后, ...

  6. 如何用Pygame写游戏(十六)

    本文转自:http://eyehere.net/2011/python-pygame-novice-professional-16/ 经历了长年的艰苦卓绝的披星戴月的惨绝人寰的跋山涉水,我们终于接近了 ...

  7. 如何用Pygame写游戏(十四)

    本文转自:http://eyehere.net/2011/python-pygame-novice-professional-14/ 上一次稍微说了一下AI,为了更好的理解它,我们必须明白什么是状态机 ...

  8. 如何用Pygame写游戏(九)

    本文转自:http://eyehere.net/2011/python-pygame-novice-professional-9/ 上次我们说到了向量,不得不说向量是一个伟大的发明,在单纯的数字运算之 ...

  9. 如何用Pygame写游戏(八)

    本文转自:http://eyehere.net/2011/python-pygame-novice-professional-8/ 是时候让我们的游戏活泼起来了.电脑游戏和桌面游戏的一个巨大差别,想来 ...

最新文章

  1. flask urllib上传图片
  2. 在ASP.NET使用javascript的一点小技巧
  3. 2021年度【CSDN】硕果累累、满怀期待、新年憧憬
  4. Velocity 页面加减运算
  5. Enhanced LSTM for Natural Language Inference-学习笔记
  6. SharePoint无代码工作流设计开发实例——交通费报销流程(一)
  7. 小米登录协议分析_性能测试篇之Loadrunner与ida工具结合完成java vuser协议的脚本...
  8. 一文说透产品信息结构图的本质
  9. python接口自动化(四十四)- 公共模块configparser读取ini数据库、邮箱配置文件(单独说明)
  10. 静态方和和实例方法的区别
  11. 三星c7语言设为英文,三星C7手机如何更改显示语言?简单几步就可轻松搞定!
  12. 简单的网络数据++分类++封装OkHttp
  13. 阿里最全面试116题整理
  14. 使用Beyond Compare合并代码后出现乱码问题
  15. 快速搞明白公网和私网的区别(组建私网的网络号)
  16. Java绘图,图像处理
  17. Arduino基础篇(七)-- 如何使用DS18B20数字温度传感器(基于OneWire和DallasTemperature库)
  18. 计算机net是什么意思翻译,net是什么意思_net的翻译_音标_读音_用法_例句_爱词霸在线词典...
  19. 张宏系列又双叒叕售罄了
  20. 个人免签支付对接步骤教程

热门文章

  1. 更换mysql_3分钟学会mysql数据库的逻辑架构原理
  2. pytorch的4种边界Padding方法--ZeroPad2d、ConstantPad2d、ReflectionPad2d、ReplicationPad2d
  3. [Matlab] 无插件导入公式到 Word 中的方法:由 Matlab 导出 MathML 公式,复制到 Word 公式中
  4. 细粒度图像分类_北大提出PKU FG-XMedia:细粒度跨媒体检索数据集和评测基准
  5. Linux常用的分区方案及目录结构
  6. 微信开发者工具中导入错误 提示请选择含app.json/project.config.json的目录(纪录篇)
  7. log4j 源码解析_log4j2源码解析(2)--LoggerContext
  8. TinkPHP内核仿每推推51领啦试客系统源码
  9. xlswriter-用于Excel 2007+XLSX文件中读取数据
  10. mc服务器出生地修改,《我的世界》MC出生地太坑爹怎么办?大神教你一个指令就搞定了!...