Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的蛇+;韩元';Don’不要连续转弯两次 我刚刚开始学习C++。我决定编写一个在控制台上运行的小蛇游戏。它相对简单,看起来并不惊人,但它确实做到了它应该做的事情。我唯一的问题是,我的蛇不会连续转两次。换句话说,你不能用它做急转弯。但是,按下按钮后,它将立即转动。(除非你刚刚转过身,那是)。 我的代码有120行,所以在这里: 首先,我的名称空间包括: #include <iostream> #include <vector> #include <conio.h> #include <windows.h> #include <random> using namespace std; #包括 #包括 #包括 #包括 #包括 使用名称空间std;_C++_Console Application - Fatal编程技术网

C+中的蛇+;韩元';Don’不要连续转弯两次 我刚刚开始学习C++。我决定编写一个在控制台上运行的小蛇游戏。它相对简单,看起来并不惊人,但它确实做到了它应该做的事情。我唯一的问题是,我的蛇不会连续转两次。换句话说,你不能用它做急转弯。但是,按下按钮后,它将立即转动。(除非你刚刚转过身,那是)。 我的代码有120行,所以在这里: 首先,我的名称空间包括: #include <iostream> #include <vector> #include <conio.h> #include <windows.h> #include <random> using namespace std; #包括 #包括 #包括 #包括 #包括 使用名称空间std;

C+中的蛇+;韩元';Don’不要连续转弯两次 我刚刚开始学习C++。我决定编写一个在控制台上运行的小蛇游戏。它相对简单,看起来并不惊人,但它确实做到了它应该做的事情。我唯一的问题是,我的蛇不会连续转两次。换句话说,你不能用它做急转弯。但是,按下按钮后,它将立即转动。(除非你刚刚转过身,那是)。 我的代码有120行,所以在这里: 首先,我的名称空间包括: #include <iostream> #include <vector> #include <conio.h> #include <windows.h> #include <random> using namespace std; #包括 #包括 #包括 #包括 #包括 使用名称空间std;,c++,console-application,C++,Console Application,此函数在控制台中绘制整个字段: void drawGrid(vector<vector<char>> &g, int height, int width, int score, int time) { SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), { 0,0 }); for (int r = 0; r < height; r++) { for (in

此函数在控制台中绘制整个字段:

void drawGrid(vector<vector<char>> &g, int height, int width, int score, int time)
{
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), { 0,0 });
    for (int r = 0; r < height; r++)
    {
        for (int c = 0; c < width; c++) std::cout << g[c][r] << " ";
        std::cout << '|' << endl;
    }
    std::cout << "Current score: " << score << "     ";
    std::cout << "\nCurrent speed: " << time << "      ";
}
void drawGrid(向量&g、整数高度、整数宽度、整数分数、整数时间)
{
setConsoleorSorposition(GetStdHandle(STD_输出_句柄),{0,0});
对于(int r=0;r对于(int c=0;c
我所看到的状态设置:

  • 设置场景
  • 检查钥匙
  • 如果按下该键,并且该键不与当前方向相反,则更改移动方向
  • 制作旧头尾并从旧头尾向设定方向添加一个头尾元素
  • 验死
  • 检查食物
  • 如果找到食物,通过改变尾巴长度来生长尾巴
  • 如果蛇的长度大于尾长,则移除尾元素,直到它们相等
  • 渲染场景
  • 睡觉去2号
  • 最好用一个列表而不是向量来表示snake,它不会在大小改变或删除第一个元素时重新分配内存

    如果您的平台是Windows(显然,您使用的是Sleep()函数而不是usleep),那么这个问题的答案为密钥检测提供了更好的解决方案。


    POSIX平台也有类似的解决方案。

    有一个小问题,就是即使按下了键,您也在等待睡眠时间

    Sleep(sleeptime);
    
    主循环可能类似于此伪代码

    while (IsAlive())
    {
       currtime = 0;
       DrawState();
       while (currtime++ < sleeptime)
       {
          if (CheckAndProcessKeyboardInput())
             break;
          SleepOneMilliSecond();
       }
    }
    
    while(IsAlive())
    {
    currtime=0;
    DrawState();
    while(currtime++
    \u kbhit()
    (用户输入)需要并行运行(使用线程)为了快速响应,目前它与主循环中的其他代码级联。了解以下几点很重要:console不是用来作为交互式图形设备,具有实时输入和输出。在console中制作动作游戏的过程中会遇到一些障碍。从编写动作游戏中获得的知识ole动作游戏不适用于现实世界。我建议您创建一个实际的GUI游戏(Windows),并在其中绘制所有内容。@seccpur NOOOOOO。我知道线程很花哨,但这里绝对不是使用线程的地方。新手不应该使用线程,因为它们很难理解,并且会导致难以理解和修复的错误。@dialogiccust这不是问题所在(还有,有数百款游戏都能做到这一点?有些平台本身根本没有GUI。甚至是使用帧缓冲渲染而不是X11的linux)。实际的问题是,当游戏在单线程中运行时,它在向前移动snake之前不会检查键的状态。因此,人们不能仅仅因为这一点就做出一个急转弯。@MarekR:同意。但是
    Sleep()
    就在
    kbhit()之前
    可能会减少用户响应,而蛇可能会超调。我确实希望它在整个睡眠时间内睡眠,即使按了一个键。否则,你可能会捣碎按钮,使游戏运行更快。问题不是我希望蛇对按下按钮立即作出反应。
        std::system("cls");
        std::cout << endl << endl << endl << endl << "\tYou have died" << endl << endl << endl << endl;
    
        std::cout << endl;
        std::system("pause");
        return 0;
    }
    
    Sleep(sleeptime);
    
    while (IsAlive())
    {
       currtime = 0;
       DrawState();
       while (currtime++ < sleeptime)
       {
          if (CheckAndProcessKeyboardInput())
             break;
          SleepOneMilliSecond();
       }
    }