update
chore: add 3.4.6.2 chore: add 3.4.6.3 chore: add 3.4.6.4 chore: add 3.4.6.5 chore: add 3.4.6.6 chore: add 3.4.6.7 chore: add 3.4.6.8 chore: add 3.4.6.9 chore: add 3.4.6.10 docs: add 3.6.5.1
This commit is contained in:
@@ -14,12 +14,12 @@
|
||||
|
||||
假设我们的洞口被警卫挡住了。玩家就过不去,我们可以简单地将通道的<em>目的地</em>更改为终点位置(或 <em>NULL</em>),但这会导致对<em>诸如 go cave 和 look cave</em> 这样的命令做出不正确的回应:“你在这里看不到任何洞穴。我们需要一个将通道的实际终点和虚假终点分开的单独属性。为此,我们将引入一个属性 prospect 来表示后者。
|
||||
|
||||
1. 在许多冒险中,玩家以及游戏中的 NPC 在携带量方面受到限制。给每件物品一个重量,角色库存中所有物品的总重量不应超过该角色所能承载的最大重量。当然,我们也可以给一个物体一个非常高的重量,使它不可移动(一棵树,一座房子,一座山)。
|
||||
2. RPG 式的冒险游戏需要角色的整个属性范围( 玩家与非玩家 ),例如 HP。HP 为零的对象要么死了,要么根本不是角色。
|
||||
1. 在许多冒险中,玩家以及游戏中的 NPC 在携带量方面受到限制。给每件物品一个重量,角色库存中所有物品的总重量不应超过该角色所能承载的最大重量。当然,我们也可以给一个物体一个非常高的重量,使它不可移动(一棵树,一座房子,一座山)。
|
||||
2. RPG 式的冒险游戏需要角色的整个属性范围 ( 玩家与非玩家 ),例如 HP。HP 为零的对象要么死了,要么根本不是角色。
|
||||
|
||||
我们在 object.txt 中定义了七个新属性:
|
||||
|
||||
```
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include "object.h"
|
||||
|
||||
@@ -115,13 +115,14 @@ extern OBJECT objs[];
|
||||
textGo "Solid rock is blocking the way."
|
||||
```
|
||||
|
||||
注意:textGo 不仅对通道对象有用,而且对非通道对象也有用( 在这种情况下,以后我们将介绍“墙”这个概念)
|
||||
注意:textGo 不仅对通道对象有用,而且对非通道对象也有用 ( 在这种情况下,以后我们将介绍“墙”这个概念)
|
||||
|
||||
思考题:你能否自行实现上述伪代码?
|
||||
::: warning 🤔 思考题:你能否自行实现上述伪代码?
|
||||
:::
|
||||
|
||||
现在,我们已经可以使用新属性(如果你完成了上面的思考题),<strong>details</strong> 用于新识别的命令<em>外观`<object>`</em>,<strong>textGo</strong> 在我们的命令 <em>go</em> 实现中替换固定文本<em>“OK</em>”。
|
||||
现在,我们已经可以使用新属性 (如果你完成了上面的思考题),<strong>details</strong> 用于新识别的命令<em>外观`<object>`</em>,<strong>textGo</strong> 在我们的命令 <em>go</em> 实现中替换固定文本<em>“OK</em>”。
|
||||
|
||||
# location.c
|
||||
## location.c
|
||||
|
||||
```c
|
||||
#include <stdbool.h>
|
||||
@@ -195,7 +196,7 @@ void executeGo(const char *noun)
|
||||
|
||||
属性权重和容量一起成为不能将某些对象移动到周围的可能原因。而 HP 检查代替了角色的硬编码白名单。
|
||||
|
||||
# move.c
|
||||
## move.c
|
||||
|
||||
```c
|
||||
#include <stdbool.h>
|
||||
@@ -264,7 +265,7 @@ void moveObject(OBJECT *obj, OBJECT *to)
|
||||
|
||||
这里还有一个模块可以使用 HP 来识别角色。
|
||||
|
||||
# inventory.c
|
||||
## inventory.c
|
||||
|
||||
```c
|
||||
#include <stdbool.h>
|
||||
@@ -327,7 +328,8 @@ void executeInventory(void)
|
||||
}
|
||||
```
|
||||
|
||||
思考题:仔细观察这段代码,看看与你写的有何不同?
|
||||
::: warning 🤔 思考题:仔细观察这段代码,看看与你写的有何不同?
|
||||
:::
|
||||
|
||||
权重检查利用了新功能 <em>weightOfContents,</em>它将在<em>misc.c</em>中实现。在同一模块中,我们还对一些现有函数进行了修改,以支持最后几个属性。
|
||||
|
||||
@@ -335,7 +337,7 @@ void executeInventory(void)
|
||||
|
||||
在函数 <em>getPassage</em> 中我们将属性<em>目标</em>替换为 prospect,并改进<em>对所有</em>命令(而不仅仅是 <em>go</em> and <em>look</em>)的响应,这些命令应用于位于“隐藏通道”另一端的位置。
|
||||
|
||||
# misc.h
|
||||
## misc.h
|
||||
|
||||
```c
|
||||
typedef enum {
|
||||
@@ -357,7 +359,7 @@ extern OBJECT *actorHere(void);
|
||||
extern int listObjectsAtLocation(OBJECT *location);
|
||||
```
|
||||
|
||||
# misc.c
|
||||
## misc.c
|
||||
|
||||
```c
|
||||
#include <stdbool.h>
|
||||
@@ -432,11 +434,11 @@ int listObjectsAtLocation(OBJECT *location)
|
||||
}
|
||||
```
|
||||
|
||||
思考题:为什么上面的 getPassage 函数使用了函数指针这种语法?
|
||||
::: warning 🤔 思考题:
|
||||
为什么上面的 getPassage 函数使用了函数指针这种语法?
|
||||
|
||||
```
|
||||
函数指针和指针函数有什么区别?
|
||||
```
|
||||
函数指针和指针函数有什么区别?
|
||||
:::
|
||||
|
||||
为了使整个画面完整,最好扩展前面生成的地图,我们可以用虚线表示“明显”的通道。
|
||||
|
||||
@@ -462,7 +464,7 @@ function outputEdge(from, to, style)
|
||||
|
||||
- 尽量不要太担心浪费仅在某些类型的对象中使用的属性上的内存空间(例如,<em>textGo</em>仅用于通道),或者许多重复的字符串文本。
|
||||
- 为了演示属性 prospect 的使用,我们使洞穴无法访问。当您查看新<em>地图时,</em>这一点立即变得很明显。进入洞穴的箭头是虚线的,这意味着这是一个虚假的通道,但不是实际的通道。请放心,洞穴将在下一章重新开放。
|
||||
- 请注意,更详细的描述往往需要一个更大的字典(更多的对象,更多的标签)。例如,命令 look silver coin 现在返回 "该硬币的正面有一只鹰"。玩家通过输入一个命令 look eagle 来查看银币,但程序并不知道鹰是什么意思(显然这样子是不行的)。
|
||||
- 请注意,更详细的描述往往需要一个更大的字典(更多的对象,更多的标签)。例如,命令 look silver coin 现在返回 "该硬币的正面有一只鹰"。玩家通过输入一个命令 look eagle 来查看银币,但程序并不知道鹰是什么意思 (显然这样子是不行的)。
|
||||
|
||||
输出样例
|
||||
|
||||
|
||||
Reference in New Issue
Block a user