购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.1 案例:Battleship

下面我们会用一个小案例来引出一等函数:这个例子是你在编写战舰类游戏时可能需要实现的一个核心函数。我们把将要看到的问题归结为,判断一个给定的点是否在射程范围内,并且距离友方船舶和我们自身都不太近。

首先,你可能会写一个很简单的函数来检验一个点是否在范围内。为了简明易懂,我们假定我们的船位于原点。这样一来,我们就可以将想要描述的区域形象化,如图1.1所示。

图1.1 位于原点的船舶射程范围内的点

首先,我们定义两种类型 ——Distance Position

然后我们在 Position 中添加一个函数 inRange(_:) ,用于检验一个点是否在图1.1中的灰色区域里。使用一些基础的几何知识,我们可以像下面这样定义这个函数:

如果假设我们总是位于原点,那么现在这样就可以正常工作了。但是船舶还可能在原点以外的其他位置出现,我们可以更新一下形象化图,如图1.2所示。

图1.2 允许船有它自己的位置

考虑到这一点,我们引入一个结构体 Ship ,它有一个属性为 position

目前,姑且先忽略附加属性 unsafeRange 。后面我们会回到这个问题。

我们向结构体 Ship 中添加一个 canEngageShip(_:) 函数对其进行扩展,这个函数允许我们检验是否有另一艘船在范围内,不论我们是位于原点还是其他任何位置:

也许现在你已经意识到,我们同时还想避免目标船舶离你过近。我们可以用图1.3来说明新情况,我们想要瞄准的仅仅只有那些对我们当前位置而言在 unsafeRange (不安全范围)外的敌人:

图1.3 避免与过近的敌方船舶交战

这样一来,我们需要再一次修改代码,使 unsafeRange 属性能够发挥作用:

最后,我们还需要避免目标船舶过于靠近我方的任意一艘船。我们再一次将其形象化,见图1.4。

图1.4 避免敌方过于接近友方船舶

相应地,我们可以向 canSafelyEngageShip(_:) 函数添加另一个参数代表友好船舶位置:

随着代码的增多,它变得越来越难以维护。这个函数包含了一大段复杂的计算的代码。我们可以在 Position 中添加两个负责几何运算的辅助函数让这段代码变得清晰易懂一些:

添加了辅助函数之后,函数变成了下面这样:

现在的代码已经更易读了,但是我们还想更进一步,用一种声明式的方法来明确现有的问题。 GTo52Yd/LPzzSBxuJ1kpYgBGQL/Ufdq/M3ZNEtJ54QjaIB6+jk1jBhSa1CqnG5KW

点击中间区域
呼出菜单
上一章
目录
下一章
×