您的位置:首页 > 编程语言 > C语言/C++

记录:游戏开发中那些小坑坑

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()不够,那么

拼接的方式

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语言 游戏开发