因经历了一次只有一个策划的游戏开发项目,策划大多时候需要同时兼顾多职,且开发周期很短,方案完成后直接输出给程序,故在开发过程中对如何写一份“功能实现”的策划案有一些思考和实践,所以自己拟写了一份放置类游戏的主商城系统(以《天天挂机》的主商城为例),借此交流。
方案以功能实现为主,分析类描述甚少。若方案中有错误或者不妥之处,望不吝指正。
为了比较健全的展示,附件上方案、相关配置及测试用例。
主商城系统方案版本:1.0.1 日期:2015-08-29 作者QQ:374308264 版本 | 修改内容 | 修改时间 | 1.0.0 | 创建文档 | 2015.08.15 | 1.0.1 | 优化配置字段及其算法 | 2015.08.29 |
目录 商城系统方案... 1 一、综述... 2 1.1设计目的... 2 1.2名词解释... 2
二、主商城UI(客户端)... 3 2.1界面示意... 3 2.2UI结构与逻辑... 3
三、主商城功能实现(服务器)... 4 3.1配置释义(mainShop.txt)... 4 3.1.0配置表名与路径... 4 3.1.1商品序号:id(唯一)... 4 3.1.2商品栏类型:shopType. 4 3.1.3商品类型:propType. 4 3.1.4商品类型对应概率:propTypePr. 4 3.1.5品质id:grade. 4 3.1.6品质对应概率:gradePr. 5 3.1.7出售数量及概率:num.. 5 3.1.8货币类型及概率:moneyType. 5 3.1.9金币价格:price1. 5 3.1.10钻石价格:price2. 6 3.2商品栏和幸运值... 6 3.3商品判断算法:... 6 3.3.0共用定义... 6 3.3.1商品类型判断算法:... 6 3.3.2商品品质判断算法:... 7 3.3.3装备id判断算法... 8 3.3.4出售数量和出售价格判断... 8 4.4打折... 9 4.5购买金币... 9 4.6购买全部... 9 4.7刷新... 9
0. 文档前提描述0.1文档前提配置Ø 装备配置表(equip.txt)已完成 Ø 道具表(item.txt)已完成 Ø 装备品质表(equipQuality.txt)已完成
一、综述1.1设计目的Ø 相对优质的装备、道具产出途径 Ø 增加货币消耗途径,并能在一定程度上刺激消费 Ø VIP差异体现,使VIP能获得更好的资源,同时刺激VIP消费、非VIP转化为VIP 1.2设计思路Ø 出售的装备等级随着角色等级变化,出售装备的品质为橙色和紫色;投放部分道具在商场,且这些道具只在商场产出 Ø 装备出售的货币类型包括金币和钻石(概率),道具只有钻石;随机打折出售部分商品 Ø VIP额外出售高品质商品,VIP等级控制钻石直接兑换金币次数 1.3名词解释Ø 通用名词,详见“通用名词汇总1.0.3”
二、主商城UI(客户端)2.1界面示意
2.2UI结构与逻辑
挂机主商城UI
具体查看连接:http://l277is.axshare.com 密码:123456 注1:飘字显示,写成可重复调用的功能 注2:钻石不足的弹窗,写成可重复调用的功能 注3:金币不足的弹窗,写成可重复调用的功能
三、主商城功能实现(服务器)3.1配置释义(mainShop.txt)3.1.0配置表名与路径Ø 配置表名为:mainShop.txt Ø 路径:svn/ dev/config/ 3.1.1商品序号:id(唯一)Ø 商品对应的唯一标识 3.1.2商品栏类型:shopType Ø 商品栏类型 n 1为普通商品栏 n 2为高级商品栏 3.1.3商品类型:propTypeØ 商城出售的商品类型: Ø 1为装备 Ø 2为神器碎片 Ø 3为钥匙 3.1.4商品类型对应概率:propTypePrØ 商品类型对应的概率 Ø 商品类型判断算法详见商品类型判断算法 3.1.5品质id:gradeØ 商品类型为1(装备),品质id有如下 n 1为白色品质 n 2为绿色品质 n 3为蓝色品质 n 4为紫色品质 n 5为橙色品质 n 6为单属性神器 n 7为双属性神器 Ø 商品类型为2、3(非1)时,品质id为为item.txt配置中对应的道具id 3.1.6品质对应概率:gradePrØ 品质对应的概率 Ø 品质判断算法详见品质判断算法 3.1.7出售数量及概率:numØ 出售的商品数量及其对应的概率 Ø 字段解析规则: n 填写的字段示例:1_10000 n 以“_”作为分隔,前一个数值表示出售的数量,后一个数值表示对应的概率值 3.1.8货币类型及概率:moneyTypeØ 决定商品是以哪种货币出售,及其对应的概率 Ø 1为金币,2为钻石 Ø 字段解析规则: n 填写的字段示例:1_7000;2_10000 n 以“;”作为不同类型的分隔,以“_”作为类型与概率的分隔。示例中表示金币出售(1)的概率值1为7000,钻石出售(2)的概率值为10000 3.1.9金币价格:price1Ø 出售类型为1时,对应的具体价格 Ø 当商品类型为装备时,配置会填写-1表示: n 金币出售价格=装备基价*装备品质系数 n 装备基价为equip.txt配置中buyPrice字段 n 装备品质系数为equipQuality.txt配置中ratio字段 Ø 其他类型时,所填的值即为出售价格 Ø 当出售数量有多个时,出售价格会一一对应 n 字段解析规则:以“,”作为出售价格的分隔 n 示例:出售数量及其概率(num字段)为1_3333,3_6666,10_10000,出售价格对应为10,10,10 3.1.10钻石价格:price2Ø 出售类型为2时,对应的具体价格 Ø 所填的值即为出售价格 Ø 当出售数量有多个时,出售价格会一一对应 n 字段解析规则:以“,”作为出售价格的分隔 n 示例:出售数量及其概率(num字段)为1_3333,3_6666,10_10000,出售价格对应为24,70,220 3.2商品栏和幸运值Ø 商品栏级别与数量:商品栏分普通和高级,普通有6个,高级最多有3个,高级栏数量依据vip等级对应增加,具体见配置vip.txt。2种类型的商品栏出售商品及概率皆不同,具体依据mainShop.txt配置 Ø 幸运值影响:商品类型的概率,商品品质的概率,装备等级。具体见3.3商品判断算法 Ø 幸运值增长公式: n times=购买商品件数 luck=幸运值 luck=100-----------幸运值默认为100 n for(i=1;i++;times){ luck=luck+math.max(20-times,3) } 3.3商品判断算法:商品判断顺序:类型→品质→装备或道具id→出售数量→出售货币单位→出售价格 3.3.0共用定义float a=2.85--------幸运值系数 int luck=商城幸运值 int e.lv=装备等级 int u.lv=角色等级 int shop.pType=最终确定的商品类型 int shop.pQty=最终确定的商品品质 int n.PType=当前商品类型id int e.id=最终确定的装备id int s.num=最终确定的出售数量 int s.price=最终确定的出售价格 3.3.1商品类型判断算法:int rate()=商城配置中相应商品的概率 int rate_x()=幸运值影响后的商品实际概率 int propType=商品配置中商品类型字段 rate_x(Math.Max(propType))=rate(Math.Max(propType))----------最大类型id的实际概率值为配置概率值(圆桌算法为10000) if Math.Max(propType)==Math.min(propType) then end----------不进行下面的循环计算 else { for(i=1,i=i++,Math.Max(propType)-Math.min(propType)) { rate_x(Math.Max(propType)-i)=rate(Math.Max(propType)-i)-(luck-100)*a*i returnrate_x(Math.Max(propType)-i) } } ------判断商品类型-------- int random_2=Math.Random(1,rate(Math.Max(propType))) int rate(Math.min(propType)-1)=0 -----循环判断------ for(r=0,r++,Math.Max(propType)-Math.min(propType)) { if rate_x(Math.Max(propType)-r-1)<random_2<=rate_x(Math.Max(propType)-r) then shop.pType=Math.Max(propType)-r return shop.pType } 3.3.2商品品质判断算法:int grade_id=商城配置中相应商品品质id int n.grade_id=当前商品品质id int rate(grade_id)=商城配置中相应商品品质的概率 int rate_x(grade_id)=幸运值影响后的商品品质实际概率 int n.PType=当前商品类型id ---------同类型商品品质实际概率--------------- type_prop(n.PType)={1,2,3,4,5,6,7,8,9,10}-------预留商品品质实际概率的存储空间,初始值为配置中的值
需要在配置表propType字段下找到n.PType,并读取对应grade字段下的所有品质id及其对应概率值
rate_x(Math.Max(grade_id))=rate(Math.Max(grade_id))----------最大的类型的实际概率值为配置概率值(圆桌算法为10000) if Math.Max(grade_id)=Math.min(grade_id) then end----------不进行下面的循环计算 else for(i=1,i++,Math.Max(grade_id)-Math.min(grade_id)) { rate_x(Math.Max(grade_id)-i)=rate(Math.Max(grade_id)-i)-(luck-100)*a*i return rate_x(Math.Max(grade_id)-i) } else end -----------判断确定类型的商品品质------------- random_3=Math.Random(1,rate_x(Math.Max(grade_id))) int rate(Math.min(propType)-1)=0 -----循环判断------ for(t=0,t++,Math.Max(grade_id)-Math.min(grade_id)) { if rate_x(Math.Max(grade_id)-t-1)<random_2<=rate_x(Math.Max(grade_id)-t) then shop.pQty=Math.Max(grade_id)-t return shop.pQty } 3.3.3装备id判断算法若商品类型为装备,还需确定装备的id range_1=(Math.Floor(u.lv/5)*5,Math.Floor(u.lv/5+1)*5+4) range_2=(Math.Floor(u.lv/5+2)*5,Math.Floor(u.lv/5+2)*5+4) rate(range_1)=10000 rate(range_2)=(luck-100)*a ------判断装备等级-------- random_1=Math.Random(1,10000) if random_1<=rate(range_2) then e.lv=Math.Random(range_2) elserate(range_2)<random_1<rate(range_1) then e.lv=Math.Random(range_1) ------确定装备id-------- 找出所有在装备配置表equip中level字段值等于e.lv的结果(id),在结果中随机一个赋值给e.id 3.3.4出售数量和出售价格判断int num=配置中对应出售数量的序号(从1开始的自然数) int numPr()=配置中对应出售数量的概率 ------确定商品id后,确定出售数量-------- random_4=Math.Random(1,10000) numPr(Math.Min(num)-1)=0 for(i=0,i++,Math.Max(num)-Math.Min(num)) { if numPr(Math.Max(num)-i-1)<random_2<=numPr(Math.Max(num)-i) then s.num=Math.Max(num)-i return s.num } ------确定出售数量后,确定出售货币类型-------- int moneyType=配置中对应出售货币类型id(1.金币;2.钻石) int moneyType()=配置中对应出售数量的概率 random_5=Math.Random(1,10000) moneyTypePr(math.min(moneyType)-1)=0 for(i=0,i++,math.max(moneyType)-math.min(moneyType)) { ifmoneyTypePr(math.max(moneyType)-i-1)<random_2<=moneyTypePr(math.max(moneyType)-i) then s.moneyType=math.max(moneyType)-i return s.moneyType } 确定货币类型后,对应去取配置中price1(金币)和price2(钻石)下的值 上述算法中标蓝色的部分,便于理解所以写出那样。更为合理的是只写一遍算法,通过传不同的参数得到结果 注:当金币价格为-1时,金币售价遵循3.1.9 3.4打折Ø 概率赋予商品打折状态,有打折状态的商品,商品价格=商品价格*折扣 Ø 打折数量及折扣额度,对应不同的概率,具体依据打折配置shopDaZe.txt Ø shopDaZe.txt路径:svn/gjxm/dev/config/ 3.5购买金币Ø 购买金币次数,依据配置vip.txt Ø 购买金币的消耗和获得的金币数量依据配置bugCoin.txt Ø bugCoin.txt路径:svn/gjxm/dev/config/ 3.6购买全部Ø 购买全部成功后,会依据VIP等级立即刷新相应数量的商品。具体数量依据vip.txt 3.7刷新Ø 刷新成功后,会依据VIP等级立即刷新相应数量的商品,具体数量依据vip.txt
Ø 刷新消耗依据配置refreshShop.txt
|