c++写的双链表的贪吃蛇,还没写完,现在只要移动时同时按多个键,蛇就不移动了,求帮忙修改下 5
首先第一条,下一次问问题不要放入一堆并没有进行过格式化的代码,看起来太乱了,让别人无从分析你的代码,我是这会儿有点空,想休息一下,才看了你的代码的。
主要问题在于你将if (kbhit())的判定放入到while (!kbhit())中了。那么我们考虑一种情况,当没有按键的时候,它正在执行sleep操作,然后你按下了箭头按键,然后if (kbhit())判定就为真,然后使用ctrl = getch();读取字符,发现没有一个case匹配,然后继续执行下一轮while (!kbhit())。这个时候要注意,箭头实际上是多个字符,while (!kbhit())不在成立,这样就会跳出它,回退到最外层的while(1)循环中,在while(1)中一直检测while (!kbhit()),发现一直都有用户按下的键。其实并不是按下了键,而是上一次的按键并没有被完全读取出来。一种简单的办法就是将while (!kbhit())和Move操作单独出来,它只负责检测按键,如果没有按键,就一直转圈,如果有按键,跳出循环进入到if (kbhit())中,读取字符。这样的话,对于方向键虽然是两个字符,但是会执行两次while (!kbhit())判定和两次的读取字符,这样的弊端就是无法使用方向键来控制这个蛇了。 大概的代码:
while(1){
while (!kbhit()){
//if no key is pressed, wait here
Move(dir);
Sleep(1000);
}
if (kbhit()){//read the key, the if condition is unnecessary
ctrl = getch();
...
}
}
还有一种方法是我们在读取字符的时候,能够一次将用户的按键全部读完。可以使用一个简单的while(!kbhit())和s[i++]= getch();包装到一块,只要有按键字符待读取,就去读,只要读取完毕,并将结果放入到s数组中,然后比较s是否与方向箭头一致就可以处理箭头按键了。