游戏服务器背包设计与开发

在游戏开发中,游戏背包是一个非常重要的功能,游戏服务器背包设计是的非常重要的,它要防止一些bug。几乎每个复杂点的游戏都会有背包的功能。不管是手游戏还是网页游戏,不管是SLG游戏,还是ARPG游戏,背包是必不可少的。背包的功能根据策划的要求,有的简单,有的复杂。以下我们就讨论一下几种游戏服务器背包设计与开发的实现。

1,简单的游戏背包设计

简单的游戏背包到底简单到什么程度呢?那么这个游戏背包只是用来存放物品,不需要记录物品在背包中的位置,只需要记录物品的id和物品的数量即可。这样的游戏背包设计起来非常方便,在数据库中一个物品占一行即可,例如:

当获得物品的时候,先查看这个物品是否已存在,如果不存在,则创建一个物品的对象,并插入到数据库,如果这个物品对象已存在,则只需要更新物品的数量即可。而在客户端显示的时候,是否可叠加,叠加上限是多少,由客户端自己去计算就可以了。使用物品的时候,只需要更新相应的数量即可。另外一个要求是要检测背包是否满了,我们只需要在初始化背包的时候记录一下背包的最大格子数和已使用的格子数就可以了。如果获得的物品在背包中不存在或叠加数已满,且没有剩余的格子则返回背包已满的提示。

2,有特殊物品的游戏背包设计

再复杂一些的背包是,有一些特殊的物品,比如装备,装备一般都是可以镶嵌宝石的,这样的话每个装备的id是不能相同的,即使是同一件名字一样的装备,它也要有一个唯一标识的id。这样就需要我们在放入物品的时候给物品生成一个唯一的id标识。生成唯一id的算法之前也介绍过,可以参考:http://www.youxijishu.com/h-nd-147-0_35.html(游戏服务器生成全局唯一ID的几种方法)但是这些方法感觉用在生成背包物品唯一id上有点大材小用了。我们再提供一个方法,以供参考:

唯一id用一个long类型存储,long类型有64位,我们使用它的低32位存储策划配置的物品表中的物品id,高32用来记录每获得一个物品就自增加1的序列order,即

Int itemBaseId = 10001;//配置表中的物品id

Int order = 1;//每获得一个物品这个序列自增加一,每个游戏背包都有自己的order,这样可以减少并发对order的增加。

Long itemUid =(((long)order)<< 32)+ (long)itemBaseId;

那么这个order怎么记录呢?这个order不用记录,那么当玩家退出后再进入游戏怎么得到这个order呢?我们在玩家登陆时第一次初始化游戏背包时,只需要从每个itemUid中拿出来每个物品的order,然后比较一个,得到最大的order做为起始order即可。这样可以从一个itemBaseId中获得一个order:

Int order = itemUid >>> 32;

而那些可以叠加,不需要唯一id的物品,只需要把它们的配置id转化为long存储即可。

这样在内存中,我们可以把所有的物品放入一个Hashmap中,获得新物品和使用物品也不用遍历查找,速度很快。

3,带位置索引的游戏背包设计

更为复杂的背包,就是需要记录物品在背包中的位置索引。一般这样的游戏背包都会带物品的位置交换和整理功能。这种背包麻烦的是那些可以叠加的物品,因为同一个物品可能会占多个格子,而且还不连续。

我们还利用上面第二种背包的唯一id方式,不过这里会多增加一个物品在背包中的位置索引,唯一id还是long类型,而long是由:orderId +位置索引+物品配置id组成。

比如:高25位为order,中间10位为位置索引(一个背包有一千多个物品也差不多了),剩余的29位存储物品的配置id,这些位数可以根据实际需要自己调整。

在内存中,我们用一个数组来存储所有的物品,每个物品占一个格子,数组索引即物品的位置索引。当获取一个新物品的时候,如果这个物品是不可叠加的,直接遍历数组,找一个空位置,利用这个索引和order,物品的配置id组成一个唯一的id放入即可。如果这个物品是可叠加的,需要用数组的0索引到最大索引和物品配置id一一组成唯一id查找对应的物品对象,找到之后判断是否叠加已达最大数,如果已达到,直接找个空格子放入,如果没有达到,直接更新数量,更新完数理再判断是否达到最大叠加数,如果达到了,需要把多余的再占一个格子。

在使用物品的时候,客户端传过来这个物品的唯一id,我们就能拿到它的数组索引,直接操作即可。这里还有个问题,就是在使用前可能需要判断是否足够,如果只用一个数组的话,需要遍历数组,计算这个物品的总数量。如果不想遍历的话,可以另外再加一个Hashmap,存储一个可叠加物品的总数量,即key物品配置id,value为当前这个物品的总数量。这样判断是否足够的时候就可以直接判断了。

目前最常见的就是这三种类型的游戏背包了,我在网上还看到有的设计是一个物品要占多个格子,这样的背包做的时候再考虑怎么设计吧。

在游戏背包中,还可能遇到一种情况,就是有些特殊物品,比如某个宝石,当把这个宝石镶嵌到装备上,会额外增加这个装备的属性加成。但是具体增加多少,是在获取宝石的时候,根据一定算法随机出来的,而且影响几个属性也是随机的。一般来说一旦随机之后,这些属性加成就不会再变化了,也就是说不会再更新了。那么在背包中我们就可以增加一个字段,存储这些数据,这些数据可以是一个单独的对象,然后序列化为byte[]存储到数据库的blob中,可是把这个对象转为json直接到text中。

这样就可以任意添加多个属性数据,而不用修改数据库各代码了。物品背包就可以统一管理了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • CREATE TABLE IF NOT EXISTS ecs_order_info (order_id mediu...
    cookie口阅读 15,663评论 0 16
  • 《高性能MySQL》&《MySQL技术内幕 InnoDB存储引擎》笔记 第一章 MySQL架构与历史 MySQL的...
    xiaogmail阅读 12,730评论 0 39
  • 原来,在我生活的地方不见你踪影…… 原来,你给我的承诺如同一本雨水侵蚀过的书本,已经凝成一团,无法再翻。
    芳之酿阅读 200评论 0 0
  • 我是谁?太难的命题,匆匆忙忙人世间,每个人或擦肩而过,或相守相偕,满眼看到的都是别人的好与坏,但从没想过我。...
    闻君儿阅读 172评论 1 0