我正在使用OpenGL图形在C++上编写游戏(Othello),并且在用户放置游戏后,我需要一些东西来“等待”或“休眠”游戏。用户播放后,CPU播放速度太快,因此看不到用户的移动。我尝试了睡眠功能,但无法正常工作。基本上,这个想法是:
播放器插入新片段
----睡眠1秒钟----
CPU插入一块新的
有什么办法吗?
最佳答案
我假设您只是在学习编程。您正在发现重要的一步。
人们编写的第一个代码很可能是在控制台上写的,并且是连续的:写一个问题,等待输入,做点什么。打印输出。很好,许多程序都是这样工作的。
不幸的是,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思维的一部分是,如果AI太快,您可以在那里等待时间。关键是您可以随时显示面板,无论是用户还是AI转向。
所有GUI操作系统还具有仅在一定时间后才发送消息的方法。但是即使没有,您也可以轻松地做到这一点:如果收到一条AI消息,则AI知道该怎么做,但还没有时间,就是什么都不做,再给自己发送另一条AI消息。您的想法是推迟制定董事会。但是,您真正想做的是延迟AI使其移动。这是一个微妙但非常重要的区别。
重要的是要记住,董事会及其“状态”始终存在。但是任何消息都可以在任何时间发生:如果用户在AI进行思考的同时单击?没问题,董事会会告诉您轮到谁了。如果由于移动而需要绘制窗口吗?没问题,无论轮到谁,董事会都在那儿。 AI太快了吗?没问题,在更新电路板之前,请保持旋转一会儿。 AI太慢了吗?没问题,请三思而后行,再次发送展示板和AI。
我希望这可以解释您应该考虑的概念。睡眠或线程与此无关。它们是优化。人们采用这种方法的一种方法称为MVC,模型, View , Controller 。在这种情况下,模型将是板状态,包括轮到谁。 View 是您的GL代码。玩家和AI都是 Controller 。
但是首先,如果您不做任何事情:GUI不是顺序的。任何时候都可能发生任何事情。消息队列是解决此问题的简单方法。
我有点好奇您使用的是哪种语言和操作系统,如果我知道这一点,我可能会给出更好的示例。您是否为OpenGL使用任何框架?