Question 1. What are the four parts of a structure definition?
The keyword struct, the structure tag (optional), the brace-enclosed list of member declarations (optional), and a list of variables of this structure type to be declared (optional).
Exercise 2. Add a ``help'' command.
Here is the code I added to the big if/else chain in commands.c:
else if(strcmp(verb, "help") == 0)
{
printf("Here are some useful commands:\n");
printf("n, north\tgo north\n");
printf("s, south\tgo south\n");
printf("e, east\t\tgo east\n");
printf("w, west\t\tgo west\n");
printf("look\t\tdescribe current room\n");
printf("examine obj\tdescribe an object\n");
printf("take obj\tpick up an object\n");
printf("drop obj\tdrop an object\n");
printf("i, inventory\tlist your current possessions\n");
printf("There may be other commands, too!\n");
}
(This help text also contains a description
of the new ``examine'' command, below.)
Exercise 3. Add a ``long description'' field to the object and room structures.
I added the line
char *desc;at the end of the definition of struct object in game.h, and also at the end of struct room. I modified the initializations of the objects and rooms arrays in main.c to give most of the objects and rooms descriptions:
static struct object objects[] =
{
/* [0] */ {"bed", NULL, "It is an old, four-poster bed with a lace coverlet."},
/* [1] */ {"diamond", NULL,
"The diamond twinkles majestically as you hold it in the light."},
/* [2] */ {"kettle", NULL,
"It is a dented old kettle. You're not sure it would even hold water."},
/* [3] */ {"hammer", NULL},
/* [4] */ {"pliers", &objects[3]},
/* [5] */ {"doormat", NULL, "It says, \"Welcome\", in big, friendly letters."},
/* [6] */ {"pick", NULL, "It is an old miner's pick."},
/* [7] */ {"shovel", &objects[6]},
};
static struct room rooms[] =
{
/* [0] */ {"field", NULL, {&rooms[1], NULL, NULL, NULL},
"You are in an open field, with a house to the north."},
/* [1] */ {"house", NULL, {&rooms[2], &rooms[0], NULL, NULL},
"You are standing just to the south of a plain, white house."},
/* [2] */ {"entry", NULL, {&rooms[3], &rooms[2], &rooms[5], NULL},
"You are in the entryway of the house.\n\
A hall leads north, and there are doors to the south and east."},
/* [3] */ {"hall", NULL, {&rooms[6], &rooms[2], NULL, &rooms[4]},
"You are in a north-south hallway, with a door to the west."},
/* [4] */ {"bedroom", &objects[0], {NULL, NULL, &rooms[3], NULL},
"You are in what looks like a bedroom. The exit is to the east."},
/* [5] */ {"closet", &objects[1], {NULL, NULL, NULL, &rooms[2]}},
/* [6] */ {"kitchen", &objects[2], {&rooms[9], &rooms[3], &rooms[7], NULL},
"You are in the kitchen of the house.\n\
Doorways lead north and south, and there is a stairwell to the east."},
/* [7] */ {"stairway", NULL, {NULL, NULL, &rooms[6], &rooms[8]},
"You are in a stairway twisting down beneath the kitchen."},
/* [8] */ {"basement", &objects[4], {NULL, NULL, &rooms[7], &rooms[10]},
"You are in a dank basement. There is a stairway to the east.\n\
It looks like someone has been digging at the west end!"},
/* [9] */ {"porch", &objects[5], {NULL, &rooms[6], NULL, NULL},
"You are on the back porth of the house.\n"
"There is a doorway to the south."},
/* [10] */ {"tunnel", &objects[7], {NULL, NULL, &rooms[8], NULL},
"You are in a low east-west tunnel, recently dug.\n"
"The earth seems soft; you wonder how safe the ceiling is."},
};
(Initializing long descriptions in this way is not convenient,
because the strings are, well, too long.
I even embedded \n within some of the strings,
to make them print on several lines,
and I continued some of them over two lines in the source code,
just to make them fit on the page.
You will notice that there are two ways of doing this:
The descriptions of the entry, kitchen, and basement
are extended onto the next line
using \ as a continuation character.
The descriptions of the porch and tunnel are split into two strings,
on two separate lines but with no comma or other punctuation between them;
this means that the strings are automatically spliced together at compile time,
to form the equivalent of a single string.
But if you don't use either of these methods,
if you break a string constant across two lines
without using \ or splitting it into two strings to be concatenated,
the compiler complains.)
I added this code to the big if/else chain in commands.c, to implement an ``examine'' command:
else if(strcmp(verb, "examine") == 0)
{
if(object == NULL)
{
printf("You must tell me what to examine.\n");
return FALSE;
}
objp = findobject(player, object);
if(objp == NULL)
{
printf("I see no %s here.\n", object);
return FALSE;
}
if(objp->desc == NULL || *objp->desc == '\0')
printf("You see nothing special about the %s.\n", object);
else printf("%s\n", objp->desc);
}
Finally, I rewrote the listroom function in
rooms.c to look like this:
void
listroom(struct actor *actor)
{
struct room *roomp = actor->location;
if(roomp == NULL)
{
printf("Where are you?\n");
return;
}
printf("%s\n", roomp->name);
if(roomp->desc != NULL && *roomp->desc != '\0')
printf("%s\n", roomp->desc);
if(roomp->contents != NULL)
{
printf("room contains:\n");
listobjects(roomp->contents);
}
}
This page by Steve Summit // Copyright 1995-9 // mail feedback