Snake Game going too fast console c++

Snake Game going too fast console c++

我一直在学习一些教程来制作一个有点贪吃蛇的游戏,但不是一个完整的游戏,它进行得很顺利,我想我几乎做对了,但我有两个问题

#include <bits/stdc++.h>
#include <conio.h>
#include <unistd.h>
using namespace std;

int side,x,y;
int fruitx,fruity,score,flag;
bool isOver;

void randomize();
void frame(int);
void userinp();
void game();

int main(){
    do{
        cout << "Enter the side of your frame!(not less than 20)\n";
        cin >> side;
    }while(side < 20);
    randomize();
    while(!isOver){
        frame(side);
        userinp();
        game();
    }
    return 0;
}

void randomize(){
    x = side/2;
    y = side/2;
    label1: fruitx = rand()%side;
    if (fruitx == 0 || fruitx == side)
        goto label1;
    label2:
    fruity = rand()%side;
    if (fruity == 0 || fruity == side)
        goto label2;

    score = 0;
}
void frame(int s){
    system("cls");
    for(int i=1;i<=s;i++){
        for(int j=1;j<=s;j++){
            if(i == 1 || i == s || j == 1 || j == s)
                cout << "*";
            else{
                if(i == x && j == y){
                    cout << "-";
                }
                else if(i == fruitx && j == fruity){
                    cout << "x";
                }
                else
                    cout << " ";
            }
        }
        cout << "\n";
    }
    cout << "Your score: " << score << endl;
}
void userinp(){
    if(kbhit()){
        switch (getch()){
        case 'a':
            flag = 1;
            break;
        case 's':
            flag = 2;
            break;
        case 'd':
            flag = 3;
            break;
        case 'w':
            flag = 4;
            break;
        default:
            isOver = true;
        }
    }
}
void game(){
    sleep(0.899);
    switch (flag){
    case 1:
        y--;
        break;
    case 2:
        x++;
        break;
    case 3:
        y++;
        break;
    case 4:
        x--;
        break;
    }
     if (x < 0 || x > side || y < 0 || y > side){
        x = side/2;
        y = side/2;
     }
     if (x == fruitx && y == fruity) {
        label3: fruitx = rand()%(side);
        if (fruitx == 0)
            goto label3;

        label4: fruity = rand()%(side);
        if (fruity == 0)
            goto label4;

        score++;
    }
}

第一个问题:

正在使用 system"(cls") 帮助屏幕不会下降很多次以避免屏幕向下滚动我尝试在每次调用sleep()时使屏幕清晰但我不知道如何使用 sleep() 函数稍微减慢进程,它不是太慢就是太快 屏幕 ,是否有不同的方法来处理整个事情或者是函数本身不适合在这里使用?

第二个问题: 每当我输入 20 的边时,我根本找不到水果本身,但是当它超过这个数字时,它确实会向我显示随机水果就好了,所以有没有办法解决为什么只 side = 20 它行不通?

PS:如果除了这两个问题之外还有什么可以改进的,我将不胜感激..在此先感谢!

第一次睡觉有点乱。请在此处查看答案以获得更好的解决方案:Sleep for milliseconds

其次,您没有考虑自己的管理费用。您的程序可能 运行 faster/slower 在不同的设置上。对于一般的游戏,您希望使用稍微精确但快速的时间函数来了解移动所有内容的程度(当然对于贪吃蛇来说并不是真正需要的)。有关此主题的更多建议,请参阅此问题:

最后,控制台不太适合此类应用程序。我建议切换到一个简单的 GUI,这样您就不必处理控制台的疯狂问题。如果您的目标是通过某种演示来学习一些东西并继续前进,那可能没问题,并忍受这种奇怪的行为。

关于水果的问题:

  • 永远不要使用 goto。很难对它进行推理,也很难用标准工具来处理它。使用更容易推理的 functions/loops。在你的情况下 do{ friutx = ...; } while (friuitx==0) 就可以了。
  • 设置水果的两个地方使用不同的代码。很可能即使你修好了一个,另一个可能还是坏了。创建一个函数并从两个地方调用它。
  • % 将进行提醒(0side-1,含)。看起来你的目标是 2 到 side-1,所以也许做 rand()%(side-1) + 1 或更好,使用 std::uniform_int_distribution.
  • 我不清楚为什么没有正确看到它。使用调试器检查渲染帧时水果的坐标是什么。它们可能会重叠边缘并替换为 *.