2011-09-17 197 views
3

我有一個非常簡單的棋盤遊戲我已經建立在C++中。目前,玩家被分配取決於玩家在遊戲數量選手編號(1,2,3 ... N)。相當標準。球員和他們的數據保存在一個文件中,其中包括他們的名字和他們的號碼。然後我通過用轉向文件讀取一個目錄來處理轉向。轉牌由球員提交併且只包含他們的球員名字和他們的任務/轉身。將來,我打算讓玩家號碼改變,以便混合遊戲的順序。提高棋盤遊戲依次處理

(如果你是一個遊戲玩家板,認爲凱呂斯或阿格里科拉)

玩家在應用程序開始讀入。然後我給出一個命令並進行處理。基本上,我只是簡單地閱讀轉牌的目錄,一個一個,然後把這個轉換成一個球員的名字。就目前而言,依次沒有訂單處理。播放器3可播放2.

走之前我想這是不是一個偉大的設計,所以我想出了以下解決方案:

  • 因爲我比較了該轉向與哪個球員,插入變成std::map<int, Turn>,關鍵是玩家數量。
  • 後,我收集所有的圈,搜索玩家N,從1開始,地圖中和處理輪到他。
    • 我在這裏再次遍歷玩家列表,因爲我需要將玩家與玩家號碼進行匹配,以便處理回合。
  • 這樣做,直到我處理的所有玩家。

有沒有更好的方式來做到這一點?這似乎是kludgey和大量的開銷。

謝謝!

注:輪到處理方法需要在一個Player class(其表示播放器的統計信息文件)和一個struct表示從轉文件中讀取轉彎。

+1

由於玩家人數少,因此迭代簡單的數組類型可能已經足夠了。在這種情況下,複雜的結構往往比原始的結構慢。 –

回答

1

您可以考慮爲輪到他的玩家定義一個Action類,該玩家由玩家號碼和轉數定義,並定義該類的比較。閱讀文件中的所有操作,將它們插入到有序列表中,然後處理這些操作。

+0

我想我可能會走這條路。我可以根據玩家數量爲矢量創建一個簡單的排序函數,並處理加載到該玩家的轉向。 – Robb

2

所以,按照我的理解,你的問題是你有鏈接數據的你位:Turn S,PlayerID S和PlayerTurnPosition S(OK後2是整數,但我會假設你已經他們的typedef-ED的東西這樣可以避免混淆)。並且您希望保持從PlayerID和PlayerTurnPosition值到對應的Turn的查找,並且還保持Player信息之間的雙向關係。

這只是尖叫出來使用boost::bimap與每對關係附加一些額外的信息;像

boost::bimaps::bimap< 
    boost::bimaps::vector_of<PlayerID>, 
    boost::bimaps::vector_of<PlayerTurnPosition>, 
    boost::bimaps::with_info<boost::shared_ptr<Turn> > 
    > 

應該做的工作很好(雖然有左/右視圖容器類型的其他選項; set_of可能更有意義給予playerIDs和位置大概是唯一的)。

這類with_info使用示例in the docs

+0

很好的時間來嘗試bimap!謝謝蒂姆! – Robb

+0

嗯實際上bimap可能不會讓我到我想要的地方。有第四條數據,這是播放器狀態數據。這可能是我糟糕的設計。 – Robb

+0

那麼如果你只需要從PlayerID到PlayerStatus,那麼不能將它存儲在另一個表中嗎?當然,如果你真的需要從玩家身份查找玩家ID ......那麼總是有boost :: multi_index - http://www.boost.org/doc/libs/1_46_1/libs/multi_index/doc/index。 html - 這是bimap的泛化。儘管(恕我直言),使用起來要麻煩得多。 – timday