《易学Python》——6.6 怪物出没

简介:

本节书摘来自异步社区《易学Python》一书中的第6章,第6.6节,作者[澳]Anthony Briggs,王威,袁国忠 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.6 怪物出没

至此,您创建了玩家、物品以及可捡拾的财宝。在这个冒险游戏中,还未添加的元素是意外的痛苦死亡,这也被称为危险和刺激。下面在游侠中添加一些怪物,它们在洞穴迷宫中四处游荡,受到威胁时可能攻击与它身处一个洞穴的玩家,还可能捡拾洞穴中的财宝。玩家也可攻击怪物及抢夺怪物的财宝。

6.6.1 创建怪物

咱们先想一想。您对怪物不是非常熟悉吗?下表对怪物和玩家做了比较。


screenshot

怪物和玩家看起来有很多相同之处。在基于函数的程序中,您看到这一点后将意识到需要避免重复,但在面向对象的程序中,如何处理这种问题呢?答案是创建Player的子类,这通常被称为继承。

继承相当于这样说:复制一个类并稍作修改,使其以不同的方式完成这个类的功能。在这个游戏中,怪物的行为与玩家很像,但不是由玩家告诉它接下来如何做,而由怪物自己决定。怪物也需要有名称和描述,这样玩家才能寻找它们。这意味着怪物的方法__init__和get_input将不同,但您将保留Player类的其他方面不变。程序清单6.13是新类Monster的初稿。

程序清单6.13 在游戏中添加怪物


screenshot

screenshot

至此,您编写了Monster类,它与外部世界交互的能力与玩家相同,看到的信息也与玩家相同。这很重要,其原因有几个。下面就来深入介绍这些原因及其与面向对象设计的关系。

6.6.2 一些面向对象的技巧

使用继承的第一个原因是,可将通用功能放在基类中,这减少了让程序运行需要处理的特殊情况。您不需要两个独立的游戏循环—分别用于玩家和怪物,也不需要编写类似于下面的代码:if player then: ...else if monster then: ....,相反您可以相同的方式对待玩家和 怪物。

使用继承的第二个原因是,它让程序更容易扩展;就这里而言,这相当于打造了一个接口,怪物、玩家以及您能想到的其他任何东西都可通过它来与外部世界交互。如果需要在游戏中添加第三类参与者,只需编写这类参与者特有的部分。

最后一个原因是,使用继承可极大地减少您必须编写的代码量,并让程序更容易理解得多;不管程序是不是面向对象的,更容易理解总是件好事。

需要指出的另一点是,这并非设计类的唯一方式。另一种可能更佳的方式是,创建第三个类(称之为Mobile或Actor),将玩家和怪物的通用功能都放在其中,再让玩家和怪物继承这个类。在面向对象设计中,这样的类通常被称为抽象类:您不创建其实例,而继承它并添加缺失的功能,再创建子类的实例。

注意:

面向对象术语可能令人迷惑,但见过几个示例后,您就会发现它们非常简单。只需将其与您非常熟悉的东西关联起来即可,如本章的Cave、Player和Monster类。

在这里,使用抽象类的优势并不那么明显,因为您只有两个类。然而,如果以后您发现有些功能Player类需要,而Monster类不应该有(或Monster类需要,而Player类不应该有),就可使用一个抽象类。

另一个设计要点是,到目前未知,您一直倾向于使用组合而不是继承。继承通常被称为“是一个”关系:玩家是一个参与者(actor),怪物也是。而组合是“有一个”关系:洞穴中有一个玩家,而玩家有大量物品(item)。在组合关系中,对象之间的耦合程度通常更低些:要相互交互,它们必须通过方法调用并查看对方的值;而不像继承那样自动将一个对象的方法插入到另一个对象中。在大多数情况下,都应使用组合,但在正确的情况下使用继承时,结果将大不相同。图6.3说明了本章游戏中的各种组合和继承关系。


screenshot

6.6.3 组合起来

编写好Player和Monster类后,需要对游戏处理玩家的方式做些修改。您不希望只从玩家那里获取输入——也应从怪物那里获取输入!您还希望将前面使用的函数都放在一个类中,让它们更容易正确地交互。为此,编写了程序清单6.14所示的类,您可使用它来设置游戏、创建洞穴系统以及获取输入(直到游戏结束)。

程序清单6.14 Game类

screenshot


screenshot

screenshot

您需要做的最后一项工作是,在Player类中添加一个update函数。代码检查游戏中的所有对象时,将认为玩家以及从Player派生而来的对象都需要更新:


screenshot

这个方法调用process_input,传入玩家的输入,并将返回值(一个字符串列表)存储到self.result中。您还需要给Player类添加一个name属性,因为Monster试图执行命令时,将对Player调用process_input。

如果您现在运行这个程序,将在当前洞穴中看到一个兽人(orc)。按回车键多次以模拟等待一段时间,而兽人将离开当前洞穴。如果您四处搜索,将发现兽人像无头苍蝇一样在洞穴迷宫中游荡。然而,除非您希望这个游戏像欧洲艺术剧院那样做徒劳的探索,最好再添加一些有趣的游戏元素。

相关文章
|
2月前
|
小程序 程序员
程序员的浪漫之——情侣日常小程序
程序员的浪漫之——情侣日常小程序
69 0
|
9月前
|
决策智能
博弈论第十八集总结(“最后通牒和讨价还价”的观后感)
博弈论第十八集总结(“最后通牒和讨价还价”的观后感)
124 0
|
11月前
|
数据安全/隐私保护 开发者
全能的上帝可以造出它举不起来的石头
全能的上帝可以造出它举不起来的石头
50 0
|
数据安全/隐私保护 图形学 Windows
推荐五款宝藏软件,身为宝藏男孩和宝藏女孩的你,不试一下吗?
今天带来五款宝藏软件,身为宝藏男孩和宝藏女孩的你们,不试一下吗?
151 0
推荐五款宝藏软件,身为宝藏男孩和宝藏女孩的你,不试一下吗?
|
存储 人工智能 自然语言处理
ChatGPT 大智近妖,从宇宙人生到手搓光刻机,从哄女朋友到写年终总结我们聊得非常开心,反而让人越来越忧心
都说 ChatGPT 要干掉程序员,清理搜索引擎,取代 Stack Overflow,还能消灭人类,这些有些言过其实了。ChatGPT 的定位是一个人工智能助理,它说,它的主要目的是通过回答用户的问题,为用户提供帮助。在体验了一天后,我相信对它的调教是成为一个正直的人,它也是这样做的。 它谦虚有礼,无疑是一个合格的助理,确实可以为我们提供很大的帮助。生成的回答条理清晰,思路明确,令人信服。但是从刚接触的惊奇开心过后,随着时间推移,我却越来越忧心了。 以下的内容是我的体验过程和其中的思考,其中引用的部分为 ChatGPT 的回答内容。希望对你了解它有一些帮助。
295 1
ChatGPT 大智近妖,从宇宙人生到手搓光刻机,从哄女朋友到写年终总结我们聊得非常开心,反而让人越来越忧心
|
程序员
七夕来临,程序员该如何花式表白?html+css实现简单七夕表白
文章目录 1 效果展示 2 源码及环境 3 浅谈七夕 3.1 七夕由来 3.2 七夕风俗
七夕来临,程序员该如何花式表白?html+css实现简单七夕表白
|
数据采集 存储 JSON
我居然帮初恋用Python去追她男神,这波舔狗真的坐实了啊~
我居然帮初恋用Python去追她男神,这波舔狗真的坐实了啊~
123 0
|
编解码 搜索推荐
什么叫顶流显示器,外星人今天给我好好上了一课
什么叫顶流显示器,外星人今天给我好好上了一课
320 0
什么叫顶流显示器,外星人今天给我好好上了一课