2015-12-21 63 views
2

對於一個項目,我們有一個擴展網格,它加載了隨機塊。在這個塊中,我們放置了隨機對象。大塊的垂直和水平加載。玩家從0,0開始向上是0,-1向左則是-1,0。我想看看是否加載了一個塊。因爲該區域正在擴大,所以陣列不是一個選項,所以我在矢量選項中進行lookee。但向量不能有negative索引。我如何存儲一個網格(有2個可能的負值)和一個布爾值。我應該創建一個具有3個變量(2個整數和一個布爾值)的類,還是有其他選項,我可以使用某種具有負值的多維向量。具有布爾值的Cpp網格

+0

'std :: tuple' ?? – CinCout

+0

@aviginsburg其不斷擴張,其基本限於最小/最大可能的浮動價值。基於玩家的x,y位置(如果玩家移動超過20 x,新的chunck),Chuncks會被加載/銷燬。 –

+0

用代表座標的鍵的'std :: map'如何? –

回答

2

你可以使用一個map,例如:

typedef std::pair<int, int> coord; 
typedef std::map<coord, bool> coord_bool_map; 

用法:

coord_bool_map m; 
m[coord(-1, -3)] = true; 
+0

如何在一個類中包含這個解決方案(我認爲它非常漂亮),以便我們能夠爲它定義一個接口? (例如'chunk :: is_loaded()'或者類似的東西) – RichouHunter

+0

嗯,我想我不會這麼做,但這只是個人的品味。東西*是地圖,爲什麼不保留已經提供的界面? – alain

0

但是向量不能有負指標

沒有,但你可以翻譯指數與抵消。比方說,你有大小5的載體,其應該代表idices的一個維柵格從-2:... 2:

std::vector<T> grid = std::vector<T>(5); 
int offset = 2;    // the offset, also index of origin 
int start = -offset;   // first index 
int end = grid.size() - offset // one past last index 

// example use 
int index = -1; 
T element_at_index = grid[index + offset]; 

std::deque可能是從正面側擴大容器更有效。

當您展開正面時,請記得更新偏移量。

如果使用向量(或deques)向量,則需要兩個維度的偏移量。