如何让你的程序重复递增,直到在 switch 语句中按下另一个键

How do I make your program increment repeatedly until another key is pressed in a switch statement

我一直在开发其中一款贪吃蛇游戏,我有一个 switch 语句,说明如果按下某个键将蛇向某个方向移动 incrementing/decrementing,但它只会在我这样做时执行拿着它。我正在寻找一种方法,让蛇的位置在用户不按住该键的情况下不断增加。我在下面放一个案例

if(_kbhit()) {
    switch(_getch()) {
        case 'a' : 
        dir = LEFT;
        x--;

您当前的设计听起来像是在按下事件时移动蛇。

我认为您希望修改设计,以便按下事件更新一些当前方向标志,同时一些后台计时器线程以一些常规帧速率移动蛇。

I am looking for a way to have ... keep incrementing without the user holding that key."

恕我直言,你应该考虑 "select()" 函数(如果它在你的 OS 中可用)


很久以前我在 vxWorks 中使用 "select()"。我从手册页中看到此功能也可用于 Ubuntu Linux。 (也许它适用于您的系统?)

使用 select 语句,线程或程序可以 "monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready" 进行某些 class 的 I/O 操作(例如可能的输入)。文件描述符是如果可以执行相应的操作(例如,不阻塞的 read() 或足够小的 write()),则认为准备就绪。” (来自手册页)

实际上,我工作的系统有一个用户界面线程(几个之一)问题读取和监视输入 fd(通过 select)以获取用户输入。我们的 select 使用了 1/2 秒超时(您选择速率)。因此,每半秒,如果该端口(即设备)没有用户输入,超时将释放程序以检查 fd_sets.

中的位

没有什么能阻止代码在超时时执行额外的活动。

我猜你只需要在 readfds 上工作,可以将其他 fds 留空。

换句话说,对于 select,您的代码 'monitors' 针对某些用户输入超时,并且对用户输入(击键)或超时采取行动.

这听起来像您要找的东西 - 无需按键即可操作。

您的代码只会在按键时移动蛇。您需要实现某种游戏循环,根据 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...