VC++的随机性问题(连连看随机地图的生成)
2010-08-03 22:03
302 查看
for(int iNum=0;iNum<(m_nCol*m_nRow);iNum++)
{
m_map[iNum]=BLANK_STATE;
}
//布下随机种子
srand(time(NULL));
//生成随机地图,将成对的图案放进临时地图存储空间中
CDWordArray tmpMap;
for(int i=0;i<(m_nCol*m_nRow)/4;i++)
for(int j=0;j<4;j++)
tmpMap.Add(i);
//从临时地图中取走一个图案放到空块上
for(i=0;i<m_nRow*m_nCol;i++)
{
//随机挑选位置
int nIndex=(int(rand()*0.1+rand()*0.01+rand()))%tmpMap.GetSize();
//将选定的图案放到空方块上
m_map[i]=tmpMap.GetAt(nIndex);
//在临时地图删除该方块
tmpMap.RemoveAt(nIndex);
*****咱先不妨设地图大小为16*9=144,图案有144/4=36种,分别是对应编号为1,2,3...36的水晶球,这是水晶连连看的地图,猜出来了吧! *****16*9=144个格子,生成地图前用到一个模板,或者说是临时地图,每次都是一样的,接着被一个一个的取走,直到把新地图填满,而模板也被淘空了!
下次生成新地图时再生成这样一个模板。每次生成的模板如下:
1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8 9 9 9 9 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15 15 15 16 16 16 16 17 17 17 17 18 18 18 18 19 19 19 19 20 20 20 20 21 21 21 21 22 22 22 22 23 23 23 23 24 24 24 24 25 25 25 25 26 26 26 26 27 27 27 27 28 28 28 28 29 29 29 29 30 30 30 30 31 31 31 31 32 32 32 32 33 33 33 33 34 34 34 34 35 35 35 35 36 36 36 36
***** *****好,现在是生成新地图的时候了。首先给第1个(左上角第一个)空块分配图案(用编号表示),它可能取道以上模板中144个图案((索引范围是0~143且有重复)中的任何一个,这就需要一个0~143的随机数,理想情况只用rand()%144一条语句就可以实现,而实际上为了避免前后两次取道的图案过于接近,需要这个数更随机些,所有用int(rand()*0.1+rand()*0.01+rand())。而144是此时的模板大小,即tmpMap.GetSize()。
***** *****接着,给第2个(左上角第二个)空块分配图案。注意,此时的模板已经被取走了一个编号明确的图案(不妨假设它是18#图案),即模板中只有3个18#图案了,总共143个,即新的tmpMap.GetSize()。接下去,就要在这剩下的143个剩余图案(索引范围是0~142)中随机去一个,这就需要一个0~142的随机数,来按索引取模板中的一个图案。随机数的生成没问题,如何把它限制在143范围内?让这个新随机数对143进行求摸运算即可,即除以143去余数,余数肯定在143范围之内。
***** *****接下去,模板又少了一块剩下142块,而新地图第2块又填上了一块明确的图案。其它空块的填补以此类推......
***** *****为什么每次生成的随机数范围要不一样呢?因为假如一样的话,那就要求模板不能缩减,因为缩减的话按随机数从模板数值取数时,很可能会越界。好,现在假设每取完一个图块后模板也不变,会出现什么情况...?可想而知,地图随机性变成完全不可控了,可能纯蓝水晶块只有1块,而纯绿水晶块则有5块,这样的话玩家怎么连也连不完啊!
{
m_map[iNum]=BLANK_STATE;
}
//布下随机种子
srand(time(NULL));
//生成随机地图,将成对的图案放进临时地图存储空间中
CDWordArray tmpMap;
for(int i=0;i<(m_nCol*m_nRow)/4;i++)
for(int j=0;j<4;j++)
tmpMap.Add(i);
//从临时地图中取走一个图案放到空块上
for(i=0;i<m_nRow*m_nCol;i++)
{
//随机挑选位置
int nIndex=(int(rand()*0.1+rand()*0.01+rand()))%tmpMap.GetSize();
//将选定的图案放到空方块上
m_map[i]=tmpMap.GetAt(nIndex);
//在临时地图删除该方块
tmpMap.RemoveAt(nIndex);
*****咱先不妨设地图大小为16*9=144,图案有144/4=36种,分别是对应编号为1,2,3...36的水晶球,这是水晶连连看的地图,猜出来了吧! *****16*9=144个格子,生成地图前用到一个模板,或者说是临时地图,每次都是一样的,接着被一个一个的取走,直到把新地图填满,而模板也被淘空了!
下次生成新地图时再生成这样一个模板。每次生成的模板如下:
1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8 9 9 9 9 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15 15 15 16 16 16 16 17 17 17 17 18 18 18 18 19 19 19 19 20 20 20 20 21 21 21 21 22 22 22 22 23 23 23 23 24 24 24 24 25 25 25 25 26 26 26 26 27 27 27 27 28 28 28 28 29 29 29 29 30 30 30 30 31 31 31 31 32 32 32 32 33 33 33 33 34 34 34 34 35 35 35 35 36 36 36 36
***** *****好,现在是生成新地图的时候了。首先给第1个(左上角第一个)空块分配图案(用编号表示),它可能取道以上模板中144个图案((索引范围是0~143且有重复)中的任何一个,这就需要一个0~143的随机数,理想情况只用rand()%144一条语句就可以实现,而实际上为了避免前后两次取道的图案过于接近,需要这个数更随机些,所有用int(rand()*0.1+rand()*0.01+rand())。而144是此时的模板大小,即tmpMap.GetSize()。
***** *****接着,给第2个(左上角第二个)空块分配图案。注意,此时的模板已经被取走了一个编号明确的图案(不妨假设它是18#图案),即模板中只有3个18#图案了,总共143个,即新的tmpMap.GetSize()。接下去,就要在这剩下的143个剩余图案(索引范围是0~142)中随机去一个,这就需要一个0~142的随机数,来按索引取模板中的一个图案。随机数的生成没问题,如何把它限制在143范围内?让这个新随机数对143进行求摸运算即可,即除以143去余数,余数肯定在143范围之内。
***** *****接下去,模板又少了一块剩下142块,而新地图第2块又填上了一块明确的图案。其它空块的填补以此类推......
***** *****为什么每次生成的随机数范围要不一样呢?因为假如一样的话,那就要求模板不能缩减,因为缩减的话按随机数从模板数值取数时,很可能会越界。好,现在假设每取完一个图块后模板也不变,会出现什么情况...?可想而知,地图随机性变成完全不可控了,可能纯蓝水晶块只有1块,而纯绿水晶块则有5块,这样的话玩家怎么连也连不完啊!
相关文章推荐
- Unity中利用柏林噪音生成随机地图
- 上传文件细节处理问题(包括中文乱码、限制文件大小、显示上传速度、删除临时文件,随机生成文件夹等)
- 程序化随机多边形地图生成
- 技术贴:如何简单地做游戏随机生成地图
- cocos2d-x3.6 连连看随机地图实现
- 软件crash后生成dmp,可用VC编译器和Windbg查看 简单使用问题
- LunarLander 随机生成地面地图!
- Unity2D - 6. 生成随机地图 (2) - 脚本控制Tilemap (1) 自动切换不同的sprite
- VC生成的DLL给QT的EXE调用时lib路径问题小结
- js 生成随机汉字的问题
- 问题求解,关于java随机生成指定长度的字符串
- python 2.7 创建问题加答案(选择题-2)生成随机的测试试卷文件
- BCB调用VC生成的LIB的兼容问题
- 生成随机字符串的问题
- 地图随机生成lua版本
- 001【2D Rougelike】随机地图的生成
- 关于使用vc++调用matlab生成的dll传递数组的问题
- 百万员工信息随机生成和工资求和问题
- 关于arcgis用GP服务模型 生成等直面没有跟地图一致,颜色区设置及数据接收问题的解决方法!
- 一些VC生成动态链接库的问题记载(不断更新中)