style: html to md syntax
This commit is contained in:
@@ -1,17 +1,17 @@
|
||||
# 4.创建对象
|
||||
|
||||
<em>在我们继续之前,我</em><em>们</em><em>在这里使用的是</em><em>[哲学意义上](https://en.wikipedia.org/wiki/Object_(philosophy))</em><em>的“对象”一词。它与</em><em>[面向对象编程](https://en.wikipedia.org/wiki/Object-oriented_programming)</em><em>无关,也与</em><em>Java</em><em>,</em><em>C#</em><em>和</em><em>Python</em><em>等编程语言中预定义的“对象”类型没有任何共同之处。下面,我将定义一个名为 object 的</em><em>结构体。</em>
|
||||
*在我们继续之前,我们在这里使用的是[哲学意义上](https://en.wikipedia.org/wiki/Object_(philosophy))的“对象”一词。它与[面向对象编程](https://en.wikipedia.org/wiki/Object-oriented_programming)无关,也与Java,C#和Python等编程语言中预定义的“对象”类型没有任何共同之处。下面,我将定义一个名为 object 的结构体。*
|
||||
|
||||
冒险游戏中的大多数谜题都围绕着<strong>物品</strong>。例子:
|
||||
冒险游戏中的大多数谜题都围绕着**物品**。例子:
|
||||
|
||||
- 必须找到一把钥匙,然后用来解锁某扇门。
|
||||
- 必须杀死守卫或者诱骗守卫才能开启房间
|
||||
|
||||
所以,为了表示这个物品,我们可以使用如下[结构](http://en.wikipedia.org/wiki/Struct_(C_programming_language)):
|
||||
|
||||
- <strong>description: </strong><strong>对物品的描述</strong>
|
||||
- <strong>tag: </strong><strong>物品的类型</strong>
|
||||
- <strong>location: </strong><strong>物品所在</strong><strong>的位置。这是</strong><strong>对应</strong><strong>上一章中定义的</strong><strong>物品</strong><strong>位置</strong><strong>的指针。</strong>
|
||||
- **description: ****对物品的描述**
|
||||
- **tag: ****物品的类型**
|
||||
- **location: ****物品所在****的位置。这是****对应****上一章中定义的****物品****位置****的指针。**
|
||||
|
||||
```c
|
||||
struct object {
|
||||
@@ -87,30 +87,30 @@ for (obj = objs; obj < objs + 5; obj++)
|
||||
|
||||
那么,我们有合并这个物品(或地点)列表有什么好处呢?答案是这会让我们的代码变得更加简单,因为许多函数(如上面的函数通过这样的列表)只需要扫描单个列表就可以实现,而不是三个列表。有人可能会说没必要,因为每个命令仅适用于一种类型的对象:
|
||||
|
||||
- 命令 <em>go</em> 适用于位置对象。
|
||||
- 命令 <em>get</em> 应用于获得物品。
|
||||
- 命令 *go* 适用于位置对象。
|
||||
- 命令 *get* 应用于获得物品。
|
||||
- 命令 kill 适应用于杀死人物。
|
||||
|
||||
但这种方法不太对劲,原因有三:
|
||||
|
||||
1. 某些命令适用于多种类型的对象,尤其是<em>检查</em>。
|
||||
1. 某些命令适用于多种类型的对象,尤其是*检查*。
|
||||
2. 有时候会出现很没意思的交互方式,比如说你要吃掉守卫,他说不行。
|
||||
3. 某些对象在游戏中可能具有多个角色。比如说队友系统,NPC 可以是你的物品也可以是对象
|
||||
|
||||
将所有对象放在一个大列表中,很容易添加一个名为“type”的属性来<em>构造对象</em>,以帮助我们区分不同类型的对象。
|
||||
将所有对象放在一个大列表中,很容易添加一个名为“type”的属性来*构造对象*,以帮助我们区分不同类型的对象。
|
||||
|
||||
::: warning 🤔 怎么做怎么遍历呢?先思考吧
|
||||
:::
|
||||
|
||||
但是,对象通常具有同样有效的其他特征:
|
||||
|
||||
- <strong>Locations:通过</strong><strong>道路</strong><strong>连接(将在后面介绍)。如果一个物体无法通过一条通道到达,那么它就不是一个位置。就是这么简单。</strong>
|
||||
- <strong>Items:玩家唯一可以捡起的物品;</strong><strong>可以给他们整一个重量的属性</strong>
|
||||
- <strong>Actors:玩家唯一可以与之交谈,交易,战斗的对象;当然,前提是他们还活着!</strong><strong>可以加一个 HP 属性</strong>
|
||||
- **Locations:通过****道路****连接(将在后面介绍)。如果一个物体无法通过一条通道到达,那么它就不是一个位置。就是这么简单。**
|
||||
- **Items:玩家唯一可以捡起的物品;****可以给他们整一个重量的属性**
|
||||
- **Actors:玩家唯一可以与之交谈,交易,战斗的对象;当然,前提是他们还活着!****可以加一个 HP 属性**
|
||||
|
||||
我们还要向数组中添加一个对象:玩家自己。
|
||||
|
||||
在上一章中,有一个单独的变量 <em>locationOfPlayer</em>。我们将删除它,然后换上用户的位置属性取代他!
|
||||
在上一章中,有一个单独的变量 *locationOfPlayer*。我们将删除它,然后换上用户的位置属性取代他!
|
||||
|
||||
例如,此语句会将玩家移入洞穴:
|
||||
|
||||
@@ -163,7 +163,7 @@ OBJECT objs[] = {
|
||||
};
|
||||
```
|
||||
|
||||
<strong>注意:</strong>要编译此模块,编译器<em>必须</em>支持 Constant folding。这排除了一些更原始的编译器,如 [Z88DK](http://en.wikipedia.org/wiki/Z88DK)。
|
||||
**注意:**要编译此模块,编译器*必须*支持 Constant folding。这排除了一些更原始的编译器,如 [Z88DK](http://en.wikipedia.org/wiki/Z88DK)。
|
||||
|
||||
以下模块将帮助我们找到与指定名词匹配的对象。
|
||||
|
||||
@@ -173,7 +173,7 @@ OBJECT objs[] = {
|
||||
extern OBJECT *getVisible(const char *intention, const char *noun);
|
||||
```
|
||||
|
||||
::: warning <font size=5><strong>🤔 指针?函数?希望你已经掌握这是什么了</strong></font>
|
||||
::: warning <font size=5>**🤔 指针?函数?希望你已经掌握这是什么了**</font>
|
||||
:::
|
||||
|
||||
## noun.c
|
||||
@@ -232,7 +232,7 @@ OBJECT *getVisible(const char *intention, const char *noun)
|
||||
}
|
||||
```
|
||||
|
||||
这是另一个辅助程序的函数。它打印存在于特定位置的对象(物品,NPC)的列表。它将用于函数 <em>executeLook</em>,在下一章中,我们将介绍另一个需要它的命令。
|
||||
这是另一个辅助程序的函数。它打印存在于特定位置的对象(物品,NPC)的列表。它将用于函数 *executeLook*,在下一章中,我们将介绍另一个需要它的命令。
|
||||
|
||||
## misc.h
|
||||
|
||||
@@ -268,7 +268,7 @@ int listObjectsAtLocation(OBJECT *location)
|
||||
}
|
||||
```
|
||||
|
||||
在 <em>location.c</em> 中,命令环<em>顾四周的实现</em>,并根据新的数据结构进行调整。旧的位置数组被删除,变量 <em>locationOfPlayer</em> 也是如此。
|
||||
在 *location.c* 中,命令环*顾四周的实现*,并根据新的数据结构进行调整。旧的位置数组被删除,变量 *locationOfPlayer* 也是如此。
|
||||
|
||||
## location.h
|
||||
|
||||
@@ -302,7 +302,7 @@ void executeLook(const char *noun)
|
||||
|
||||
void executeGo(const char *noun)
|
||||
{
|
||||
//消除了函数<em>executeGo</em>中的循环,代码更优雅了~
|
||||
//消除了函数*executeGo*中的循环,代码更优雅了~
|
||||
OBJECT *obj = getVisible("where you want to go", noun);
|
||||
if (obj == NULL)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user