使用C#XNA使用六边形网格制作游戏。地图大小可以是从每边6个单元到144的任何位置。使用一些几何数学,这意味着最大单元数为61,777! (我也在考虑每边最多216个细胞,总共产生139,537个细胞!)
我需要的是一种基于网格坐标访问给定单元格的有效方法。遍历整个列表,直到找到col == c和row == r的地方为止削减它。
数据结构也需要调整大小(因为击败一个级别意味着你去下一个地图,可能更大或更小)。所以我不能使用2D数组(如果我错了,请纠正我)。现在我正在考虑List,因为它确实有一个ElementAt<i>
。但是List<List<CELL>>
似乎很麻烦。 CELL的动态2D数组似乎是最好的,但除非我严重错误,否则这些数组需要在C#中固定大小。
请让我知道任何可能性的内部运作。列表如何存储他们的数据? (除了拿着指针---我需要知道任何其他开销)。它们是真正的随机访问还是ElementAt<i>
实际上迭代了一次以获得该元素?
我所拥有的其他激进思想就像二进制树,除了base-6之外,就像将地图分成六边形扇区一样,每个扇区都包含一堆单元格。然而,有了这些激进的想法,我无法理解任何实现细节:(
答案 0 :(得分:2)
您可以使用嵌套的List<List<T>>
。正如其他人所提到的,基于MSDN:
检索此属性的值是O(1)操作;设置 该属性也是O(1)操作。
我建议您编写如下所示的界面,然后在您决定稍后更改实施时实施它。
public interface IGrid<T>
{
T Get(int x, int y);
void Set(int x, int y, T value);
void Insert(int x, int y, T value);
void Remove(int x, int y);
}
public class Grid<T>: IGrid<T>
{
private List<List<T>> _data = new List<List<T>>();
public T Get(int x, int y)
{
return _data[x][y];
}
public void Set(int x, int y, T value)
{
_data[x][y] = value;
}
public void Insert(int x, int y, T value)
{
throw new NotImplementedException();
}
public void Remove(int x, int y)
{
throw new NotImplementedException();
}
}
然后你可以这样写:
var myGrid = new Grid<Cell>();
myGrid.Set(0, 0, new Cell("Blah"));
答案 1 :(得分:0)
我会使用词典
文件:http://msdn.microsoft.com/en-us/library/xfhwa508%28v=vs.110%29.aspx
用法:http://www.dotnetperls.com/dictionary
您可以使用您创建的对象(如Point对象)或类似字符串对其进行索引:
string key = r+","+c;
我会选择键作为字符串,因为它会更容易提高速度,使得点数不会太多。
考虑使用这样的字符串键来执行此操作:
dictionary Dictionary<string,Cell> = new Dictionary<string,cell>();
然后,您可以创建一个方法来创建密钥,以确保您始终获得正确的密钥
public string createKey(int row,int col)
{
return r+","+c;
}
public string createKey(Cell cell)
{
return createKey(cell.row,cell.col);
}
检索单元格时,您可以执行此类调用
int c=0;
int r=0;
Cell cell = dictionary[createKey(r,c)].doSomethingWithCell();
希望这有帮助