gpt4 book ai didi

c - 在可能接受输入的同时继续执行循环

转载 作者:太空宇宙 更新时间:2023-11-04 02:38:59 24 4
gpt4 key购买 nike

我正在尝试用 C 语言制作一个简单的俄罗斯方 block 游戏。我在输入部分遇到了麻烦。我制作了一个循环,每秒将新作品向下移动。现在我希望发生这种情况,但我希望玩家能够按下按钮来移动棋子,这当然是游戏的对象。这两件事不应该干涉。游戏循环是

  for (i=1;i<100;i++)
{
printBoard(&current);
if (move(&current))
spawn(&current);

sleep(1);
}

这里的函数 move 将下落的方 block 向下移动一个单位,如果方 block 撞到地面或另一 block 则返回 1,在这种情况下通过 spawn 函数生成新的方 block 。 printboard 只是将电路板打印到终端。执行此操作的最佳方法是什么?

提前致谢

为了完整性,这里是完整的代码

#include <stdio.h>
#include <math.h>

#define height 20
#define width 15

typedef struct board{
int x[height][width];
int score;
} board;

void printBoard(board * current){
int i,j;
for (i=0;i<40;i++)
printf("\n");

printf("Score : %d\n", current->score);

for (i=0;i<height-1;i++)
{
printf("|");
for (j=0;j<width;j++)
{
if (current->x[i][j] == 0)
printf(" ");
else
printf("x");
}
printf("|\n");
}
for (i=0;i<width+2;i++)
printf("T");

printf("\n");
}

void spawn(board * current){
current->x[0][4] = 2;
current->x[1][4] = 2;
current->x[1][5] = 2;
current->x[1][6] = 2;
current->x[1][7] = 2;
}

int move(board * current){ // returns 1 if block hits ground
int i,j;
for (i=(height-1);i>0;i--)
for (j=0;j<width;j++)
if (current->x[i-1][j] == 2){
if (i==(height-1) || current->x[i][j] == 1){
goto DONE;
}
current->x[i][j] = 2;
current->x[i-1][j] = 0;
}


return 0;

DONE:
for (i=0;i<height;i++)
for (j=0;j<width;j++)
if (current->x[i][j] == 2)
current->x[i][j] = 1;
return 1;
}


int main(){
board current;
current.score = 0;
int i,j;
for (i=0;i<height;i++)
for (j=0;j<width;j++)
current.x[i][j] = 0;


spawn(&current);
for (i=1;i<100;i++)
{
printBoard(&current);
if (move(&current))
spawn(&current);

sleep(1);
}
return 0;
}

最佳答案

通常的方法是依靠 poll() 或 select() 调用。

想法是在 select 调用上设置一个超时(因为你会是 1 秒)并在超时发生时执行标准刷新。

用户输入是通过文件描述符检索的(我猜这里是 stdin,因此是 0),每次用户按下按钮时,select 退出,但这次,fd 被标记为有输入,因此你只需要阅读输入并处理您刚刚阅读的内容。然后再次等待 select()

伪代码看起来像(取自 select man):

   int main(void)
{
fd_set rfds;
struct timeval tv;
int retval;

/* look stdin (fd 0) for inputs */
FD_ZERO(&rfds);
FD_SET(0, &rfds);

/* wait 1 second. */
tv.tv_sec = 1;
tv.tv_usec = 0;

retval = select(1, &rfds, NULL, NULL, &tv);
/* Carefull tv was updated (on linux) */

if (retval == -1)
perror(" an error occured");
else if (retval == 1) {
printf("Data is available on stdin \n");
/* FD_ISSET(0, &rfds) should be true */
handle_input();
} else {
printf("Timeout.\n");
update_status();
}
exit(EXIT_SUCCESS);
}

关于c - 在可能接受输入的同时继续执行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33945266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com