我正在使用OpenGL图形在C++上编写游戏(Othello),并且在用户放置游戏后,我需要一些东西来“等待”或“休眠”游戏。用户播放后,CPU播放速度太快,因此看不到用户的移动。我尝试了睡眠功能,但无法正常工作。基本上,这个想法是:

播放器插入新片段
----睡眠1秒钟----
CPU插入一块新的

有什么办法吗?

最佳答案

我假设您只是在学习编程。您正在发现重要的一步。

人们编写的第一个代码很可能是在控制台上写的,并且是连续的:写一个问题,等待输入,做点什么。打印输出。很好,许多程序都是这样工作的。

不幸的是,GUI没有。它们大致分为三个独立部分:

  • 计算机正在运行(就像您的游戏中的AI)
  • 玩家正在做某事,例如单击棋盘上的棋子
  • 在屏幕上显示
  • 当前正在做什么

    现在,所有这些事情都可以在另一件事发生时发生。有些需要互相等待。但它们基本上可以随机顺序发生。混沌!如果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使用任何框架?

    09-26 22:26
    查看更多