我打算写一个游戏(如果你听说过它叫做“Qwirkle”),其中一个二维游戏场存储了玩家放入其中的宝石的位置。第一个玩家将石头放在任何地方,其他玩家可以从任何一侧(左/右/上下)连接到它。游戏领域本身不限于固定大小,这会破坏游戏理念。但是,宝石的数量限制为玩家在开始时可以定义的值。
由于游戏逻辑,我需要使用索引循环遍历宝石。但是,由于玩家可以从任何一方添加石头,我需要一个可扩展到任何方向的列表(例如,进入负向和正向索引方向)。
性能并不重要,因为我需要一次检查几块石头。
当然,最好的方法是使用像_stones [-3,5]这样的石头来访问位置-3,5处的石头。
我认为可以从任何一侧推送和弹出的堆栈(如PushBack / PushFront)对此有用,但我不太确定如何在C#中实现它。
是否有预先实现的列表/堆栈,就像我正在考虑的那样,或者我的方法是否完全奇怪?
答案 0 :(得分:5)
您需要的数据结构是不可变四叉树。如果电路板大部分是空的那么使用不可变四元组使您能够代表基本上无限大的电路板;一个万亿分之一亿的单元板比32×32单元板只需要几个字节的内存。不可变四叉树可以很容易地以你描述的方式编入索引,并且在给定旧的四叉树和编辑的情况下计算新的四叉树很简单。
多年来我已经多次编写了不可变的四叉树算法,并且很长一段时间我一直在做一系列关于它们的博客文章,但我从来没有。当我这样做时,我会回来更新这个答案。
与此同时,Dobbs博士关于Gosper算法的文章是我用来学习不可变四叉树如何工作的文章。
http://www.drdobbs.com/jvm/an-algorithm-for-compressing-space-and-t/184406478
答案 1 :(得分:2)
你想要的是double ended queue(被称为deque,发音为“deck”)。 .NET BCL没有实现(不幸的是),但有第三方实现(见谷歌)。
答案 2 :(得分:0)
字典可以是一个选项,而不是考虑列表的索引,你可以想到字典的整数键。不管是什么维度。
Dictionary<int,Dictionary<int,Stone>> stones = new Dictionary<int,Dictionary<int,Stone>>();
// do some initialisation for the base field size ...
// access it this way
Stone s = stones[-1][-5];
唯一的问题是当您想要添加可能消耗资源的第二维时(迭代所有第一维)。
答案 3 :(得分:0)
我认为您将从实现包含两个ArrayLists的自定义数据结构中学到更多。一个前进,一个后退。当然,在你的实现中,它们都会采用相同的方式,但是你的实现可能会让数据结构返回正索引加一,这样你就不会得到后向ArrayList中第一个元素的索引-0
也许我误解了这个问题,但这就是我如何实现双向可扩展数据结构。
祝你好运!答案 4 :(得分:-1)
您可以执行以下操作:
_stones [ - (i),i]和/或_stones [i, - (i)]
只是一个建议。