我一直在研究其中一个蛇游戏,我有一个 switch 语句,说明如果按下一个键以通过递增/递减的方式移动蛇,但只有当我按住它时它才会这样做。我正在寻找一种方法来让蛇的位置不断增加,而无需用户持有该键。我在下面放了一个案例
if(_kbhit()) {
switch(_getch()) {
case 'a' :
dir = LEFT;
x--;
我一直在研究其中一个蛇游戏,我有一个 switch 语句,说明如果按下一个键以通过递增/递减的方式移动蛇,但只有当我按住它时它才会这样做。我正在寻找一种方法来让蛇的位置不断增加,而无需用户持有该键。我在下面放了一个案例
if(_kbhit()) {
switch(_getch()) {
case 'a' :
dir = LEFT;
x--;
您的代码仅在按键时移动蛇。您需要实现某种游戏循环,根据direction
变量定期移动蛇。然后,您可以重构您的按键代码以简单地更新direction
.
伪代码:
while: # loop forever
# below could be your switch statement
if direction == 0: # north
y--
if direction == 1: # east
x++
if direction == 2: # south
y++
if direction == 4: # west
x--
if _kbhit():
if _getch() == 'a':
direction == 4 # west
# etc...
我正在寻找一种方法……在用户不持有该键的情况下继续递增。”
恕我直言,您应该考虑“select()”功能(如果它在您的操作系统中可用)
很久以前,我在 vxWorks 中使用过“select()”。我从手册页看到这个功能也适用于 Ubuntu Linux。(也许它对您的系统可用?)
使用 select 语句,线程或程序可以“监视多个文件描述符,等待一个或多个文件描述符为某种 I/O 操作“准备好”(例如,可能的输入)。如果满足以下条件,则认为文件描述符已准备好可以执行相应的操作(例如,没有阻塞的读取(),或足够小的写入())。” (来自手册页)
在实践中,我工作的系统有一个用户界面线程(几个之一)问题读取并监视输入 fd(通过 select)以获取用户输入。我们的选择使用了 1/2 秒的超时时间(您选择速率)。因此,每半秒,如果在该端口(即设备)上没有发生用户输入,超时将释放程序来检查 fd_sets 中的位。
没有什么可以阻止代码在超时时执行其他活动。
我猜你只需要处理 readfds,并且可以将其他 fds 留空。
换句话说,使用 select,您的代码“监视”某些用户输入超时,并对用户输入(击键)或由于超时采取操作。
这听起来像您正在寻找的 - 无需按键即可操作。
您当前的设计听起来像是在新闻发布会上移动了蛇。
我认为您正在寻找修改设计,以便按下事件更新一些当前方向标志,而一些后台计时器线程以一些常规帧速率移动蛇。