1

我一直在研究其中一个蛇游戏,我有一个 switch 语句,说明如果按下一个键以通过递增/递减的方式移动蛇,但只有当我按住它时它才会这样做。我正在寻找一种方法来让蛇的位置不断增加,而无需用户持有该键。我在下面放了一个案例

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

3 回答 3

0

您的代码仅在按键时移动蛇。您需要实现某种游戏循环,根据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...
于 2017-01-08T03:41:34.887 回答
0

我正在寻找一种方法……在用户不持有该键的情况下继续递增。”

恕我直言,您应该考虑“select()”功能(如果它在您的操作系统中可用)


很久以前,我在 vxWorks 中使用过“select()”。我从手册页看到这个功能也适用于 Ubuntu Linux。(也许它对您的系统可用?)

使用 select 语句,线程或程序可以“监视多个文件描述符,等待一个或多个文件描述符为某种 I/O 操作“准备好”(例如,可能的输入)。如果满足以下条件,则认为文件描述符已准备好可以执行相应的操作(例如,没有阻塞的读取(),或足够小的写入())。” (来自手册页)

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

没有什么可以阻止代码在超时时执行其他活动。

我猜你只需要处理 readfds,并且可以将其他 fds 留空。

换句话说,使用 select,您的代码“监视”某些用户输入超时,并对用户输入(击键)或由于超时采取操作。

这听起来像您正在寻找的 - 无需按键即可操作。

于 2017-01-08T02:41:23.347 回答
0

您当前的设计听起来像是在新闻发布会上移动了蛇。

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

于 2017-01-07T23:54:15.623 回答