update
many, many chore
This commit is contained in:
@@ -4,11 +4,11 @@
|
||||
|
||||
在黑暗中的效果因游戏而异。通常情况下,它使命令 "look "没有效果。在一些游戏中(如 Zork),黑暗是致命的。在其他游戏中,只要你画出了黑暗区域的详细地图,在没有光源的情况下,你仍然可以取得进展。
|
||||
|
||||
我们的游戏将保持在这两者之间;在黑暗中不会让你被杀,但你也不能进入任何通道(具有光亮的通道将是一个例外)。对我们来说,让玩家跑进一个黑暗的区域,而没有不让他机会回到他来的地方,似乎是不公平的。
|
||||
我们的游戏将保持在这两者之间;在黑暗中不会让你被杀,但你也不能进入任何通道 (具有光亮的通道将是一个例外)。对我们来说,让玩家跑进一个黑暗的区域,而没有不让他机会回到他来的地方,似乎是不公平的。
|
||||
|
||||
好吧,所以首先,我们来设计在黑暗中玩家无法看到周围环境。
|
||||
|
||||
# location.c
|
||||
## location.c
|
||||
|
||||
```c
|
||||
#include <stdbool.h>
|
||||
@@ -90,7 +90,7 @@ bool executeGo(void)
|
||||
|
||||
其次,在黑暗中玩家无法看到或使用附近的物体。
|
||||
|
||||
# noun.c
|
||||
## noun.c
|
||||
|
||||
```c
|
||||
#include <stdbool.h>
|
||||
@@ -193,7 +193,7 @@ OBJECT *getPossession(OBJECT *from, const char *verb, const char *noun)
|
||||
|
||||
在这两种情况下,我们都使用了一个函数 isLit。它在 misc.c 中被定义(并且使用量增多了)。
|
||||
|
||||
# misc.h
|
||||
## misc.h
|
||||
|
||||
```c
|
||||
typedef enum {
|
||||
@@ -216,7 +216,7 @@ extern OBJECT *actorHere(void);
|
||||
extern int listObjectsAtLocation(OBJECT *location);
|
||||
```
|
||||
|
||||
# misc.c
|
||||
## misc.c
|
||||
|
||||
```c
|
||||
#include <stdbool.h>
|
||||
@@ -318,6 +318,7 @@ int listObjectsAtLocation(OBJECT *location)
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
```
|
||||
|
||||
注意:
|
||||
@@ -326,13 +327,14 @@ int listObjectsAtLocation(OBJECT *location)
|
||||
- isNoticeable 函数相比 isLit 更进一步。它对每个物体都有效,而不仅仅是地点和灯。它还考虑到玩家库存中的物体总是可以被使用,即使是在黑暗中。
|
||||
- 第 60 行:附近的物体仍然隐藏在黑暗中,被视为'不在这里'。这自然可以防止游戏泄露玩家不应该知道的物体的信息。
|
||||
|
||||
思考题:你还能想到那哪些可以改进的地方吗?
|
||||
::: warning 🤔 思考题:你还能想到那哪些可以改进的地方吗?
|
||||
:::
|
||||
|
||||
我们为实现 isLit 函数的功能从而使用了一个新的属性 light。
|
||||
|
||||
# object.awk
|
||||
## object.awk
|
||||
|
||||
```
|
||||
```awk
|
||||
BEGIN {
|
||||
count = 0;
|
||||
obj = "";
|
||||
@@ -428,11 +430,11 @@ function outputRecord(separator)
|
||||
}
|
||||
```
|
||||
|
||||
默认情况下,亮度为零意味着一个物体不发光。在大白天的每一个地点(通常是除了地下的所有地点)都会被赋予一个正(大于 0)的光线值。其实是什么值并不重要,只要它不是零就可以了。我们还将添加一盏灯,玩家可以携带它来穿越黑暗区域。
|
||||
默认情况下,亮度为零意味着一个物体不发光。在大白天的每一个地点(通常是除了地下的所有地点)都会被赋予一个正 (大于 0) 的光线值。其实是什么值并不重要,只要它不是零就可以了。我们还将添加一盏灯,玩家可以携带它来穿越黑暗区域。
|
||||
|
||||
# object.txt
|
||||
## object.txt
|
||||
|
||||
```
|
||||
```txt
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include "object.h"
|
||||
@@ -658,7 +660,7 @@ extern OBJECT objs[];
|
||||
|
||||
我们将添加一些命令,我们可以用来打开和关闭灯。
|
||||
|
||||
# parsexec.c
|
||||
## parsexec.c
|
||||
|
||||
```c
|
||||
#include <ctype.h>
|
||||
@@ -733,14 +735,14 @@ bool parseAndExecute(const char *input)
|
||||
|
||||
下面是这些命令的实现。
|
||||
|
||||
# onoff.h
|
||||
## onoff.h
|
||||
|
||||
```c
|
||||
extern bool executeTurnOn(void);
|
||||
extern bool executeTurnOff(void);
|
||||
```
|
||||
|
||||
# onoff.c
|
||||
## onoff.c
|
||||
|
||||
```c
|
||||
#include <stdbool.h>
|
||||
@@ -789,7 +791,7 @@ bool executeTurnOff(void)
|
||||
|
||||
为了打开和关闭灯,我们将使用我们用来打开和关闭门和盒子的相同技巧(见第 13 章)。
|
||||
|
||||
# toggle.h
|
||||
## toggle.h
|
||||
|
||||
```c
|
||||
extern void cannotBeOpened(void);
|
||||
@@ -813,7 +815,7 @@ extern void toggleBoxLock(void);
|
||||
extern void toggleLamp(void);
|
||||
```
|
||||
|
||||
# toggle.c
|
||||
## toggle.c
|
||||
|
||||
```c
|
||||
#include <stdbool.h>
|
||||
@@ -895,9 +897,9 @@ void toggleLamp(void)
|
||||
|
||||
最后,我们将在我们生成的地图上标记出黑暗的位置。
|
||||
|
||||
# map.awk
|
||||
## map.awk
|
||||
|
||||
```c
|
||||
```awk
|
||||
BEGIN { print "digraph map {\n\tnode [style=filled]"; }
|
||||
/^- / { outputEdges(); obj = $2; delete a; }
|
||||
/^[ \t]/ { a[$1] = $2; }
|
||||
@@ -929,9 +931,10 @@ function outputNodes()
|
||||
}
|
||||
```
|
||||
|
||||
思考题:尝试将上面的伪代码用 C 语言实现其功能
|
||||
::: warning 🤔 思考题:尝试将上面的伪代码用 C 语言实现其功能
|
||||
:::
|
||||
|
||||
玩家们,请注意不要把灯关掉,也不要把它丢掉。如果这样做,那么在黑暗中你将永远无法找回它。换言之,你会被困在黑暗之中! 幸运的是,下一章将提供一个撤销笨拙行动的方法。
|
||||
玩家们,请注意不要把灯关掉,也不要把它丢掉。如果这样做,那么在黑暗中你将永远无法找回它。换言之,你会被困在黑暗之中!幸运的是,下一章将提供一个撤销笨拙行动的方法。
|
||||
|
||||
输出样例:Welcome to Little Cave Adventure.
|
||||
You are in an open field.
|
||||
|
||||
Reference in New Issue
Block a user