2015-11-02 104 views
-3

我非常需要一些指導。我需要編寫一個Connect 4的遊戲程序,其中將使用線程併發編程。我需要自己學習,並在一週內編寫這樣的程序。我不知道如何在這個時候實現併發部分,以及我應該尋找哪些資源...希望你能對此有所瞭解......C++遊戲,線程和併發編程

+1

如果你在做連接4和你*需要*線程,我真的不知道你在做什麼。這樣的遊戲的計算要求應該基本上什麼都不是。查看事件循環模型。使用線程來處理這樣的事情是一個不好的先例,並且會導致你成倍增加複雜性而沒有真正的收益。 – tadman

+0

我也不知道。這就是教授給我們的,我們被告知要靠自己學習。我甚至不知道要尋找哪些資源。 – MLAC

+0

第一次使用像['std :: queue'](http://www.cplusplus.com/reference/queue/queue/)這樣的容器來推送需要注意的操作,並且有一個事件循環來處理這些。根據用戶交互或您的需求定義您自己的事件基類和子類。爲了更深入的介紹,[Game Engine Architecture](http://www.gameenginebook.com/)就是你想要的書。 – tadman

回答

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(); 
} 
+0

非常感謝。你是我的英雄,你是唯一回答這個問題的人。 – MLAC