1

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

我实际上正在为学校开发一个游戏项目,一个类似 C++ 的 Bomberman 游戏。我正在设计包含炸弹、盒子、玩家和墙壁的地图对象。地图是二维的,我已经有 2 个类型的容器:

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

一个包含墙壁,另一个包含可破坏的对象(炸弹、盒子)。我已经在这里讨论过这个选择 ->选择 unsorted_map。这主要是为了快速访问时间,因为每个地图的盒子只能有一个元素。

现在,正如标题所暗示的那样,我在为我的玩家选择数据容器时遇到了麻烦,因为一个地图的盒子上可以有多个玩家,unordered_maps 不能使用。

第一次我打算使用std::list<AEntity*>sorted with std::sortedAEntity包含实体信息(坐标),但是在编码我的

playerOn(const int x, const int y);

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

我应该如何存储我的 (AEntity)Players 以便能够快速检索它们

(最让人头疼的是,在大地图上,一次可以有超过 500 名玩家,这就是我在寻找优化的原因)

我的脑汁快用完了。感谢您未来的回答。

编辑我的问题

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

4

1 回答 1

2

首先,在尝试任何优化之前,您应该分析您的代码以检测瓶颈在哪里。你会感到惊讶。一旦说:

1)您的 unordered_maps 似乎有很多过度设计。您在上一篇文章中提供的答案是正确的,但我认为在您的情况下它是无用的。当 n = 500 时,您绝对不关心 O(log(n)) 成本。只需制作Entities*. 这已经足够了。

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

a) 创建玩家向量、炸弹向量、墙壁向量、火向量等。

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

c) 炸弹应该产生火元素。

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

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

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

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

于 2013-05-17T15:59:51.297 回答