所以我正在为我的'C'编程课程制作这个基于文本的游戏。 我想在完成课程后继续学习,所以这不仅仅是一项家庭作业,我希望将其留待以后使用。
我的问题是在代码的这一部分是否有一种方法可以将用户发送回上一个问题时使用'IF'语句,这样他们可以在最终走向故事的方向之前做出多个选择?
if (door2 == 1)
{
// what happens when you touch the orb.
printf("The orb transports you to an unknown location.\n");
printf("You look around to get the lay of your area,\n");
printf("off in the distance you see a church like building.");
door2 = door2 - 1;
printf("\n");
printf("Do you go to the building? ");
scanf_s("%d", &door1);
printf("\n");
if (door1 == 1)
{
// Going up to the church.
printf("You walk up to the building, it gives you a strange feeling\n");
printf("in the pit of your stomach. You look around and see two windows\n");
printf("low enough for you to see into along with the main door.\n");
printf("Do you go to the left window? right window? or try to open the front door?\n");
scanf_s("%d", &movement);
printf("\n");
if (movement = 1)
{
// left window.
printf("You creep up to the window and peak inside...\n");
printf("You see a large figure pacing back and forth in the room\n");
printf("what ever it is spots you and darts further into the church.");
movement = movement - 1;
// i subtract the L,S,R numbers to insure there is not an infinite loop.
}
else if (movement = 2)
{
// front door.
printf("You walk up to the front door, and try to open it.\n");
printf("The door does not budge, it must be locked.");
movement = movement - 2;
}
else if (movement = 3)
{
// right window.
printf("You creep up to the window and find an empty room.\n");
movement = movement - 3;
printf("The window is cracked open somewhat... Do you try to enter the\n");
printf("church through the window? ");
scanf_s("%d", &door2);
printf("\n");
}
答案 0 :(得分:2)
实际上是的,如果你只是围绕它做一个循环,但我建议在功能中分割你的ifs。您的代码看起来会更好。
void main() {
enterTheCurch();
}
void enterTheCurch() {
printf("You've entered the Curch. There are 2 Doors. Do you want to go left or right?");
String direction;
scanf_s("%s", &direction);
if(direction == "left") {
goLeftCurchDoor();
}
else {
goRightCurchDoor();
}
}
goLeftCurchDoor() {
...
}
goRightCurchDoor() {
...
}
尝试使用此结构。像这样你也可以为函数提供参数bool alreadyVisited
,并根据这些参数更改打印。
答案 1 :(得分:2)
这可能根本不是正确的方法。游戏通常分为几个组件:主循环(无限运行),更新循环(模拟游戏世界)和过程输入功能(从用户获取输入)。
您的代码的结构方式也有很多不足之处。首先,您对用户的提示不一致。有时你似乎在问一个是或否的问题,有时你似乎想要一个没有指示给用户的移动命令。这是一场UX噩梦。相反,您可以将每个动作视为动作。例如,前进到锁着的门意味着用户想要尝试打开门。使用打开的窗口前进意味着用户想要穿过窗户。考虑到这一点,很明显,您实际上只需要跟踪一个变量。
制作游戏并不是一件容易的事情,你不能强迫自己制作一个游戏 - 它需要提前做好周到的计划。尝试在一张纸上画一个对话树。当你在纸上用完房间时,你会很快看到它失控 - 设计游戏是一项复杂的任务。在开始编码之前获得蓝图非常重要。
首先,让我们解决游戏循环的样子:
#include <stdio.h>
#include <stdbool.h> // for true and false
typedef enum { NONE = 0, LEFT, RIGHT, UP, DOWN } movement_t;
int main()
{
movement_t movement = NONE;
movement_t last_movement = NONE;
while (true)
{
int movement_input = 0;
scanf("%d", &movement_input);
movement = (movement_t) movement_input;
// ...
last_movement = movement;
}
}
现在您想知道哪种数据结构应代表您的游戏。不幸的是,这是一个复杂的主题,而且我不是游戏开发者,因此我尝试提出一种天真的方法。减少工作量的最简单方法是在输入时为每个房间提供静态消息。如果某些内容发生变化,那么一旦变量更新,您就可以反映出这种变化。
void church()
{
printf("Generic church description.");
if (some_player_did_something)
{
printf("You now spot a shiny object on the floor.");
}
}
跟踪玩家的最后一次动作(我已经在上面演示过)对于确定他们来自哪里非常有用。
if (last_movement == LEFT)
{
printf("You come in from the left and noticed something you haven't before...");
}
我会接受其他人的建议,并将你的代码分成函数(因为我确信你的导师现在已经钻进了你。)单片方法不是可行的方法。
答案 2 :(得分:0)
有一个:goto
。
label:
if (someCondition) {
goto label;
}
此代码将循环,直到someCondition
变为false。
goto
是一种无条件跳转,允许您向前或向后跳转到标签,只要您保持在同一范围内。
很多人讨厌goto
,如果你有其他更好的选择,你应该确保不要使用它。
故事讲述听起来像goto
的一个很好的用例。
循环或递归是产生此结果的其他选项,例如while
do ... while
for
。
答案 3 :(得分:0)
游戏中的每个位置都需要在表格中输入,
以及某些环境细节,例如:
面向玩家的方向
每个位置的可见项目
当前的比赛状态,
目前的库存,
&#39;下一个&#39;表格使用等。
该表非常快速地增长,并且表中每行可以有许多参数。这是真正的游戏。所有其余的只是用户操纵表格,当前条件等。
每个可能的用户输入都有一个独特的功能来处理输入(没有那么多可能的输入) 这些函数中的每一个都获得一个参数,该参数是指向位置表中的条目的指针,该参数允许该函数处理用户输入。 程序的主循环处理从用户获取输入并调度相应的inputFunction处理程序。 将有子功能来处理库存变化,显示库存,启用/禁用某些类型的操作等