C 在你提出“如果”陈述后,有没有办法回头?

C 在你提出“如果”陈述后,有没有办法回头?,c,C,因此,我正在为我的“C”编程课制作这个基于文本的游戏。 我想在课程结束后继续,所以这不仅仅是一个家庭作业,我想把它留着以后用 我的问题是在代码的这一部分中,是否有一种方法可以让用户返回到使用“如果”语句时提出的上一个问题,这样他们就可以在最终走向故事的方向之前做出多项选择 if (door2 == 1) { // what happens when you touch the orb. printf("The orb transports you to an unknown lo

因此,我正在为我的“C”编程课制作这个基于文本的游戏。 我想在课程结束后继续,所以这不仅仅是一个家庭作业,我想把它留着以后用

我的问题是在代码的这一部分中,是否有一种方法可以让用户返回到使用“如果”语句时提出的上一个问题,这样他们就可以在最终走向故事的方向之前做出多项选择

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");
        }
有一个:后藤

此代码将循环,直到某个条件变为false。 goto是一种非传统的跳转,允许您向前或向后跳转到标签,前提是您保持在相同的范围内

很多人讨厌goto,如果你有其他更好的选择,你应该确保不要使用它。 讲故事听起来像是goto的一个很好的用例

循环或递归是生成此结果的其他选项,例如whiledo。。。而对于。

有一个:转到

此代码将循环,直到某个条件变为false。 goto是一种非传统的跳转,允许您向前或向后跳转到标签,前提是您保持在相同的范围内

很多人讨厌goto,如果你有其他更好的选择,你应该确保不要使用它。 讲故事听起来像是goto的一个很好的用例


循环或递归是生成此结果的其他选项,例如whiledo。。。而对于。

事实上是的,如果你只是在这个问题上做一个循环的话,但我建议将你的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等函数提供参数,并根据这些参数更改打印

事实上是的,如果你只是在这个问题上做一个循环的话,但是我建议把你的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等函数提供参数,并根据这些参数更改打印

这可能根本不是正确的方法。游戏通常分为几个部分:一个无限运行的主循环、一个模拟游戏世界的更新循环和一个从用户处获取输入的过程输入函数

代码的结构方式也有很多不尽如人意之处。首先,您对用户的提示不一致。有时您似乎在问一个是或否的问题,有时您似乎想要一个移动命令,而不向用户显示所期望的内容。这是一场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;
    }
}
我在上面演示了跟踪玩家的最后一个动作,这对于确定他们来自哪里很有用

if (last_movement == LEFT)
{
  printf("You come in from the left and noticed something you haven't before...");
}

我会采纳其他人的建议,并将您的代码拆分为函数,因为我相信您的讲师现在已经深入了解了您。单一的方法是不可取的。

这可能根本不是正确的方法。游戏通常分为几个部分:一个无限运行的主循环、一个模拟游戏世界的更新循环和一个从用户处获取输入的过程输入函数

代码的结构方式也有很多不尽如人意之处。首先,您对用户的提示不一致。有时您似乎在问一个是或否的问题,有时您似乎想要一个移动命令,而不向用户显示所期望的内容。这是一场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;
    }
}
我在上面演示了跟踪玩家的最后一个动作,这对于确定他们来自哪里很有用

if (last_movement == LEFT)
{
  printf("You come in from the left and noticed something you haven't before...");
}

我会采纳其他人的建议,并将您的代码拆分为函数,因为我相信您的讲师现在已经深入了解了您。单一的方法不是一条路。

游戏中的每个位置都需要一个表中的条目, 以及某些环境细节,例如: 玩家面对的是哪个方向 每个位置的可见项目 当前游戏状态, 当前库存, 要使用的“下一个”表项等。 此表增长非常快,表中每行可以有许多参数。这是真正的游戏。剩下的只是用户对表、当前条件等的操作

每个可能的用户输入都有一个独特的功能来处理该输入—可能的输入并不多。 这些函数中的每一个都会获得一个参数,该参数是指向位置表中的一个条目的指针,它让该函数处理用户输入。 程序的主循环处理从用户获取输入和分派适当的inputFunction处理程序。
将有子功能来处理库存更改、显示库存、启用/禁用某些类型的操作等

游戏中的每个位置都需要一个表中的条目, 以及某些环境细节,例如: 玩家面对的是哪个方向 每个位置的可见项目 当前游戏状态, 当前库存, 要使用的“下一个”表项等。 此表增长非常快,表中每行可以有许多参数。这是真正的游戏。剩下的只是用户对表、当前条件等的操作

每个可能的用户输入都有一个独特的功能来处理该输入—可能的输入并不多。 这些函数中的每一个都会获得一个参数,该参数是指向位置表中的一个条目的指针,它让该函数处理用户输入。 程序的主循环处理从用户获取输入和分派适当的inputFunction处理程序。
将有子功能来处理库存更改、显示库存、启用/禁用某些类型的操作等

您可以将if语句放入do…while循环中,并根据需要返回!在我看来,最好的方法是将代码分解成不同的函数,并使用循环(例如for)分别调用它们。您有拼写错误应该是==。我正在考虑制作不同的函数,并将其作为一种简单的解决方法,但如果我这样做,我想知道是否可以设置一个函数,以便在使用变量时调用该函数?或者,例如使用字母“H”,我可以将其设置为调用一个“指令”函数,该函数只打印出游戏指令,以防它们忘记。然后从那里返回并重新打印最后一个问题?@remyabel yea我刚刚注意到,自从你提出这个问题以来,它们已经在我的实际代码中得到了修复,不过谢谢你,你可以将if语句放在do…while循环中,如果你愿意,可以返回!在我看来,最好的方法是将代码分解成不同的函数,并使用循环(例如for)分别调用它们。您有拼写错误应该是==。我正在考虑制作不同的函数,并将其作为一种简单的解决方法,但如果我这样做,我想知道是否可以设置一个函数,以便在使用变量时调用该函数?或者,例如使用字母“H”,我可以将其设置为调用一个“指令”函数,该函数只打印出游戏指令,以防它们忘记。然后从那里返回并重印最后一个问题?@remyabel yea我刚刚注意到,自从你提出这个问题以来,它们已经在我的实际代码中得到了修复。不过,谢谢你,请不要鼓励人们使用goto,有一个很明显的方法可以避免全球所有代码库中出现的每一个goto。@SouravGhosh:不是为了变得迂腐,是吗?@MOehm不,先生,你永远不知道,也许对一个显示正确的方向会导致其他100个的正确。哦,我同意应该不鼓励无偿使用goto,但是你的第二个,大胆的评论太过分了。请不要鼓励人们使用goto。另外,有一个明显的方法可以避免全球所有代码库中出现的每一个goto。@SouravGhosh:不是为了变得迂腐,是吗?@MOehm不,先生,你永远不知道,也许对一个goto显示正确的方向会导致其他100个goto的正确性。哦,我同意不应该无缘无故地使用goto,但是你的第二个大胆的评论太过分了。谢谢你,我考虑了每个人的意见,虽然我还没有做出任何最终决定,但明天我会倾向于你的意见,这取决于我得到了多少回应,我会选择谁最能帮助我。对于我在另一篇评论中提到的这个函数,我是否可以初始化字母“H”以显示“指令函数”,然后在重印最后一个问题后,以防
用户忘记了他需要输入什么信息?因为我没有用那么多的C++,所以我不能给你一个好的答案。一个简单的方法是ifdirection==help{printQuestion},但您必须在每个if-then中编写它。。。试着寻找一些类似事件或回调的信息,这些信息表明你按下了某个按钮。谢谢你,阿扎尔,我很高兴你是少数几个回答这个问题的人之一,而不仅仅是在我展示的一系列代码中出现,并试着告诉我这个游戏目前看起来像垃圾。@ChrisHoward这个游戏现在怎么样了?现在应该是半衰期3了吧?O;谢谢你,我会考虑每个人的意见,虽然我还没有做出任何最后的决定,但明天我会倾向于你的意见,这取决于我得到多少回应,我会选择谁对我帮助最大。我在另一个评论中问到这个函数,我可以初始化字母“h”来“指令函数”,然后重印最后一个问题,只需询问用户忘记了他需要输入什么内容吗?因为我没有用那么多的C++,所以我不能给你一个好的答案。一个简单的方法是ifdirection==help{printQuestion},但您必须在每个if-then中编写它。。。试着寻找一些类似事件或回调的信息,这些信息表明你按下了某个按钮。谢谢你,阿扎尔,我很高兴你是少数几个回答这个问题的人之一,而不仅仅是在我展示的一系列代码中出现,并试着告诉我这个游戏目前看起来像垃圾。@ChrisHoward这个游戏现在怎么样了?现在应该是半衰期3了吧?O;首先,它只是一段代码,问题不在于现在的代码有多好,问题在于是否能够在“如果”循环中倒退。首先,这只是一段代码,问题不在于代码有多好,而在于是否能够在“如果”循环中倒转。但谢谢你的意见。