数值设定——公式篇值得拥有的资料是来自平时学习积累总结的有问题的地方肯定有的还请大家批评指正!数值设定--公式篇--Written by Mervin 数值设定的步骤很多本文只讲公式类型、特点及应用;牵涉到数值设定中常遇到的几种类型的设定:几率、经验、属性、技能; 本文由简入烦主体以公式的类型、特色来划分章节穿插几种类型的设定讲解 OKLet's Begin一、 加减乘除 线型为线性变化稳定比较容易找到规律预期后面的发展; 举几个例子:1 每加一点力量近战物理攻击加1;每射击一次子弹数减少1;2 每使用一次冰箭术熟练度加1达到2000时升级为2级;3 宠物近战物理伤害=宠物物理攻击-目标物理防御;宠物近战物理伤害=宠物物理攻击*目标物理吸收比;近战物理技能伤害=((武器伤害+技能附加)*技能增幅)*目标物理吸收;4 血击(技能):在HP <50%时将自己所有HP化为伤害攻击目标使用后生命值为1;伤害=(基本伤害+当前HP)*(1+技能等级调整值+10*当前HP/最大HP); 总结:> 加减的运算最为直观一眼就可以发现规律甚至潜意识;> 乘除的运算容易简单、直接的对数据造成跳跃性而常常是有意识、有规律的跳动;> 混合运用时可以实现很多有特色的功能;二、 幂函数 幂函数f(x)=x^i;对比函数g(x)=x; 当0g(x);[1,∞]区间内f(x)1时[0,1]区间内f(x)g(x);先缓后急; 当i<0时[0,1]区间内f(x)逼近无穷大;[1,∞]区间内f(x)逼近无穷小; 示例曲线图如下: 举例应用:1 升级经验=ceiling(1000*等级^(2/3),1);(ceiling=向上取整)2 消除类休闲游戏(如宝石迷阵)COMBO得分=100*本次宝石个数*2^combo次数;3 魔法攻击=智力值+[int(智力值/10)]^2;(int=向下取整)4 f(x)=1/x的应用:* 血击伤害Ver2.0=(基础伤害+当前HP)*[14*技能等级调整值*当前HP/(最大HP-当前HP)];* 攻击速度=50/{200 -[(250-敏捷-灵巧/4)/50*(200-基本速度)]};5 命中率=100/[1+(150-敏捷)];6 魔法回复(点/秒)=2+(2+精神/50)^2; 总结:0 前期容易后期难是普遍的经验值递加设计原则i<1时具有这种特性;1 i>1造成的连锁递增效应是用来奖励的上好措施但缺点是有限区间内拓展;2 某些需要积累到一定程度才能体现出优越性的属性设定往往要用到f(x)=x^i(i>1)的先缓后急的特性3 f(x)=1/x常常以a/(b-x)的形式出现常常用来实现具有临界值的属性设定且x多有取值限制需要很好的前期规划;4 接上1/x的x取值区间常定义在[1,max]有时也会进入[0,1]这一段一般都是通过将[1,max]区间进行除算得到新的[1/a,max];可以产生新的临界点;5 幂数的计算相对复杂不适合做心跳计算;指数函数极少应用;三、 数组、数列 有限个具有相同变量名的相同类型的下标变量的有序排列叫做一个数组; 一元数组:{a1,a2,...,ai,...,an} 二元数组:{a(1,1)a(1,2)a(1,3)a(2,1)a(2,2)a(2,3),...,a(3,3)} 按一定次序排列的一列数叫做数列;有穷数列;无穷数列;n项合Sn 等差数列:ai-a(i-1)=nSn=(a0+an)n/2 等比数列:ai/a(i-1)=nSn=a0(1-q^(n-1))/=ai/a(i-1) 斐波那契数列:a(i+1)=ai+a(i-1)a0=1a1=1 {1123581321345589144233...}* 假设一对初生兔子要一个月才到成熟期而一对成熟兔子每月会生一对兔子那么由一对初生兔子开始12 个月后会有多少对兔子呢?144对* 二叉完全树的叶子数按斐波那契数列增长;* 连续 10 个斐波那契数之和必定等于第 7 个数的 11 倍 数列是函数的离散形式;数组是离散的值的集合; 举几个例子:1 1~5级升级每次获得3点属性点而后每5级多获得1点即6~10级4点11~15级5点......50级后每4级一个跳跃;2 本级升级所需经验=上级所需经验+本级等级数*10000;3 休闲小游戏COMBO得分Ver2.0:Combo1=宝石数*c1Combo2=宝石数*c2Combo3=宝石数*(c1+c2)...Combo(i)=宝石数*(c(i-2)+c(i-1));其中c1=2,c2=3; 总结:> 对于一些不方便、不必要用公式来表达的数值采用数组直接存取方便快捷;(你也可以说这是索引表)> 对等差、等比这种最基础的数列进行一些细节的改变往往可以产生微妙的变化例2就是一个递归的例子曲线走势类似f(x)=x^2;(当然你也可以说这本来就是递归)> 数组、数列其本身并不是什么公式更多的是一个看问题的角度;四、 正态分布 正态分布的应用非常深、广笔者实在是能力有限只探讨下在几率问题上的正态分布; Random[]:在[01]上随机取数; Random[Integer,{1,100}]:在[1100]上随机取整数; 1d8=Random[Integer,{1,8}]:投一次8面骰; 2d4=Random[Integer,{1,4}]+ Random[Integer,{1,4}]:投2次4面骰; ... xdy= Random[Integer,{1,y}]+ Random[Integer,{1,y}]+...:投x次y面骰设结果为s结果s的几率为p′那么设p= p′*y^x则为受x,y,s影响的3元函数p(x,y,s):> 1/(y^x)为p′的最小单位;> s∈[xxy]s为整数;> x=1时分布曲线为平行线y=1/y;x=2时分布曲线为折线示例图如下(实际为散点图):横轴为s纵轴为p; > x>2时s的出现几率p(s):( B[n,m]为Binomial[n,m]的省略为组合;n≥m) p(x,y,s)={B[x,1]*p(x-1,y-1,s-y)+B[x,2]*p(x-2,y-1,s-2y)+...+B[x,3]*p(x-i,y-1,s-i*y)}+{B[x,1]*p(x-1,y-2,s-y)+B[x,2]*p(x-2,y-2,s-2*y)+...+ B[x,i]*p(x-i,y-2,s-i*y)}+...+ B[x,i]*p(x-i,y-j,s-i*y)+... (i,j,x,y,s∈integer, 1≤i 上式中B[x,i]*p(x-i,y-j,s-i*y)有解的条件是:x≤i*(y-j)+x-i≤s-i*y> 曲线总为对称图形s=(xy+x)/2时的p(x,y,s)值最大,s为整数唯一最大为小数上下取整两个最大值;> 必须注意的是x,y是一常量ij是变量;请勿混淆;> 给出示意图一张(5d4) 横轴为s纵轴为p: > p(a,b,a)=1p(a,b,ab)=1;∑p′=1;> 另外一种计算p的方式较为容易理解我称之为冒泡法;见示意图讲述的是p(5,4,7)的求解过程; 于是这个问题转化成:将s-x个球放入x个口袋中每个口袋最多能装y-1个球有多少种分法? 举几个例子:1 某盗贼的闪躲为20%;即Random[integer,{1,100}]≤20时闪躲成功否则失败;2 某盗贼的闪躲为20%格挡为10%两者优先级等同;即 Random[integer,{1,100}]≤20时闪躲成功21≤Random[integer,{1,100}]≤30时格挡成功;3 某盗贼的闪躲是20%格挡是10%完全闪躲是25%优先级完全闪躲>闪躲=格挡;即Random[integer,{1,100}]≤25时完全闪躲否则Random[integer,{1,100}]≤20闪躲21≤Random[integer,{1,100}]≤30格挡;4 弓的攻击是2-10弩的攻击5-7;便是2dy1和5dy2(y1>y2)的简化应用;(当然实际效果是1d9+1和1d3+4);5 总结:> 我将例1、2中的随机数称为部分随机数因为存在部分的无用数;> 骰子是随机数的一种特殊情况总是有解我称之为完全随机数;> 几率都可以用p(x,y,s)表达;> p(x,y,s)中的x控制曲线的坡度y控制曲线的左右跨度s决定几率大小x*y决定曲线的成长性;x:y决定曲线的整体走势;> 接上当1←x 任意一种随机数的随机事件都受到收益递减的影响见下图表示的是在闪躲提高时闪躲成功:不闪躲的比例: > p(3,y,s)在s∈[3,y+3-1]上递归增长(一元递归)规律如下(x=3): 1,x,2x,3x+1,4x+2,...,ix+(i-2)... 或者表达为(将上式看做一个数列) {p2-p1,p3-p2,...,pi-p(i-1),...}为等差数列首项p1=2,等差d=1;> p(4,y,s)有类似规律为二元递归;> 若y1 [3,y+3-1]区间存在一个递归减少的对称区间对称轴s=(xy+x)/2; 五、 作者的话 对于数值设定是一项庞大的过程需要很清晰的思路和逻辑工作流程不多螯述做过的基本都知道;不想对哪部分重要、哪部分次要做评价个人觉得这是混泥土和钢筋的关系一个发挥不了作用结合才是正道 作者的信条是:条件决定结果尽量简化过程懂的取舍懂的轻重; 本篇是第一弹正在努力推出其他部分的一些东西;因为公式的内容相对比较具体有很多前人的经验在铺路(虽然正态分布部分的内容完全是自己总结出来的汗啊高数学的差的结果觉得有这么个东西但就是想不起来) 特别申明一下正态分布部分的内容因为没有太多实际的操作经验所以不太好胡乱举例避免引起误解 《数学模型的建设--起点篇》正在杜撰中......。