# 9.练习:生成代码 *到目前为止,我们的冒险游戏有10个对象。每个对象由有5 个属性组成。一个真正的文本冒险可能有数百个甚至数千个对象,并且每个对象的属性数量也可能增加(请参阅下一章)。在目前的形式下,维护如此庞大的对象和属性列表将很困难。* 例如,当我们在添加对象 *wallField* 和 *wallCave* 时,我们必须在三个不同的位置执行此操作:一次在 *object.h* 中(作为*#define*),两次在 *object.c* 中(数组 *objs* 中的一个元素,以及一个单独的标签数组)。这显然十分笨拙并且容易出错。 我们将不再手工维护object. h和object. c,而是从更适合我们需要的单一源开始生成文件。这个新的源文件可以用你喜欢的任何语言( 典型的是某些特定领域的语言 ),只要你有工具把它转换回C。下面是一个简单的例子,考虑下列布局来组织我们的对象: ```txt /* Raw C code (declarations) */ - ObjectName AttributeName AttributeValue AttributeName AttributeValue ... - ObjectName AttributeName AttributeValue AttributeName AttributeValue ... - ... ``` 根据到目前为止收集的对象,我们可以构造以下源文件。文件名并不重要;我只是简单地将其命名为*object.txt*,以明确它与*object.h*和*object.c*相关。 # object.txt ```txt #include #include "object.h" typedef struct object { const char *description; const char **tags; struct object *location; struct object *destination; } OBJECT; extern OBJECT objs[]; //对象 - field description "an open field" tags "field" - cave description "a little cave" tags "cave" - silver description "a silver coin" tags "silver", "coin", "silver coin" location field - gold description "a gold coin" tags "gold", "coin", "gold coin" location cave - guard description "a burly guard" tags "guard", "burly guard" location field - player description "yourself" tags "yourself" location field - intoCave description "a cave entrance to the east" tags "east", "entrance" location field destination cave - exitCave description "an exit to the west" tags "west", "exit" location cave destination field - wallField description "dense forest all around" tags "west", "north", "south", "forest" location field - wallCave description "solid rock all around" tags "east", "north", "south", "rock" location cave ``` 思考题:你能否自己用C来实现这段伪代码?