我是C的业余爱好者,我有以下任务:给我们一个二维表,玩家在中间控制一个'X‘。玩家应该有可能移动'X‘左右。但是,每2秒就会有一个随机字符出现在表的边框附近的一个特定点上,这样,如果边界附近的所有框都有一个字符,玩家就会输掉。
我在移动'X‘时遇到问题,同时随机字符每2秒出现一次。如果我按下按钮向任何方向移动'X‘,但是代码仍在“休眠”,则只有在某些剩余时间过去之后才会发生更改,这几乎是不够好的-- 1每2秒移动一次。
我希望()函数在有键盘输入时停止,在表上打印已更改的位置,然后重新启动,然后再使用剩余的时间,或者至少再睡2秒。然而,我无法理解所有复杂的东西,如多线程,所以你能不能简单地解释一下你的答案?我的电脑使用的是。
下面是我代码的一部分:
void move()
{
if (kbhit())
{
chkb = getch();//character from keyboard
if ((int)chkb == 27)//if chkb is ESC
{
printf("\nGame Exited. We already miss you!");
stop();
}
else
{
changeposition();
printTable();
}
}
}
while (1)
{
move();
switch (rand() % 4)
{
case 0:
balls[p1][p2] = 'R';//array of chars
break;
case 1:
balls[p1][p2] = 'G';
break;
case 2:
balls[p1][p2] = 'B';
break;
case 3:
balls[p1][p2] = 'Y';
break;
default:
balls[p1][p2] = '?';
}
printTable();
verifyLose();
Sleep(2000);
}
}
printTable();我在找这样的东西:
Sleep(for a time, if some condition is true);
if(condition is false){
->make it true
->start sleep again with remaining time
}或者类似的东西。有什么想法吗?提前感谢!
发布于 2020-11-14 12:38:53
我不会调用MS Sleep()或gcc sleep(),而是选择一个非阻塞功能,就像您对MS kbhit()一样。
对于1秒计时器,示例使用如下
clock_t target = clock() + CLOCKS_PER_SEC;
while(!kbhit() && clock() < target) {
// some code if needed
}当一个键被按下,或者1秒后,循环就会结束。您可以再次检查kbhit()以找出哪个。
发布于 2020-11-14 11:06:26
注意,sleep函数不是C11标准的一部分。您可以通过阅读n1570 ( C11标准草案)进行检查。也请参阅这个C参考网站。
但sleep是POSIX的一部分。例如,阅读睡眠(3)。
您可以使用一些事件循环库,例如来自GTK的滑翔 (跨平台Windows、Linux、MacOSX)或利别夫或利贝特。
您可以使用终端接口库,如诅咒。
您可以考虑在跨平台库(如GTK (或Qt或FLTK;两者都需要学习用C++编程)之上编写一个图形应用程序)。
您可以决定编写一个特定于Windows的C程序。
我本人从未在Windows上进行过编码,但我相信您可能会对Windows特定的函数感兴趣。
我想对于一个游戏来说,你需要一些输入多路复用功能。在Linux上,出现了选择(2)或民意测验(2)。也许您会对Windows上的Socket.Poll感兴趣(但轮询键盘或鼠标应该不这样做)。
对于游戏,我建议使用libSFML。
无论您将使用何种API或库,请确保阅读其文档。
还请参阅github上现有的开放源代码示例。
还可以阅读C编译器(可能是GCC)和调试器(可能是GDB)的文档。在编译器中启用所有警告和调试信息(使用GCC,用gcc -Wall -Wextra -g编译)。考虑使用静态分析工具,如Clang静态分析仪或Frama-C。读一读这份草稿的报告,看看(2020年末) 译码器欧洲项目,以及山羊座赞助的会议(关于编译器和静态分析)的最新论文。
请注意,PC键盘有不同的布局(我的是阿兹蒂)。您可能需要使用一些库对这些进行抽象。
https://stackoverflow.com/questions/64833192
复制相似问题