2016-07-28 43 views
1

我在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时,瓷砖变空。如果计数器等于蛇的长度,则瓦片被认为是头部。 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时,它还有一个向上移动,只有在向左移动之后。

回答

0

已解决。

原来有太多东西放入缓冲区,因为如果在等待时间内随机调整控件,程序开始疯狂。我解决了它与

while(kbhit()) 
{ 
    input=getch(); 
} 
//reactions 

现在检查每一个信号在缓冲区中,反应只有最后一个替换

if(kbhit()) 
{ 
    input=getch(); 
    //reactions 
} 

,所以延迟被消除。

1

在我看来,你有一个额外的getInput()调用。这可能是问题吗?

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

我忘了把它剪掉,以前我把它放在了错误的地方,导致它延迟了1步,认为它应该在'delay'函数之后并且添加第二个移动。但有了这个额外的投入似乎并没有影响它,问题必须放在其他地方。 – Pegaz