为我的球员名单选择最佳结构

时间:2013-05-17 11:37:15

标签: c++ algorithm c++11 containers std

我在为数据选择最相关的结构时遇到了麻烦,以下是解释:

我实际上正在为学校开展一个游戏项目,一个像c ++这样的炸弹人游戏。 我正在设计Map对象,它包含炸弹,盒子,玩家和墙壁。 地图是2D,我已经有2个类型的容器:

std::unordered_map<int, std::unordered_map<int, AEntity*> > *UMap;

一个包含墙壁,另一个包含可破坏的物体(炸弹,盒子)。 我已经在这里讨论了这个选择 - &gt; Choice of unsorted_map。 它主要用于快速访问时间,因为每个地图框只能有一个元素。

现在标题显示我在为我的玩家选择数据容器时遇到了麻烦,因为在一个地图的框中可能有多个玩家,因此无法使用无序的地图。

我第一次使用std::list<AEntity*>排序std::sortedAEntity包含实体信息(coords),但在编码我的时候

playerOn(const int x, const int y);

功能我发现这是一个糟糕的选择。我无法使用二分法快速检索哪个玩家在给定的盒子上,如果没有这个盒子的玩家则浪费时间。

如何存储我的(AEntity)玩家以便能够快速检索

(在发痒的事情上,一次可以有超过500名玩家,在大地图上,这就是我寻找优化的原因)

我的脑汁用完了。感谢您将来的答案。

编辑我的问题

这主要是因为我想知道是否还有另一个解决方案可以通过我的整个std ::播放器列表来查找盒子上是否有人(x,y)。看起来很慢但没有优化,但我无法想出另一种方法来做到这一点。 (如果需要,我可以更改容器类型)

1 个答案:

答案 0 :(得分:2)

首先,before trying any optimization,您应该分析您的代码以检测瓶颈在哪里。你会感到惊讶。一旦说到:

1)你的unordered_maps似乎有很多过度工程。 your previous post中提供的答案是正确的,但我认为在您的案例中它没用。当n = 500时,你绝对不关心O(log(n))成本。只需创建一个Entities*的向量。这已经足够了。

2)你似乎陷入god object反设计模式。炸弹人游戏是研究OOP的绝佳项目,因为它教你避免神对象的设计模式。确保每个类都有自己的业务,没有类处理所有逻辑(我怀疑你的类Map或Game有太多的权力)。

a)创建一个玩家矢量,一个炸弹矢量,一个墙壁矢量,一个火焰矢量等。

b)Map应该是一个2维数组,存储指向每个Map框中存在的实体的指针列表。 (每个Map[i][j]都包含指向索引(i,j)框上所有元素的指针。

c)炸弹应该制造火元素。

d)你的中心例程应该是这样的:

while(gameContinued)  
{  
    for each entity in the game  
    {  
        entity.Update(map);  
    }  
    game.Render();  
}     

炸弹更新包括使炸弹的纹理呈现动态,并在延迟过期时创建火焰(并相应地使用火焰指针更新地图)。 除非延迟过期(并更新Map),否则Fire更新除了消失外什么也没有。 玩家更新包括移动键盘事件处理(并更新其当前内部x和y值),如果需要创建炸弹,如果他们的位置(x,y)死亡,Map[i][j]列表中有火实体。

3)在我的大多数学生实施炸弹人时,唯一可以得到的问题是纹理和对象的深层复制。确保你有一个纹理加载器(使用单例模式)以避免加载相同纹理的多次,你应该没问题。