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();
}
}