gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:48:12 25 4
gpt4 key购买 nike

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

我实际上正在为学校开发一个游戏项目,一个类似炸弹人的 C++ 游戏。我正在设计 Map 对象,它包含 Bombs、Boxes、Players 和 Walls。 map 是二维的,我已经有 2 个类型的容器:

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

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

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

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

playerOn(const int x, const int y);

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

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

(比较头疼的是大 map 上单次可以超过500人,这就是我寻求优化的原因)

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

编辑我的问题

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

最佳答案

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

1) 你的 unordered_maps 看起来像很多过度工程。 your previous post 中提供的答案是真的,但我认为这对你来说没用。当 n = 500 时,您绝对不关心 O(log(n)) 成本。只需制作一个 Entities* vector 即可。足够了。

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

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

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

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

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

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

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

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

关于c++ - 为我的球员名单选择最佳结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16608035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com