游戏服务器背包设计与实现

在游戏开发中,背包是一个非常重要的功能。几乎每个复杂点的游戏都会有背包的功能。不管是手游戏还是网页游戏,不管是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中。

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

如果觉得有用,请稍微打赏一点吧

时间: 2024-08-02 10:58:00

游戏服务器背包设计与实现的相关文章

大型多人在线游戏服务器架构设计

由于大型多人在线游戏服务器理论上需要支持无限多的玩家,所以对服务器端是一个非常大的考验.服务器必须是安全的,可维护性高的,可伸缩性高的,可负载均衡的,支持高并发请求的.面对这些需求,我们在设计服务器的时候就需要慎重考虑,特别是架构的设计,如果前期设计不好,最后面临的很可能是重构. 一款游戏服务器的架构都是慢慢从小变大的,不可能一下子就上来一个完善的服务器构架,目前流行的说法是游戏先上线,再扩展.所以说我们在做架构的时候,一定要把底层的基础组件做好,方便以后扩展,但是刚开始的时候留出一些接口,并不

棋牌游戏服务器架构设计

转载自:简书一位同行的文章 一,棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间中的人可以接收到其他人的消息. 3,每个房间的操作必须是顺序性 这个特性类似与一般游戏的回合制,每个玩家的操作都是有顺序性的. 二,需要解决的技术点 1,数据共享 因为棋牌类游戏不分区不分服,我们在设计服务器的时候,是按世界服的思想去设计,即服务器是一个n多台物理机的集群

简论游戏服务器架构设计

一.QIPAI类服务器的特点 1,QIPAI类不分区不分服 一般来说,QIPAI游戏都是不分区不分服的.所以QIPAI类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间中的人可以接收到其他人的消息. 3,每个房间的操作必须是顺序性 这个特性类似与一般游戏的回合制,每个玩家的操作都是有顺序性的. 二,需要解决的技术点 1,数据共享 因为QIPAI类游戏不分区不分服,我们在设计服务器的时候,是按世界服的思想去设计,即服务器是一个n多台物理机的集

MMO 游戏服务器引擎设计

一. 网络游戏开发的基本流程 ◆ 项目文档 ◆ 开发的进行和文档准备流程 ◆ 技术人员文档 二. MMO游戏架构 ◆ MMO游戏特点 ◆ MMO架构的特有内容 三. 策划文档 ◆ 考虑示例游戏的题材 ◆ 详细设计文档 ◆ MMO庞大的游戏设定 ◆ 5种设计文档 系统的基本结构图 进程关系图 资源评估文档 协议定义文档 数据库设计图 ◆ 设计上的重要判断 四. 系统基本结构图 ◆ 系统基本结构图的基础 ◆ 服务器必须具有可扩展性 ---- 商业模式的确认 ◆ 各瓶颈 ---- 扩展方式的选择 ◆ 

【前言】为什么要设计游戏服务器框架

设计游戏服务器框架: 项目设定周期:7月1日 - 12月31日 项目语言:PHP.Golang 项目成果: 1.PHP版游戏服务器框架 2.Golang版游戏服务器框架 设计目的: 1.挑战自己的毅力,遇到困难,勇敢面对解决 2.学习未涉及的领域和技术

我是如何设计游戏服务器架构的

前言 现在游戏市场分为,pc端,移动端,浏览器端,而已移动端和浏览器端最为接近.都是短平快的特殊模式,不断的开服,合服,换皮.如此滚雪球! 那么在游戏服务器架构的设计方面肯定是以简单,快捷,节约成本来设计的. 来我们看一张图: 这个呢是我了解到,并且在使用的方式,而PC端的游戏服务器而言,往往是大量的数据处理和大量的人在线,一般地图也是无缝地图的完整世界观,所以不同的程序都是独立的进程并且在不同的server中运行! 而浏览器端和移动终端,在上面就说过了,它主要是不断的开服,合服,开服,合服,那

微信房卡麻将棋牌架设之游戏服务器架构的详细设计(一) 内核设计

题目:微信房卡麻将棋牌架设之游戏服务器架构的详细设计(一) 内核设计 今天向大家介绍一下游戏服务器的设计,着重讲解一下微信房卡麻将棋牌架设(aqiulian.com)的服务器搭建,如果有什么不懂得可以咨询我Q_212303635,欢迎大家的咨询.那么我们开始进去主题吧. 内核的几个组件被设计成Service,也就是说这几个模块都要实现如下接口: 图1  IService接口 Start方法用来启动服务. Stop 方法用来关闭服务. IsService 方法用于查询当前服务是否正在工作. 内核中

2016年netty/mina/java nio视频教程java游戏服务器设计教程

2016年netty/mina/Javanio视频教程Java游戏服务器设计教程 需要的加qq:1225462853,备注:程序员学习视频 其他视频都可以索要(Netty   NET    C++ 等等) 互联网架构师教程:http://blog.csdn.net/pplcheer/article/details/71887910 netty录制时间为2015.11-2016.2月份  netty教程为加密视频!      netty12个课程已全部录制完成,相信通过这12节课的分析能让大家对n

FPS游戏服务器设计的问题 【转】

一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时候自己没想到这么全,但大概想法都是一致的,摘录下来再学习一下. 1.网络游戏程序员须知 UDP vs TCP 作者:[email protected] 首发链接:http://blog.csdn.net/rellikt/archive/2010/08/21/5829020.aspx 这篇教程让我们就