【问题标题】:How to break out of loop controlling a game of Snake?如何跳出控制贪吃蛇游戏的循环?
【发布时间】:2022-12-31 17:04:03
【问题描述】:

感谢您的时间。 这是我在 Stack Overflow 上的第一篇文章,如果结果不合标准,请务必告诉我,并请告诉我我应该改进什么。

我试图让我的函数嵌套在一个 while 循环中,更改一个变量来控制是否会有另一个循环。

这是我参考的代码:

bool alive = true;

while (alive = true) { // I want MoveForward function to change alive to false if condition happens.
        MoveForward(mapa, alive, Snake);
        getch();
    }

    getch();
    endwin();



    return 0;
}

这是一个 MoveForward 函数。它需要 [16][16] 个字符数组、bool alive 和由结构实例组成的向量 Snake:

void MoveForward(char mapa[0][16],bool &alive ,vector <Segment> &Snake) {
        for (int i = 0; i < Snake.size(); i++) {
            //If snake segment is the last one.
            if (i == Snake.size() - 1) {
                mapa[Snake[i].position_y - 1][Snake[i].position_x] = Snake[i].symbol;
                Snake[i].position_y--;
                mapa[Snake[i].position_y + 1][Snake[i].position_x] = ' ';

            }
            //If snake segment is not the last one.
            else {
                mapa[Snake[i].position_y + -1][Snake[i].position_x] = Snake[i].symbol;
                Snake[i].position_y--;
            }
        }
        
        //Display prints each array element on the screen.
        Display(mapa);
        
        //If cell in front of Snake's head is a wall.
        if (mapa[Snake[0].position_y - 1][Snake[0].position_x] == '=') {
            printw("You are dead!");
            alive = false; // <-- I'm trying to make it change alive flag to false. 
        }
}

显示SN-P:

void Display(char mapa[][16]) {
    //Displaying borders, and the snake.
    for (int i = 0; i < 16; i++) {
        for (int j = 0; j < 16; j++) {
            mvaddch(i, j, mapa[i][j]);
        }
    }
}

我不确定我是否为您提供了足够的代码,但我不想让您丢掉整整 160 行代码。

我想要发生的是 MoveForward 函数的最后一个条件语句将 alive 标志更改为“false”,这样当 Snake 在下一个循环中撞到墙上时游戏会自行关闭。我试图将“void MoveForward”更改为“bool MoveForward”并以这种方式返回 alive=false,但无济于事。它确实阻止了蛇出去,但也只是不断重复“你死了!”,这不是我想要的。

我敢肯定答案很简单,但我就是想不通,而且我完全陷入了 while 循环将蛇推出界限并给我“分段错误(核心转储)”。 这是我大学项目的第一个学期,我发现它真的很难。 对于丑陋的代码,我深表歉意,谢谢。

【问题讨论】:

  • 我只是更正了我认为是您的代码清单中的拼写错误,但我意识到这实际上可能是问题的原因。请确认 while (alive = true) 语句是否实际存在于您的真实代码中,我将恢复编辑并发布答案。
  • @ComicSansMS 是的,先生,它最初在我的代码中是 while(alive = true)。我已经将这部分修复为:while(alive == true),但是我仍然不断越界,所以我认为这不是唯一的问题。
  • @ComicSansMS 抱歉,看来您是对的。我最终草率地从 void MoveForward(char mapa[0][16],bool &alive ,vector <Segment> &Snake) 中删除了那个 & 符号。返回它完全解决了这个问题。非常感谢你。
  • 不会修复该死的东西,但考虑删除 alive 变量以支持从 MoveForward 返回 bool。你变干净一点了while (MoveForward(mapa, Snake)) { getch(); }未来关注:你是怎么控制蛇的方向的?
  • @user4581301 稍后我将在这个 while 循环中放置 getch() 来捕获用户输入,这就是我决定需要一个“活动”变量的原因。总共有 4 个函数,当蛇的头距离撞墙或尾巴只有一个循环时,每个函数都应该能够更改“alive”变量。然而,我发现这项任务很困难,我正试图一次增强程序的一个功能。自从先生。 ComicSansMS 帮助我修复了循环,我现在可以继续处理用户输入了。

标签: c++ ncurses


【解决方案1】:

您的循环体中有错字:

while (alive = true) ...

这是分配而不是检查。你的意思可能是写:

while (alive == true) ...

或者,甚至更短,只是

while (alive) ...

编译器擅长警告这些类型的错误。如果您还没有这样做,请考虑提高您的警告级别。例如,带有-Wall 的 gcc 和带有/W4 的 Visual C++ 都会对此发出警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多