【问题标题】:C++ game, threads and concurrent programming [closed]C ++游戏,线程和并发编程[关闭]
【发布时间】:2015-11-02 16:33:55
【问题描述】:

我迫切需要一些指导。我需要编写一个 Connect 4 的游戏程序,其中将应用线程并发编程。我需要自己学习并在一周内编写这样的程序。我目前不知道如何实现并发部分,以及我应该寻找哪些资源...希望您能对此有所了解...

【问题讨论】:

  • 如果您正在执行 Connect 4 并且您需要线程,老实说,我对您在做什么一无所知。这样的游戏对计算的要求应该基本没有。查看事件循环模型。将线程用于像这样基本的事情会开创一个不好的先例,并将引导您进入指数级增长的复杂性而没有真正的收益。
  • 我也不知道。那是教授给我们的,我们被告知要自己学习。我什至不知道要寻找什么资源。
  • 第一次使用类似std::queue的容器来推送需要注意的动作,并有一个处理这些动作的事件循环。根据需要定义您自己的事件基类和子类,例如用户交互或您拥有的东西。如需更深入的介绍,Game Engine Architecture 是您想要的书。
  • @tadman 我认为让“智能”电脑播放器成为线程很有意义。它模拟了两个人的游戏方式。他们会不断地考虑下一步行动——无论是在轮到他们的时候还是在他们等待对手的时候。这可以使用线程很好地模拟/结构化。然后主循环可以专注于处理游戏,即接收两个玩家的输入并显示结果。通过一些额外的课堂作业,可以轻松制作所有游戏组合,即人类与人类、计算机与计算机或计算机与人类。并与本地或远程播放器一起使用。
  • @StillLearning 我完全不能同意这一点。计算下一步的时间最多应该是一毫秒,在这里应用策略绝对是微不足道的。老实说,除了浪费 CPU 周期并造成巨大的复杂性之外,我真的不知道线程会在几秒钟内完成什么。

标签: c++ multithreading concurrency


【解决方案1】:

这个想法似乎是计算机玩家本身就是一个线程,而主线程正在处理游戏,即协调人类玩家和机器人玩家。

以下是一些(伪)代码,可以帮助您入门。

std::mutex m;
std::queue<int> from_opponent;
std::queue<int> from_robot;

void robotplayer(bool& go_on)
{
    bool wait_for_opponent = true;
    while (go_on)
    {
        int opponents_move;
        while (wait_for_opponent)
        {
            // Spend x milliseconds planning next move
            // ...
            // ...

            m.lock();
            if (!from_opponent.empty())
            {
                opponents_move = from_opponent.front();
                from_opponent.pop();
                wait_for_opponent = false;
            }
            m.unlock();
        }

        // ... calculate robots move
        // ...

        m.lock();
        from_robot.push(row_number);
        m.unlock();   

        wait_for_opponent = true;
    }
}

int main()
{
    bool go_on = true;

    std::thread robot(robotplayer, go_on);

    while(go_on)
    {
        // Wait for input from user (e.g. via cin)

        // Send move to robot
        m.lock();
        from_opponent.push(row_number);
        m.unlock();   

        // Update display

        // Check for a winner (i.e. set go_on = false)

        // Wait for input from robot

        // Update display

        // Check for a winner (i.e. set go_on = false)
    }

    robot.join();
}

【讨论】:

  • 非常感谢。你是我的英雄,你是唯一回答这个问题的人。
猜你喜欢
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
相关资源
最近更新 更多