游戏人物装备技能数据表怎么设计(整理)
一、总结
一句话总结:把人物的属性抽离出去,其它的装备啊,技能表和属性表之间建立一个关系表。
1、装备表如何设计(装备表和角色表的对应关系是什么)?
装备属于人物,所以装备表可以加上所属人物的id
装备,包括的数据项有:装备名称,装备描述,(通用属性),装备ID,主人ID
其实可以弄一个装备属性表,来表示装备提升的属性,和技能一样
2、技能表如何设计?
技能,包括的数据项有:技能名称,基础伤害,加成类型,加成比例,冷却时间,学习等级
其实可以弄一个技能属性对应表,来表示技能提升的属性
有技能id,有属性id,有提升类型(数值还是百分比),有提升值,每升一级提升值
3、人物的属性(包括基础属性比如力量魔法和面板属性比如伤害)是否需要抽离?
需要:因为下面这条里面有属性id
有技能id,有属性id,有提升类型(数值还是百分比),有提升值 (每级),有技能图标
4、怪物表如何设计?
和角色表一样,角色有的怪物应该都有,比如各种属性
二、RPG游戏数据库设计
一.数据库需求分析
通过游戏过程中所需元素,设计如下数据项和数据结构
1.角色,包括的数据项有:用户ID,角色ID,角色昵称,(通用属性,角色属性)
2.角色属性,包括的数据项有:力量,智力,敏捷,经验值,职业,角色ID
3.通用属性,包括的数据项有:生命值,魔法值,攻击力,护甲值,魔抗值,主人ID
4.怪物信息,包括的数据项有:怪物ID,(通用属性,NPC属性)
5.NPC属性,包括的数据项有:出生地点,活动范围,功能,主人ID
6.用户信息,包括的数据项有:用户ID,用户密码,用户邮箱,登陆地址,登陆时间
7.装备,包括的数据项有:装备名称,装备描述,(通用属性),装备ID,主人ID
8.技能,包括的数据项有:技能名称,基础伤害,加成类型,加成比例,冷却时间,学习等级
二.数据库概念结构设计
角色E-R图.PNG
角色属性E-R图.PNG
通用属性E-R图.PNG
怪物信息E-R图.PNG
NPC属性E-R图.PNG
用户信息E-R图.PNG
装备E-R图.PNG
技能E-R图.PNG
实体间联系E-R图.PNG
三.数据库逻辑结构设计
角色 | ||||
---|---|---|---|---|
字段名 | 数据类型 | 长度 | 是否为NULL | 描述 |
YHID | INT | 8 | 不为NULL,外键 | 创建该角色的用户ID |
JSID | INT | 8 | 不为NULL,主键 | 该角色的ID |
JSNC | CHAR | 8 | 不为NULL | 角色昵称 |
角色属性 | ||||
---|---|---|---|---|
字段名 | 数据类型 | 长度 | 是否为NULL | 描述 |
ID | INT | 8 | 不为NULL,外键 | 拥有该属性的角色ID |
LL | INT | 3 | 不为NULL | 力量 |
ZL | INT | 3 | 不为NULL | 智力 |
MJ | INT | 3 | 不为NULL | 敏捷 |
JYZ | INT | 3 | 不为NULL | 经验值 |
ZY | CHAR | 4 | 不为NULL | 职业 |
通用属性 | ||||
---|---|---|---|---|
字段名 | 数据类型 | 长度 | 是否为NULL | 描述 |
SMZ | INT | 3 | 不为NULL | 生命值 |
MFZ | INT | 3 | 不为NULL | 魔法值 |
GJL | INT | 3 | 不为NULL | 攻击力 |
HJZ | INT | 3 | 不为NULL | 护甲值 |
MKZ | INT | 3 | 不为NULL | 魔抗值 |
ID | INT | 8 | 不为NULL,外键 | 拥有该属性的ID |
怪物 | ||||
---|---|---|---|---|
字段名 | 数据类型 | 长度 | 是否为NULL | 描述 |
ID | INT | 8 | 不为NULL,主键 | 怪物ID |
NPC属性 | ||||
---|---|---|---|---|
字段名 | 数据类型 | 长度 | 是否为NULL | 描述 |
ID | INT | 8 | 不为NULL,外键 | 拥有该属性的ID |
CSDD | CHAR | 8 | 不为NULL | 出生地点 |
HDFF | INT | 3 | 不为NULL | 活动范围 |
GN | CHAR | 3 | 可空,商人,任务发布者,怪物等 | 功能 |
用户信息 | ||||
---|---|---|---|---|
字段名 | 数据类型 | 长度 | 是否为NULL | 描述 |
YHID | INT | 8 | 不为NULL,主键 | 用户ID |
YHMM | CHAR | 8 | 不为NULL | 用户密码 |
YHYX | CHAR | 8 | 不为NULL | 用户邮箱 |
DLDZ | CHAR | 8 | 可NULL | 登陆地址 |
DLSJ | CHAR | 8 | 可NULL | 登陆时间 |
装备 | ||||
---|---|---|---|---|
字段名 | 数据类型 | 长度 | 是否为NULL | 描述 |
ZBID | INT | 8 | 不为NULL,主键 | 装备ID |
ZRID | INT | 8 | 不为NULL,外键 | 拥有该装备的角色ID |
ZBMC | CHAR | 8 | 不为NULL | 装备名称 |
ZBMS | CHAR | 8 | 可NULL | 装备描述 |
技能 | ||||
---|---|---|---|---|
字段名 | 数据类型 | 长度 | 是否为NULL | 描述 |
ID | INT | 8 | 不为NULL,外键 | 拥有该技能的角色ID |
JNMC | CHAR | 8 | 不为NULL | 技能名称 |
JCSS | INT | 8 | 不为NULL | 基础伤害 |
JCLX | CHAR | 2 | 不为NULL,物理,魔法 | 加成类型 |
JCBL | INT | 2 | 可为NULL | 加成比例 |
LQSJ | INT | 3 | 不为NULL | 冷却时间 |
XXDJ | INT | 3 | 可为NULL | 学习等级 |
四.数据库物理结构设计
根据以上逻辑分析所得到的表的关系,我们使用SQL语言设计得到数据库和数据表,如下:
1.创建数据库RPGdatabase
CREATE DATABASE RPGdatabase;
2.创建角色数据表
CREATE TABLE Players(
YHID INTEGER NOT NULL,
JSID INTEGER NOT NULL,
JSNC CHAR(8) NOT NULL,
PRIMARY KEY(JSID)
FOREIGN KEY(YHID) REFERENCES(Users)
)
3.创建角色属性数据表
CREATE TABLE PAttributes(
ID INTEGER NOT NULL,
LL INTEGER NOT NULL,
ZL INTEGER NOT NULL,
MJ INTEGER NOT NULL,
JYZ INTEGER NOT NULL,
ZY CHAR(4) NOT NULL,
FOREIGN KEY(ID) REFERENCES(Players)
)
4.创建通用属性数据表
CREATE TABLE PAttributes(
ID INTEGER NOT NULL,
SMZ INTEGER NOT NULL,
MFZ INTEGER NOT NULL,
GJL INTEGER NOT NULL,
HJZ INTEGER NOT NULL,
MKZ INTEGER NOT NULL,
FOREIGN KEY(ID) REFERENCES(Players)
)
5.创建怪物数据表
CREATE TABLE Monsters(
ID INTEGER NOT NULL,
PRIMARY KEY(ID)
)
6.创建NPC属性数据表
CREATE TABLE NpcAttributes(
ID INTEGER NOT NULL,
CSDD CHAR(8) NOT NULL,
HDFF INTEGER NOT NULL,
GN CHAR(3),
FOREIGN KEY(ID) REFERENCES(Players)
)
7.创建用户信息数据表
CREATE TABLE Users(
YHID INTEGER NOT NULL,
YHMM CHAR(8) NOT NULL,
YHYX CHAR(8) NOT NULL,
DLDZ CHAR(8),
DLSJ CHAR(8),
PRIMARY KEY(YHID)
)
8.创建装备信息数据表
CREATE TABLE Equips(
ZBID INTEGER NOT NULL,
ZRID INTEGER NOT NULL,
ZBMC CHAR(8) NOT NULL,
ZBMS CHAR(8),
PRIMARY KEY(ZBID)
FOREIGN KEY(ZRID) REFERENCES(Players)
)
9.创建技能信息数据表
CREATE TABLE Skills(
ID INTEGER NOT NULL,
JCSS INTEGER NOT NULL,
JNMC CHAR(8) NOT NULL,
JCLX CHAR(2) NOT NULL,
JCBL INTEGER,
LQSJ INTEGER NOT NULL,
XXDJ INTEGER,
FOREIGN KEY(ID) REFERENCES(Players)
)
参考:RPG游戏数据库设计 - 简书
https://www.jianshu.com/p/59fde9eef388
二、MMORPG游戏服务器技能系统设计:表格字段与技能程序框架
本文主要从一个程序员的角度阐述一下mmorpg服务器技能系统的程序框架设计,最近在做这个,就当做一个总结吧,其中某些概念可能没有解释清楚,欢迎大家拍砖讨论~
技能其实是战斗系统的一个组成部分,战斗基本上都可以由技能触发,技能系统实际上就是一套完整的逻辑,我们用表格来设计,将技能的逻辑用属性字段抽象出来,然后依据属性字段来控制逻辑,策划人员可以通过更改属性字段来配置出不同的逻辑属性。
1. 表格属性字段的设计
为了减少冗余,我们将技能属性字段设计在4个不同的表中:
Skill表:技能表的入口表,包括cast表,buffer表,op表,技能的释放需求,伤害
Cast表: 技能的释放过程表,包括技能吟唱时间,技能命中距离等等
Buffer表:各种人物状态,静态和动态的光环,效果等等
Status表:角色状态表,角色在状态下能使用或被使用的技能或者buffer
op表: 技能的伤害计算公式
skill表字段设计:
名称:技能名称,如火球术
技能id:技能id值
技能名称id:技能系,id一样表示一个系技能
技能类型:加血、物理攻击、魔法攻击、buffer、地图技能
公共CD时间:多个技能可以共cd,比如所有吃药技能
CD时间:cd时间
CD保存类型:cd时间在人物下线后是否保存数据库
需要角色等级:角色等级需求
角色状态限制:使用技能的角色状态限制,这个字段需要斟酌以后重新设计成一个表格
需要武器:技能释放需要的武器类型,如弓,刀,剑等等
消耗类型:需要消耗,如hp,mp,xp等等
消耗数量:hp,mp,xp的消耗数量
是否有益:是否是有益技能
技能属于:生活技能、装备技能、职业技能等等
升级技能:改技能的升级技能
调用cast表:调用cast表的id号
调用describe表:调用技能描述表id号
影响形状:范围技能的影响范围,直线、圆、扇形
影响个数:范围技能影响的npc个数
Buffer1:技能触发的buffer1
概率1:技能触发buffer1的概率
Buffer2:技能触发的buffer2
概率2:技能触发buffer2的概率
伤害效果:技能产生的伤害
调用op表计算效果:op表中数值计算的公式
是否产生伤害仇恨:是否产生仇恨值
携带仇恨:技能产生的仇恨值
cast表字段设计:
名称:cast表对应技能名称
是否对地释放:是否对地释放
是否对他人释放:是否可以对他人释放该技能
是否对自己释放:是否可以对自己释放该技能
是否前摇打断:前腰是否可以打断
前摇时间:动画前摇的时间
飞行时间:魔法的飞行时间
持续施法时间:技能的施法时间
吟唱时间:吟唱时间
释放距离:释放技能距离目标的距离
技能命中:技能命中率
命中最大距离:指向型技能当目标出了fire区域就不受攻击了
buffer表字段设计:
名称:对应skill表中的技能名称
Id:buffer id
效果nameID:表示一个系列的buffer
类型:静态、动态、状态buffer
是否有益:是否有益处
角色状态:加了buffer后角色处于的状态,如沉默,天神下凡,嗜血等等
伤害效果:buffer的伤害
调用op表:指向op表中的公式id
动态次数:对应动态buffer生效次数,对静态buffer无效
生效间隔:对应动态buffer每次生效的间隔时间,静态buffer无效
持续时间:对应静态buffer的持续时间,-1表示永久buffer
产生buffer:某些 buffer可以给队友或敌人加
影响范围:buffer影响的范围
是否可以移除:对应驱散技能
移除类型:对应驱散技能等级
是否可以覆盖:同类型buffer是否可以覆盖,还是效果叠加
覆盖类型:大的覆盖小的
是否需要from:计算效果时是否需要buffer来源。
status表字段设计:
状态名称:角色的状态名称,如沉默,死亡,天神下凡等等。
状态id:角色状态的id号
角色动作最大值:在该状态下可以使用或者被使用的技能的最大值,如无敌不能受伤害;
角色动作最小值:在该状态下可以使用或者被使用的技能的最小值,如无敌不能受伤害;
状态最大值:在该状态下,可以被使用buffer的最大值;
状态最小值:在该状态下,可以被使用buffer的最小值。
2.技能程序框架
技能的表格属性字段我们已经设计好了,可以满足策划短期需求了,接下来我们来设计一下技能程序的框架。
技能系统服务器和客户端是有交互的,具体流程看下图:
服务器要通知客户端是否能释放技能,吟唱时间,技能命中结果,伤害数字,服务器还要广播技能释放结果,让同区域的玩家可以看到别人在释放技能。
需要立即同步的。
1. hp,众所周知;
2,角色状态,角色的各种状态,比如天神下凡,沉默,死亡。
不需要同步的。
角色属性改变,如力量,敏捷等角色属性。
ps:服务器和客户端同一套代码,客户端进行预判,除了血量和角色状态服务器向客户端发同步消息,其他属性改变可以不发消息,这样可减少服务器和客户都的消息数量。
代码的结构设计
这里只画一个简单结构,将每个table抽象为一个table_data,然后在game_char中组合起来。
参考:MMORPG游戏服务器技能系统设计:表格字段与技能程序框架 - CSDN博客
https://blog.csdn.net/caoshulin1989/article/details/53081035
二、RPG手机游戏道具、物品、装备表设计
###一、游戏物品/道具系统数据模型设计特点
为了让游戏更加的丰富,我们1201团队的新手机游戏设计了道具系统。于是丰富了游戏、取悦了玩家,哭了开发——道具/物品数据子系统是简单的、复杂的、不确定的:
1. 简单,说起来不就是选择一个或多个数据库产品,然后定义一种数据模型,然后增、删、改、查。
2. 复杂,物品/道具可以在细分为装备、时装、坐骑、宝石、buff等等,每类物品有不同的属性需求,于是:
+ 首先物品数据是游戏核心数据里数据量最大、操作最频繁、数据结构最多元化的数据
+ 如果用一种数据表结构,那么会浪费很多的字段或数据空间(而物品表超大);
+ 如果用不同的数据表结构,那么游戏逻辑就要麻烦一些了,比如物品在玩家中转移的时候、修改、丢弃的时候。
+ 是否进行应用逻辑层水平切分?切分了就可以将数据库分布到多个数据库服务器上,那么理论上数据规模就不会成为瓶颈了;但如果切分了,道具数据分析、后期的合区逻辑就会很复杂。
+ 装备、时装是会有多个属性的,且每件装备的属性值、属性类型都不一样,如何设计数据字段(当然如果用nosql数据库就不存在这个问题了)?
3. 不确定:
+ 随着游戏开发及运营的进行,各种新的道具的需求会不断涌现出来,有可能就会需要增加新的属性和功能需求
+ 到底每一个玩家最终会有多少的物品?
+ 最终单个区服的数据规模有多大这个其实很难预计。我们做的很完善(当然开发代价也大)的设计与开发会不会有些多余,甚至被老板认为想多了?
###二、游戏物品/道具系统数据模型设计目标及解决思路
上面分析做了,槽也吐了,还是要做事嘛,呵呵。根据我们的新游戏的具体需求,对物品数据库表的设计定义了如下要求和解决思路:
序号 | 要求 | 解决思路
------| ----- | -----------------------------------
1 | 确保数据操作的性能 | 充分利用缓存服务器
2 | 降低程序开发和后期客服工作的复杂度 | 各类道具不分表
3 | 必须可以方便、灵活的支持道具新功能需求的开发 | 将多变的装备属性以json格式存于一个字段
4 | 保留充分的可扩展性 | 根据玩家id进行数据库表水平切分
5 | 尽量降低合区操作时数据处理逻辑的难度和效率 | 用自增长ID、玩家id、区服id做联合主键
###三、具体开发设计方案
根据以上的分析结果,我们在总结了以前的游戏开发经验并参考了网上的一些文章后形成了我们新手机游戏的物品数据子系统的设计、开发方案。
*所有数据访问都封装在model层。*
1. 在程序的model层里定义公共函数GetDb(playerid,areaid),用于物品数据及其它需要进行按用户水平分割的数据获取数据库(连接)
2. 每一个物品的主键由itemid,playerid,areaid三个字段组成
3. 将装备buff及某道具特有属性统一以json字符串形式保存在一个varchar字段里
4. 道具表定义 *失效时间* 字段,这个字段同时表示道具有效期的三种情况:
+ =0 ,表示是不限时的永久性道具
+ 小于等于600000,表示有效时间段,如双倍经验卡有效时长3小时,那么着个字段值为 **180** (分钟),使用此道具时,用当前时间加上这个字段值得到失效时间戳修改此字段或做其他处理
+ 大于600000,表示该道具的失效时间戳(unix时间戳格式)
5. 玩家道具数据查询流程:
+ 首先检查redis里有没有
+ 如果有,返回
+ 如果没有从数据库里查询并存到redis,返回
6. 修改/或增加道具数据流程:
+ 首先检查redis里有没有
+ 如果没有,从数据库里查询并存到redis
+ 如果有,继续
+ 修改/增加redis数据,同时在key为“item_update_list”的redis list 数据里记录下该道具的主键
+ 定时根据“item_update_List”数据写回mysql,并清除“item_update_list”
7. 删除一个道具数据流程:
+ 在redis 里key为“item_delete_list” 的redis list 数据里记录下该道具的主键
+ 删除redis里记录
+ 定时根据item_delete_list”数据删除mysql里记录,并清除“item_delete_list”
8.注意:
+ 配置redis 为 **在每次更新操作后进行日志记录**
+ 缓存定时同步mysql处理程序可以作为一个独立的进程运行
+ 这个解决方案可以针对其它用户私有数据,如技能、buff。
###四、总结
数据库表水平分割和缓存应用基本上已经是服务器端程序员的常识,在google上查相关技术资料时,大多数博文也是写的这些。
本文先是对游戏道具/物品数据模型的进行了简单的需求分析,然后讲了思路和方案,其实我最想表达的是我的三个设计细节或idea:
+ 道具数据记录主键设计(方便合区)
+ 装备buff及道具特有的属性字段设计(为道具丰富的功能需求提供灵活、便捷的数据基础)
+ 所有道具类别不区分存储(方便后期的客服查询和数据统计)
###最后声明:
其实我是一个程序员,呵呵!
RPG手机游戏道具、物品、装备表设计 - CSDN博客
https://blog.csdn.net/fancyblue/article/details/12025031