2014-10-29 88 views
0

我試圖創建一個基於文本的冒險遊戲。我想我想讓地圖由不同的節點表示,其中每個節點對應一個不同的位置,並且有指向另一個節點的節點指針變量(左,前,右)。我試圖把它作爲一個鏈表來實現,但是通過這個數據結構,我只能讓每個節點指向另一個節點。我希望每個節點指向其他三個節點。我可以使用哪種數據結構來實現這一點,或者甚至可以實現?C++基於文本的遊戲 - 「地圖」實現

+1

修改您的數據結構以使四個節點指針指向左側,右側,前進和下一個。 – 2014-10-29 09:52:23

+1

您不需要名稱來實現數據結構。只要讓每個節點指向另外三個節點即可。或者,也許是四個,如果你想讓你的角色能夠回去。 – 2014-10-29 09:53:26

+0

如果每個節點都有三個指針,我將如何將每個指針添加到列表中?每次生成地圖時,地圖都必須相同。 – GreatBambino 2014-10-29 09:55:17

回答

1

您可以實現自定義的數據結構鏈接與地圖上的鏈接位置是這樣的:

struct Map_Node{ 
    Map_Node *left; 
    Map_Node *right; 
    Map_Node *forward; 
    /* other needed field*/ 
}; 

然後,你需要做的內存管理你自己的。例如通過使用智能指針。

std::shared_ptr<Map_Node> entry{ new MapNode }; 
std::shared_ptr<Map_Node> hallway{ new MapNode }; 
entry->forward = &*hallway; 
//and so on 

獲取下一個文件更簡單但效率更低的是std :: map。如果每個位置 具有其唯一的ID,例如一個字符串,您可以存儲相鄰字段的ID並使用該ID在地圖上自由移動。

struct Map_Node{ 
    std::string name; 
    std::string left; 
    std::string right; 
    std::string forward; 
    /* other needed field*/ 
}; 

std::map<std::string, Map_Node> map; 
Map_Node entry; 
entry.name = "entry"; 
map[entry.name] = entry; 

Map_Node hallway; 
hallway.name = "hallway"; 
map[hallway.name] = hallway; 

//links between: 
map["entry"].forward = "hallway"; 
+0

我幾乎只是寫這個(儘管我用N,S,E,W) – Baldrickk 2014-10-29 10:23:30

+0

@Baldrickk對於像N,S,E,W這樣的簡單方向,人們可能會想到關於使用簡單的二維日期結構(向量,數組或其他)。 – tgmath 2014-10-29 10:26:13

+0

嗯,我的意思是我用了N,S,E,W而不是左邊,右邊......使用一個矢量雖然很好,例如:你可能決定有多層,在這種情況下,節點(向上和向下)。在這種情況下,你可能想要存儲一個'std :: vector >',這樣你就可以命名每個連接。 – Baldrickk 2014-10-29 10:32:04

2

鏈接的數據結構會做這樣一個好工作,你想要什麼:

例如:

class location 
{ 
    std::string loc_name; 
    std::vector<std::pair<std::string,location*>> connections; 
    std::string description; 
public: 
    bool add_link(location* loc, std::string dicription_to, std::string dicription_from); 
    //other parameters + functions to manage class 
} 

這將允許您創建,如地點:

location* loc = new location("graveyard"); 
loc->description = "A spooky graveyard on a hill, a cool mist floats amongst the gravestones and monuments"; 
loc->add_link(crypt /*previously defined*/, 
       "An imposing mausoleum with an open door, steps inside lead down into darkness", 
       "Moonlight filters down from the top of some steps, a way out?"); 
loc.add_link(spooky_house /*previously defined*/, 
       "The North gate of the graveyard", 
       "The entrance to the house's spooky graveyard"); 

我推薦創建一個你可以閱讀的地圖文件。可能使用的模板是這樣的:

位置文件:

/*locations, format = "name; description"*/ 
Spooky House; house_description 
Crypt;  crypt_description 
Graveyard; A spooky graveyard on a hill, a cool mist floats amongst the gravestones and monuments 

鏈接文件:

/*links, format = "index # (from); index # (to); description (from->to); description (to->from)"*/ 
3;2;An imposing mausoleum with an open door, steps inside lead down into darkness; Moonlight filters down from the top of some steps, a way out? 
3;1;The North gate of the graveyard;The entrance to the house's spooky graveyard; 

載入地圖是那麼簡單,閱讀中的所有位置,並推入一個矢量存儲,然後添加鏈接來連接它們。

+0

當我嘗試構建程序時,出現錯誤:'bool location :: add_link(location *)'是私有的 – GreatBambino 2014-10-29 14:24:08

+0

類的成員默認是私有的,您需要添加一個'public:'lable使他們可訪問(更新的答案顯示一個'add_link'函數) – Baldrickk 2014-10-29 14:28:08