当前位置: 代码迷 >> Java Web开发 >> 网游中,关于物件相关的设计
  详细解决方案

网游中,关于物件相关的设计

热度:4577   发布时间:2013-02-25 21:07:40.0
网游中,关于物品相关的设计。
 1. 场景描述:相信大家都接触过各种类型的pc网游,每一个网游中都会有相应的商城系统。商城中有各种各样的物品,而这些物品的出售方式
 各有不同,有些是单个物品上架,而有些是一个“优惠包”,一个“优惠包”中包含多种物品。
 
 2. 问题:
  1. 单个物品在数据库中设计比较直观,“物品表”关联“物品类型表”。
  2. “优惠包”如何设计,应不应该作为一种物品类型?
  3. 关于这种“优惠包”打开之后获取的物品也是游戏系统定义的基本物品,那么“优惠包”如果作为一种物品类型,跟物品的关联关系用什么方式体现会更加好?
------最佳解决方案--------------------------------------------------------
2.优惠包就是一个道具类型,一种使用以后可以得到其他物品的道具
3.一个字段存可以获得的道具编号列表,你加载到内存里的时候直接通过这个字段生成对象
类似

Pack exnteds Goods{
List<Goods> list
}

这样玩家使用这类道具的时候,直接给他加list里的东西就行了
至少我们是这么做的
------其他解决方案--------------------------------------------------------
引用:
引用:物品表的关系尽量应该简单.
所以这种优惠包,应该单独作一个表,每个优惠包一条记录,该记录的"物品列表"是一个可以用逗号分隔的值列表,对应物品表的多个物品编号.

引用:2.优惠包就是一个道具类型,一种使用以后可以得到其他物品的道具
3.一个字段存可以获得的道具编号列表,你加载到内存里的时……

这个很简单啊,你在字符串里把数量也存进去,甚至可以存额外属性,比如要奖励玩家一把有特殊属性的武器什么的
String data = "id=100001,amount=5;id=100002,extraAttack=100;";
这样
比如第一个道具是一个药品,第二个道具一把武器
因为药品和武器必然是两个类(当然如果你们设计不是这样,当我没说)
通过id直接就能知道id=100001是Medicine,id=100002是武器
这两个类各自写自己的parseExtraInfo来对,后面的数据进行赋值就行了
------其他解决方案--------------------------------------------------------
没错,我之前没注意到4楼已经说出我的意思了.现在10楼又完全同感.
应该说在很多应用里这其实是一种很常见的用法了.
只是对新手来说,总会认为一个字段里就应该存储一项内容,对复合内容的字段缺乏意识,否则这是很好理解的.
分解字串很简单,要想更简单,还可以使用JSON格式,了解它你就知道这种复合结构数据的应用之广泛.
------其他解决方案--------------------------------------------------------
关联物品表吧
------其他解决方案--------------------------------------------------------
物品表的关系尽量应该简单.
所以这种优惠包,应该单独作一个表,每个优惠包一条记录,该记录的"物品列表"是一个可以用逗号分隔的值列表,对应物品表的多个物品编号.
------其他解决方案--------------------------------------------------------
,该记录的"物品列表"字段是一个....
------其他解决方案--------------------------------------------------------
?好郁闷啊,没人回吗?
------其他解决方案--------------------------------------------------------
顶起,顶起,顶起
------其他解决方案--------------------------------------------------------
首先要看你设计物品的时候,有没有考虑“能包含其它物品的物品”,所谓容器。

如果有,那么才会有衍伸的: 包裹关系表(包裹ID,物品ID,物品数,位置)
------其他解决方案--------------------------------------------------------
受4楼、5楼的建议,思考中……
------其他解决方案--------------------------------------------------------
引用:
物品表的关系尽量应该简单.
所以这种优惠包,应该单独作一个表,每个优惠包一条记录,该记录的"物品列表"是一个可以用逗号分隔的值列表,对应物品表的多个物品编号.


引用:
2.优惠包就是一个道具类型,一种使用以后可以得到其他物品的道具
3.一个字段存可以获得的道具编号列表,你加载到内存里的时候直接通过这个字段生成对象
类似
Java code?1234Pack exnteds Goods{List<Goods> list}
这样玩家使用这类道具的时候,直接给他加list里的东西就行了
至少我们是这么做的



这样做还会有一个缺点,无法表示 该优惠包中的某一种物品是几个!
------其他解决方案--------------------------------------------------------
非常感谢,小弟受益匪浅啊!!
------其他解决方案--------------------------------------------------------
引用:
没错,我之前没注意到4楼已经说出我的意思了.现在10楼又完全同感.
应该说在很多应用里这其实是一种很常见的用法了.
只是对新手来说,总会认为一个字段里就应该存储一项内容,对复合内容的字段缺乏意识,否则这是很好理解的.
分解字串很简单,要想更简单,还可以使用JSON格式,了解它你就知道这种复合结构数据的应用之广泛.


10楼的做法未必可取,此类结构违反 1NF 范式。

不是绝对不行,但如果你需要进行反向搜索时,就会碰到严重的性能问题。
------其他解决方案--------------------------------------------------------
引用:
引用:没错,我之前没注意到4楼已经说出我的意思了.现在10楼又完全同感.
  相关解决方案