gpt4 book ai didi

c++ - 控件在 snake 中没有正确响应

转载 作者:行者123 更新时间:2023-11-30 05:24:30 26 4
gpt4 key购买 nike

我正在用 C++ 编写一个基本的贪吃蛇游戏作为控制台应用程序。它基于“平铺”结构的二维数组。我的问题是:当按下按钮改变蛇行进的方向时,它不会立即工作,而是等待下一个“滴答声”。管理游戏本身的函数如下所示:

void board::play()
{
display();
while(1)
{
getInput();
delay(0.5);
getInput();
resetCursor();
tick();
display();
}
}

display() 非常不言自明,在控制台窗口中显示整个板。

delay() 同样,它的功能是获取秒数作为 float 并在继续之前等待这么多时间getInput() 看起来像这样:

void board::getInput()
{
int input;
if(kbhit())
{
input=getch();
if(input==KEY_LEFT)
turnLeft();
if(input==KEY_RIGHT)
turnRight();
if(input==KEY_UP)
turnUp();
if(input==KEY_DOWN)
turnDown();
}
}

resetCursor() 将光标设置为 0,0 坐标,因此每次板子都会覆盖自身而不是一个在另一个下

现在是游戏本身:board 类包含 int direction 字段等。瓷砖本身包含一个计数器,每次移动都会倒数 1,当达到 0 时,瓷砖变为空。如果计数器等于蛇的长度,则该图 block 被认为是头。tick() 函数就是这样做的:将所有计数器减 1,记住头部所在的位置,并在指定方向的前一个头部旁边的字段中生成一个新头部。它看起来像这样:

void board::tick()
{
int posx, posy;
for(int i=0; i<boardSize; i++)
{
for(int j=0; j<boardSize; j++)
{
if(tab[i][j].getCounter()==lenght)
{
posx=i;
posy=j;
}
tab[i][j].tick();
}
}
switch(direction)
{
case UP: tab[posx-1][posy].addSnake(lenght);
break;
case DOWN: tab[posx+1][posy].addSnake(lenght);
break;
case LEFT: tab[posx][posy-1].addSnake(lenght);
break;
case RIGHT: tab[posx][posy+1].addSnake(lenght);
break;

}
}

问题是,如前所述,游戏在改变方向之前等待一个“滴答声”,而它应该在按下相关按钮后立即这样做,例如当从 UP 转向 LEFT 时,它会再向上移动一次,然后才向左移动。

最佳答案

在我看来,您有一个额外的 getInput() 调用。会不会是问题所在?

  while(1)
{
getInput(); // <--
delay(0.5);
getInput(); // <--
resetCursor();
tick();
display();
}

关于c++ - 控件在 snake 中没有正确响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38641758/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com