如何用C++实现旷野之息中的武器

拥有Switch的同学相信都玩过塞尔达·旷野之息这个神作,还记得骑上你心爱的小摩托在海拉鲁大陆上驰骋的日子么?那么你想知道旷野之息中大师剑这些武器的攻击力和耐久度都是怎么实现的么?

4月8日的开课吧《HelloWorld公开课》,晓沐老师为我们带来了,如何用C++来实现旷野之息中的武器攻击力和耐久度,话不多说,让我们跟着晓沐老师去看看吧。

常见数据结构

在实现林克大魔王的武器前,晓沐老师先带我们复习了数组,队列、栈等几个常见的数据结构,这里我们挑两个重要的在复习下。

这是哈希表的数据结构图,它的时间复杂度为O(1),每个keys通过哈希函数转换映射到每一个buckets,当有两个keys映射同一个buckets时,通过串联在buckets中的链表来查询相关的数据。

下面这个数据结构乍一看可能像是树,但其实它是堆,红色箭头代表交换,我们都知道,堆分为大顶堆和小顶堆,大顶堆可以快速筛选出最大的数据元素,小顶堆则是可以筛选出最小的数据元素。

常见模板库与迭代器

工欲善其事必先利其器,C++中的STL已经帮我们封装好了许多常用的模板库与迭代器,这些也是后面我们实现旷野之息中武器必不可少的工具。

标准模板库

vector数列

stack栈

queue队列

list链表

set集合(红黑树)

map映射(红黑树)

unordered_set无序集合(哈希表)

unorderer_map无序映射(哈希表)

priority_queue优先队列/堆(vector/deque)

STL迭代器

容器类名::iterator

容器类名::const_iterator

容器类名::reverse_iterator

容器类名::const_reverse_iterator

实战演练

我们先来分析一下林克大魔王的角色属性和装备,林克游戏背包中,剑的最大容量为n,每把剑有如下五个属性:分别是物品id,物品名称,物品图标,攻击力,耐久度。

游戏背包中,盾的最大容量为n,每个盾牌有如下五个属性:物品id,物品名称,物品图标,防御力,耐久度。

我们的主角林克(Link)在海拉鲁大地上与怪物殊死搏斗:他的初始背包里没有任何装备,他可以将地上的装备捡起放入背包每把剑在挥砍后,耐久度会降低,耐久度为0时武器消失,他在打怪时每次只使用攻击力最强的剑。

以上是项目背景与功能需求,下面开始实现,我们先写一个基类Weapon,然后定义武器的名字、属性和耐久度,从下面的代码我们可以单出来,durability代表武器的耐久度,这是一个耐久度为5的武器。然后再写一个broken函数来判断武器耐久度。

当武器耐久度小于等于0代表武器损坏,broken函数返回true,每个武器有use使用的属性,每使用一次耐久度减一,在代码中我们可以看到durability--

接下来定义武器的数据库,从下面代码可以看到,这是一个剑的数据库,map里存了这个剑的所有属性的参数值。同理我们也可以写一个盾牌的数据库。

一切准备就绪,现在我们把上面的代码运行一下,看会返回什么结果,从下面打印输出的信息可以看到,我们的主角林克大魔王捡了一把耐久度为5,攻击力25的卓拉之剑,然后他攻击了一下,卓拉之剑耐久度减一变成了4。

看到这可能有同学会问,这也就实现了武器的耐久功能,背包功能,每次使用最强武器这些功能要怎么实现呢?

不要着急,如果有同学想了解完整的项目实现过程以及代码分析,可以点击实战详解C++中的数据结构观看公开课的回放视频!在课上,晓沐老师会带领大家一步一步实现上面所有的功能。

同时,如果有同学想要晓沐老师本次塞尔达旷野之息项目源代码的,记得点击下方图片

讲师介绍

晓沐老师,BAT某厂人工智能研究院CV算法工程师,北京航空航天大学智能信息处理方向硕士,主要研究方向是物体检测、语义分割、三维重建等,具有丰富的移动端C++算法落地经验;同时具备多年授课经历,有丰富的技术研讨和教学经验。

《Hello,World公开课》是由开课吧推出的面向广大开发工程师的免费加餐课,集结业内名师大咖,聚焦热门技术和实战解决方案,以专业知识分享交流为桥梁,链接正在创造世界的一群科技主力们,向初心致敬,为技术发烧。无论你是初入职场的应届生,还是准备升职加薪的职场精英,相信这里都有你需要的养料。

(0)

相关推荐