网游游戏背包设计

背包

业务需求

网络游戏游戏背包的表现为一堆格子,格子可以空着,也可以被物品填充。背包的情况储存情况可以被持久化。

  1. 一个物品占一个格式
  2. 一个物品占多个各种

物品唯一id

如果背包系统比较简单,可以只用物品配置id和物品数量来表示背包中的物品。但是很多情况下背包里会有许多物品配置id相同的物品,物品可能还会附加一下特殊属性。所以游戏中物品的唯一id就显得很有必要。

格子的数据结构

数组结构

数组结构能简单直观地模拟背包容量的真实情况,一般数组下标代表格子的位置,数组元素代表具体背包物品。在算法上,01背包问题是一个经典的动态规划算法问题,而01背包就是用一个简单的数组来模拟背包(游戏中的背包大多是一维数组,而背包算法问题中的数组一般是二维数组)。

背包查找

受限于数组结构,数组背包在查找时需要遍历背包元素,找出符合要求条件的物品。所以当背包数组十分庞大时,性能上就会受到影响。

背包变化

物品的添加需要遍历数组寻找空位插入。扣除时需要遍历数组寻找到符合条件的位置和物品。

背包整理和排序

数组可以直接排序,遍历数组,将分散的物品按特定的顺序重新放入数组,将可以叠加的物品叠加起来。

map结构

map结构模拟背包,可以用格子位置组作为主键,物品本身作为值。

背包查询

因为使用map结构,能够迅速索引出背包中的物品。

背包变化

背包物品的添加和扣除比较方便,只要知道物品的位置和数量就行。

背包物品的变化量

每一次背包物品的变化都需要同步给前端,但是每次都把所有背包信息数据同步过去无疑是毫无必要的,所以最好的办法是只同步改变的变化量。

变化标志

使用数组数据结构的背包: 背包物品添加、减少、交换位置时,使用一个或者多个变化标志记录记录格子空间的变化。当背包发生改变时,只同步变化标志记录中的。当背包整理时,变化标志会被重置。

使用Map数据结构的背包:背包物品添加、减少、交换位置时,背包物品唯一id或者配置id的数量变化会被变化标志记录,同步时只发送这部分的数据。

背包数据储存

背包数据与玩家关联密切,所以一般以玩家唯一id作为主键,储存整个背包。

使用关系型数据库,如Mysql数据库时,一般直接用Lob类型字段储存。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值