如何管理小数据变体?

时间:2009-12-28 21:22:57

标签: design-patterns multiplayer

我目前正在构建一个多人游戏系统,我有一个关于如何在很多对象之间管理很多小数据变量的设计问题。

我将从一个例子开始:假设我有3名球员:A,B和C. A与B友好,C与敌人友好。这意味着,我必须向C表明A是敌人而B是A是友好的。 现在我有2个不同(但很小)的相同数据变体。这只是一个例子。另一个变化是A进入隐身状态,B可以看到A,但是C不能看到A. 如上所述,这些仅仅是一些例子。计划有更多不同的玩家数据状态,主要是在每个对象之间变化。

我该如何管理?大量的if块,还是有一些我错过的明显的设计模式?由于这是一款多人游戏,因此不仅仅有3个玩家/对象或状态。

3 个答案:

答案 0 :(得分:1)

嗯,一个玩家的课程,以及一个朋友列表和一个敌人列表。

这可能是一个非常简单的问题,也可能是一个非常复杂的问题;如果真的很复杂,你还没有给我们足够的东西继续下去。

答案 1 :(得分:1)

如果您正在努力解决这个问题,那么最好的办法就是尽量掌握面向对象的编程。您似乎没有明确的模型来说明您需要存储哪些状态数据。尝试绘制游戏的“状态”;将其视为游戏中特定对象存在的最小快照,以及它们的组织方式。像player.canSee(otherPlayer)这样的东西可以计算出来,不一定需要存储。

即使您可能根本不使用数据库,您可能会发现使用关系数据库设计进行一些阅读和练习会很有帮助。关系设计的概念将帮助您以清晰,一致的方式组织您的想法和存储信息。

答案 2 :(得分:1)

你的问题是认为国家是人们可以看到的所有排列。一般来说,你应该把国家视为情况的事实,并在需要时计算这些事实的个人观点。

// pseudocode - make it properly object oriented for best results
struct player
{
    int teamNumber;
    bool hidden;
};

bool is_friend(player other_guy)
{
    return me.teamNumber == other_guy.teamNumber;
}

bool can_see(player other_guy)
{
    return (is_friend(other_guy) || !other_guy.hidden);
}

如果一个玩家(例如A)无法看到另一个玩家(例如B),那么在情况发生变化之前,您就不会向玩家A发送玩家B的信息。