如何在 C++ 中执行另一个 while 循环期间获取流输入
How do I get stream input during execution of another while loop in c++
我正在用 c++ 编写一个游戏,它使用 pdcurses 从用户那里获取输入并在命令行终端上显示不断变化的玩家状态。我使用 while 循环不断更新玩家的健康状况(一个数字值),它通过一个小状态栏打印到屏幕上。它每秒循环多次,这给游戏带来了实时感。虽然程序是 运行,但我希望即使我与游戏互动,这个值也能不断更新。例如,我想在不中断我的小状态显示循环的情况下发出 "eat food" 或 "chop wood" 之类的命令。我在设计这部分的功能时遇到了问题。我如何在与游戏互动时保持我的状态更新?我担心当用户在终端中输入内容时,while 循环暂停并且状态不再继续更新。我正在寻找一些通用的指针,而不是实际的代码。我真的很感激。我对编程还很陌生。
我是否必须使用多个线程,或者有没有办法让 while 循环在用户向屏幕输入文本时继续运行?感谢您提供的任何指示。我希望这不是一个太令人困惑的问题。
FWIW,这是我目前的伪代码:
#include //....some files....
int main() {
// Initialize game objects and graphics
bool programRunning = true;
float playerEnergy = 3000.0;
initscr(); /* Start curses mode */
while (programRunning)
{
// Display some graphics
// Display playerEnergy
// Set the while loop speed using std::this_thread::sleep_for...
playerEnergy -= 0.01;
int ch;
ch = getch();
switch (ch) {
case 'e': //eat food
playerEnergy += 1000;
// Do some stuff
break;
case 'w': //do some work
playerEnergy -= 1000;
// Do some stuff
break;
/* Etc, Etc. */
default:
break;
}
// If player quits, set programRunning to false
}
endwin(); /* End curses mode */
return 0;
}
正如你所建议的,多线程是我在这里的方式。
我看到 here 使用 getch
可以解决你的问题,如果你使用 nodelay(stdscr,TRUE);
使它成为一个非阻塞调用,但我自己没有使用它
这取决于你在做什么,但我通常更喜欢 halfdelay()
-- 它让你有非阻塞输入而不用将 CPU 固定在 100%。或者,您可以使用 nodelay()
并在适当时手动调用 napms()
。
我正在用 c++ 编写一个游戏,它使用 pdcurses 从用户那里获取输入并在命令行终端上显示不断变化的玩家状态。我使用 while 循环不断更新玩家的健康状况(一个数字值),它通过一个小状态栏打印到屏幕上。它每秒循环多次,这给游戏带来了实时感。虽然程序是 运行,但我希望即使我与游戏互动,这个值也能不断更新。例如,我想在不中断我的小状态显示循环的情况下发出 "eat food" 或 "chop wood" 之类的命令。我在设计这部分的功能时遇到了问题。我如何在与游戏互动时保持我的状态更新?我担心当用户在终端中输入内容时,while 循环暂停并且状态不再继续更新。我正在寻找一些通用的指针,而不是实际的代码。我真的很感激。我对编程还很陌生。
我是否必须使用多个线程,或者有没有办法让 while 循环在用户向屏幕输入文本时继续运行?感谢您提供的任何指示。我希望这不是一个太令人困惑的问题。
FWIW,这是我目前的伪代码:
#include //....some files....
int main() {
// Initialize game objects and graphics
bool programRunning = true;
float playerEnergy = 3000.0;
initscr(); /* Start curses mode */
while (programRunning)
{
// Display some graphics
// Display playerEnergy
// Set the while loop speed using std::this_thread::sleep_for...
playerEnergy -= 0.01;
int ch;
ch = getch();
switch (ch) {
case 'e': //eat food
playerEnergy += 1000;
// Do some stuff
break;
case 'w': //do some work
playerEnergy -= 1000;
// Do some stuff
break;
/* Etc, Etc. */
default:
break;
}
// If player quits, set programRunning to false
}
endwin(); /* End curses mode */
return 0;
}
正如你所建议的,多线程是我在这里的方式。
我看到 here 使用 getch
可以解决你的问题,如果你使用 nodelay(stdscr,TRUE);
使它成为一个非阻塞调用,但我自己没有使用它
这取决于你在做什么,但我通常更喜欢 halfdelay()
-- 它让你有非阻塞输入而不用将 CPU 固定在 100%。或者,您可以使用 nodelay()
并在适当时手动调用 napms()
。