记录:游戏开发中那些小坑坑
2015-11-12 17:14
260 查看
记录:游戏开发中那些小坑坑。记录游戏开发过程中,那些有点意思的思路和代码。
首先:c++ 随机值rand()。
无论你怎么去百度,都说rand()是伪随机,加上时间种子srand(time(NULL));就变成了真随机。那么真的天正的去 int m_rand=rand()%10+10;取(10~20)之间的随机数的时候。其实已经不是“真随机了”。当值太小的时候看不出什么,但是当我上一款游戏捕鱼,概率在万分之几的时候,差距就立马体现出来。
分析:比如鱼捕获概率是万分之200,鱼倍数时50倍。理论上在这条鱼身上是不会亏也不会赚的,但是实际上对于大多数这种鱼而言我们都是亏的。为什么呢?rand()最大32767(int 4字节)一个rand()不够,那么
拼接的方式
这样m_real_rand就是我们要的随机,但是它不是真的随机,捕获的概率大于设置概率。因为在0-32767上是均匀得。那么小于100的话每个数32699上每个数也是均匀得,当在32700-32767时取余数,意味着68以上 的数永远不存在,即68以下概率大于我们想的小于68的概率。
算法改进:
既然rand()只能对应32768个数,那么只要建立函数,换算成0-10000的概率不就好了
上线一跑果然好了很多,某天该死的产品(看不到看不到),把概率改成了10万,同理松松的解决的,我天,概率又偏了。什么鬼,内心是奔溃的。 可以看成
那么这个m_r_raal是不连续的,即0,3,6,9 这就意味着 设置概率为8时,实际判断 概率为6。在10万分之2的概率上玩家体会不到,但是服务器一统计就很敏感。
回到1万为什么概率没偏呢,好吧其实是偏了,不过影响小太多了,服务器数据没反应出来。读者自己算去。
改进又一次
既然偏了是因为零头影响那么,递归把零头抹去呗。
*其次:变量回执问题*
有时候会有这样的情况
常用吧,我也是这么觉得的。但是括号这么累哎,于是有
那么跳跃下思路可否有两个值,也是能这么优雅的切换呢?
so:数学渣开始分析了
假设:f(x)=ax+b;
有:f(n)=an+b;f(n)=m;
f(m)=n=am+b;
消除b => a=-1
b=m+n;
f(x)=n+m-x;
紧接着:UI美术做好了。我要去工作了,有空继续
首先:c++ 随机值rand()。
无论你怎么去百度,都说rand()是伪随机,加上时间种子srand(time(NULL));就变成了真随机。那么真的天正的去 int m_rand=rand()%10+10;取(10~20)之间的随机数的时候。其实已经不是“真随机了”。当值太小的时候看不出什么,但是当我上一款游戏捕鱼,概率在万分之几的时候,差距就立马体现出来。
分析:比如鱼捕获概率是万分之200,鱼倍数时50倍。理论上在这条鱼身上是不会亏也不会赚的,但是实际上对于大多数这种鱼而言我们都是亏的。为什么呢?rand()最大32767(int 4字节)一个rand()不够,那么
拼接的方式
int m_r_high=rand()%100; int m_r_low=rand()%100; int m_real_rand=m_r_high*100+m_r_low;
这样m_real_rand就是我们要的随机,但是它不是真的随机,捕获的概率大于设置概率。因为在0-32767上是均匀得。那么小于100的话每个数32699上每个数也是均匀得,当在32700-32767时取余数,意味着68以上 的数永远不存在,即68以下概率大于我们想的小于68的概率。
算法改进:
既然rand()只能对应32768个数,那么只要建立函数,换算成0-10000的概率不就好了
int m_r_temp = rand(); int m_r_real = m_r_temp * 10000 / 32768;
上线一跑果然好了很多,某天该死的产品(看不到看不到),把概率改成了10万,同理松松的解决的,我天,概率又偏了。什么鬼,内心是奔溃的。 可以看成
int m_r_temp = rand(); int m_r_real = m_r_temp * 3.05;
那么这个m_r_raal是不连续的,即0,3,6,9 这就意味着 设置概率为8时,实际判断 概率为6。在10万分之2的概率上玩家体会不到,但是服务器一统计就很敏感。
回到1万为什么概率没偏呢,好吧其实是偏了,不过影响小太多了,服务器数据没反应出来。读者自己算去。
改进又一次
int CTableFrameSink::tools_hrand() { int t_rand = rand(); if (t_rand >= 30000) { return tools_hrand(); } else return t_rand; }
既然偏了是因为零头影响那么,递归把零头抹去呗。
*其次:变量回执问题*
有时候会有这样的情况
if (boolFlag) { boolFlag = false; } else { boolFlag = true; }
常用吧,我也是这么觉得的。但是括号这么累哎,于是有
boolFlag=!boolFlag; //或者 boolFlag=1-boolFlag;
那么跳跃下思路可否有两个值,也是能这么优雅的切换呢?
so:数学渣开始分析了
假设:f(x)=ax+b;
有:f(n)=an+b;f(n)=m;
f(m)=n=am+b;
消除b => a=-1
b=m+n;
f(x)=n+m-x;
紧接着:UI美术做好了。我要去工作了,有空继续
相关文章推荐
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- 在C语言中转换时间的基本方法介绍