我正在使用OpenGL图形在C ++上编写游戏(奥赛罗),我需要在用户放置一块之后“等待”或“休眠”游戏。用户播放后,CPU播放速度过快,因此无法看到用户的移动。我试过睡眠功能,但它不起作用。基本上,这个想法是:
玩家插入新作品 ----睡1秒---- CPU插入一个新的
有没有办法做到这一点?
答案 0 :(得分:4)
我认为你只是在学习编程。你发现了一个重要的步骤。
人们编写的第一个代码很可能是在控制台上,它是串行的:写一个问题,等待输入,做一些事情。打印输出。这很好,许多程序都是这样的。
不幸的是,GUI没有。它们大致有三个独立的部分:
现在所有这些事情都会发生,而另一个事情正在发生。有些人需要等待对方。但它们基本上可以按随机顺序发生。混沌!如果玩家在AI仍在思考时点击该怎么办?也许董事会需要重新绘制,因为操作系统移动了窗口。
您没有说明您正在使用哪种操作系统,但OpenGL应该始终只做第3项。完全按照原样显示该主板。如果你想让计算机变慢,它应该在第1点。
解决此问题的经典方法是消息循环和队列。
如果您的第一个程序看起来像这样:
while ( gamenotdecided )
ask human to enter move (wait for it)
update board (and show it)
compute AI move
update board (and show it)
do
新方式更像是这样:
while ( gamenotdecided )
get the next message:
if it is show board: show board;
if it is input: if it is not the humans turn print an error.
else make it, and send yourself a message to show the board and start AI
if it is AI: Do a small part of AI thinking.
Send yourself a message to keep doing AI if there is no good move yet.
If the AI is decided:
if enough time passed
make the move, send yourself a message to show the board
else
wait a tiny bit and send yourself a message to do AI again
do
如果人工智能太快,人工智能思维的部分就是你可以等待时间的地方。关键是您可以随时显示电路板,无论是用户还是AI转向。 所有GUI操作系统也有一种方法只在一定时间后发送消息。但即使没有它,你也可以很容易地做到:如果你得到AI消息,AI知道该怎么做,但现在还不是时间,只是不做任何事情并给自己发送另一个AI消息。你的想法是推迟绘制董事会。但你真正想做的是推迟人工智能的发展。这是一个微妙但非常重要的区别。
重要的是要记住,董事会和它的“状态”总是存在。但任何消息都可以随时发生:如果用户在AI思考时点击?没问题,董事会告诉你轮到谁了。如果你需要绘制窗口,因为它被移动了?没问题,董事会就在那里,无论轮到谁。人工智能太快了?没问题,只需在更新电路板之前保持旋转一段时间。人工智能太慢了?没问题,让它考虑一下,再次发送一个展板和AI。
我希望这能解释一下你应该关注的概念。睡眠或线程与它无关。他们是优化。人们接近这种方式的一种方式称为MVC,模型,视图,控制器。在这种情况下,模型将是董事会状态,包括轮到它。视图是你的GL代码。玩家和AI都是控制器。
但首先,如果你从这里拿走一件事:GUI不是顺序的。任何事情都可能随时发生。消息队列是一种处理此问题的简单方法。
我有点好奇你正在使用哪种语言和操作系统,如果我知道的话,我可能会提供更好的例子。你使用OpenGL的任何框架吗?
答案 1 :(得分:0)
C ++ 11提供this_thread::sleep_for()
作为线程支持库的一部分
如果您无权访问C ++ 11,可以尝试POSIX Threads libraries