服务器开发—谈谈游戏数据结构

来源:互联网 发布:身份证模拟软件 编辑:程序博客网 时间:2024/05/18 04:15

         数据结构主要有两大类,一类是数据库的表,就像excel表一样,直观并且很好管理;二类是内存数据表,永远只key=>value形式,所以在设置数据库表时,一定要考虑加

载到内存是怎么样,并且二者即能转换又能快速查找

        最近做了一个副本功能(游戏),所以就拿它来说吧,其中功能有,每天进入的次数,是否需要重置,开通条件,怪物,掉落的物品,传送点,打副本时,打完该地图所有

怪物才能进入下一地图,好了大概这么多了,这些当然是策划的需求,具体的数据结构还是我们自己来设置。

         我们先根据策划的需求按分类处理,怪物,地图,物品各分为一个表,由于有进入次数,重置,开能条件,所以这些要组合为一个表,同时这些地图也不一定是全部都要

打,所以还得来个分组,一个分组里面就必须地图id,组id,组名,开通条件,是否需要重置,上面我说得很乱,直接看表结构吧

      数据库与游戏内存流程

游戏启动  -> 加载数据库(配置,玩家)数据到内存  -> 玩家操作修改内存数据   -> 将内存(玩家数据)数据同步到数据库

      配置表(也是数据库)


怪物表


怪id      怪名            怪奖励               所在组      所在地图
id(int)   name(string)    award(string)        group(int)  mapId(int)

地图表

地id       地名        
id(int)    name(string)

物品表

物id      物名             功能
id(int)  name(string)      effect(string)

副本分组表

组id       组名           进入条件               是否要重置            每天进入的次数 
id(int)    name(string)   condition(string)      needReset(boolean)    entryNumOfDay(int)

副本详细表

组合id,唯一  组id        地图id       进入传送点     下一地图传送点   
id(string)    group(int)  mapId(int)   entryXY(int)    outXY(int)


副本怪物详细表

上面只是在数据库表的结构,下面我们要加载到内存中去(总不能每次查找都去数据库吧,那样会很慢的,呵呵)

内存配置表

怪物表

group=>Map(mapId=>Object(id,name,award,group,mapId))

地图表

id=>Object(id,name)

物品表

id=>Object(id,name,effect)

副本分组表

id=>Object(id,name,condition,needReset,entryNumOfDay)

副本详细表

group=>Map(mapId=>Object(id,group,mapId,entryXY,outXY))


      新手要注意了,上面只是配置表,数据永远都是不改变了,所以我们创建表来记录玩家的数据,这数据首先产生于内存,定时保存到数据库

下面我们是在开始打副本了,这时就要问清楚策划了,需求有哪些功能,比如打完所以怪才能进入,所以我们要有个字段来记录

设计思想还是采集分组,分组分地图,(可加人分组分地图怪表)表结构,这种方法是很冗余的,也是最能通过的,如果你设计的不是这样,你在后期在维护表的数据是非常

困难的,所以还是采集传统的方式(但这种方式还是很多人不能理解)

玩家副本组表

组合id(玩家uid,组id)      玩家id  组id当前是否要重置        已经进入的次数    当前打到的地图    可加入其他字段用于别的功能
id(string)                 uid(int)       group(id)     needReset(boolean)   entryNum(int)       mapId(int)       ...

玩家副本地图表

组合id(玩家uid,组id,地图mapId)       玩家            组id       已经打的地图id    可加入其他字段用于别的功能
id(string)                           uid             group(string)   mapId(int)     ...

玩家杀怪记录表

组合id(玩家uid,组id,地图mapId,怪wildId)          玩家id     组id          地图id            怪id              可加入其他字段用于别的功能(比如杀的时间)

id(string)            uid       group          mapId(string)    wildId(int)           ...


在内存中的结构为

玩家副本组表

uid=>Map(group=>Object(id,uid,group,needReset,entryNum,mapId,...))

玩家副本地图表

uidGroup = uid+,+group

uidGroup=>Map(mapId=>Object(id,uidGroup,mapId,...)


玩家杀怪记录表

uidGroupMapId = uid+,+group+,+mapId

uidGroupMapId=>Map(wildId=>Object(id,uidGroupMapId,wildId))


      大家看明白了吗?以上是整个副本的结构,现在主要讲解下需要注意的

配置表就是数据库那样,各个id要分开,这个样方便将数据表加载到内存,这个内存就是一个Map,像id(最前端那个)往往作用是达到唯一作用,不允许有重复数据

玩家表这个就不要在内存一层层地分下去了,因为用不到,比如: 玩家副本地图表,那这个组似乎用不到,关键要找到那个mapId,但不要group,又不知道怎么进入来(没有组

怎么去找mapId,所以这个group也要记录),那么玩家杀怪记录表也是这种思想,所以将不用列出来的字段全部组合起来,可以减少Map结构的复杂性(太多层)

      今天大概讲到这里了,这种传统的结构似乎是所在应用必须的,牛逼的结构也是在这基础上开发的,比较用一个字段来记录多个字段的信息,如一个int类型来记录32个

boolean类型,当然还有缓存表,用于减轻重复的计算,如果有哪位网友有疑问的,请留言或发邮件到huangzuduan@qq.com,谢谢






























原创粉丝点击