跳转到主要内容

固体:集合

有些物体是其他物体的集合或汇集。你可能有一束花、一副牌,或者一沓钞票。按照不拆解的原则,它们都应当被当作单一的物品。不过,这三者照此处理都有问题。

只要世界上任何地方都没有单枝的花,一束花就没问题。可是放进一朵玫瑰,你就等于承认了“没成束的花”这个概念。于是玩家就想从花束里把花拿出来。

一副牌只在没人拿它玩牌时才存在。既然牌本来就是用来玩的,人们想把整副牌发出去,你很难怪他们。可一旦发牌,突然就出现了 52 张单独的牌(外加大小王),而那一副牌没有了。只有等有人把所有牌收齐,你才会重新得到一副牌。

一沓钞票的价值事关重大。你也许愿意允许玩家在海滩上随意捡卵石,但不能让他们那样从一沓钞票里一张张往外抽,否则他们转眼就富了。可是,如果你把一沓里的每一张钞票都做成单独的物体,你又怎么指称那一沓?你能把它一分为二,得到两沓吗?

这些问题之所以出现,是因为玩家很多时候会在某个层次上考虑物体,但碰上相似的物体(尤其是这类物体),他们喜欢把它们堆在一起,当作一个抽象的整体来对待。设计者必须决定要不要容许这种没有实际功能的组合体,如果要,又该如何处理它们。

办法有两种,前几段已经暗示过了。第一种是:把构成一个集合的所有物体都一一枚举出来,但根据持有的数量把它们作为一个集合来呈现。如果你的物品栏里有三张扑克牌,它们就分开显示;如果你有七张,它们就显示为“一手牌”;如果你有 52 张(外加大小王),它们就显示为“一副”。同样,如果你有一朵玫瑰和一朵郁金香,你就是有一朵玫瑰和一朵郁金香;如果你有一朵玫瑰、一朵郁金香和一朵水仙,你就是有了“一束花”。个体何时成为(或不再成为)一个集合,这一标准由设计者定下。

第二种办法是使用生成器。花园里的花、树上的坚果、蝗群里的蝗虫实在太多,把它们一一枚举毫无意义。玩家想要一个,系统就给他一个。数量实际上是无限的。对于这类集合,一个分发函数(dispenser function)会在每次从集合中取出东西时创建一个新实例;当一个实例被归还(或者两个集合合并)时,送进来的物品会被删除,集合则保持原样 1。如果一个图形世界用卵石贴图铺出一片海滩,角色就可以用这种方式把卵石捡起来。贴图不会改变,但角色得到了一个他此前没有的物体。

集合被用作一定数量物体的简写。可以(但并非必须)给它们一些单个物体所没有的属性——比如让一整套泡泡糖收藏卡的价值,远大于其中每张卡片价值的总和。哦,对了,世上所有其他设计者都想到过:把太多铀片凑成一个集合,就会引发一场原子爆炸。


  1. 注意,程序员在这里走错一步,就会碰上复制物品(duping)之类的 bug,而这类 bug 是许多虚拟世界的祸根。 ↩︎