1

我正在制作一个多人文本游戏,游戏中的每个玩家都被分配了一个库存。物品栏是一个简单的线性链表,包含物品的 ID 和物品在游戏中的状态。例如,玩家 1 可能有一辆带有 50% 燃料的红色汽车,它会在列表中表示为 (5, 50),其中 5 是游戏中红色汽车的 ID,50 是该特定汽车的燃料量车。

但这意味着游戏中每个项目的信息都应该保存在某种数据结构中。

我想过使用类似的东西

enum itemtype {car, gun, bullet, etc};
struct itemlist {
    itemtype type;
    char* name;
    int volume, weight;
} itemlist[];

红色汽车的所有信息(car, "Red car", 15m^3, 2000kg)都将存储在 中itemlist[5],因为红色汽车的 ID 是 5。

但是这个游戏中有不同类型的物品,所以每个物品都有自己的属性。汽车会有(max_speed, acceleration),子弹也会有(mass, velocity, kinetic_energy)。并且代码的某些部分需要访问这些特定属性才能在游戏中进行操作。

所以这意味着

  • 从库存中获取 ID
  • 检查数组以获取此类项目的特定属性
  • 用检索到的属性做事

但我不知道该怎么做,因为有不同类别的项目,每个项目都有不同的特定属性。

将数组添加到结构不会有帮助,因为属性可以是任何东西,例如字符串或数字。添加嵌套结构可能很好,但可能会尝试使用某些东西,item[5].properties.max_speed我不确定这是否安全,因为有人可能会尝试max_speed从没有它的项目中获取该属性。

那么,为此类项目列表存储一般和特定属性的最佳方式是什么?

4

1 回答 1

2

呃,也许我在这里遗漏了一些东西,但这不正是它的union目的吗?

使列表中的每个项目成为联合数据类型,如下所示:

struct itemelem {
    itemtype type;
    union {
        cartype c;
        bullettype b;
    };
};

在这种情况下,您将使用type来识别元素类型是什么,这样您就可以访问正确的联合说明符,有点像穷人的多态性:-)

于 2012-04-23T01:56:14.013 回答