VC++的随机性问题(连连看随机地图的生成)

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块,这样的话玩家怎么连也连不完啊!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值