俄罗斯方块游戏设计——不拘一格编程序之二
2011-07-25 10:58
381 查看
不拘一格编程序之二
俄罗斯方块插入新增随机行算法
【题目】:一个数组int a[10],要求为每个元素随机赋值0或者1,但是这10个元素不能全0,也不能全1。【说明】:俄罗斯方块中需要在最下面插入若干具有随机方块的行,以增加游戏的难度。当然不能一行全是方块,这样就不能掉呢。也不能没有方块,那样难度会小一些。
【方法1】逐个随机,统一判断随机产生10个元素,如果都是0,或者都是1,就重新生成。 算法的关键不是逐个产生随机数,而是如何确定产生的随机数是全0?全1?或者0、1都有。
【方法1.1】标志法(部分法)增加变量n1。如果n1=1表示10个随机数全为0.在增加变量n2。如果n2=1表示10个随机数全为1. int n1 =1, n2 = 1;
for (int i=0; i<10; i++)
{
a[i] = random(2);
if (a[i] == 0) n2 = 0 ;
else n1 = 0;
}if (n1 == 1 || n2 == 1) 重新来过。 【方法1.2】整体法将a[i]的取值全部加起来,结果为0表示全0,结果为10表示全1。int sum=0;
for (int i=0; i<10; i++)
{
a[i] = random(2);
sum += a[i];
}if (sum==0 || sum == 10) 重新来过。
重新来过又有多种表示方法:【方法1.3】:标签法
![](http://blog.51cto.com/images/editer/InBlock.gif)
label1:
![](http://blog.51cto.com/images/editer/InBlock.gif)
n1 = 1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
n2 = 1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
for (int i=0; i<10; i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i] = random(2);
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (a[i] == 0) n2 = 0 ;
![](http://blog.51cto.com/images/editer/InBlock.gif)
else n1 = 0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (n1 == 1|| n2 == 1)goto lable1; 【方法1.4】:循环法法
![](http://blog.51cto.com/images/editer/InBlock.gif)
n1=1;n2=1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
while (n1==1||n2==1)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
n1 = 1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
n2 = 1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
for (int i=0; i<10; i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i] = random(2);
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (a[i] == 0) n2 = 0 ;
![](http://blog.51cto.com/images/editer/InBlock.gif)
else n1 = 0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
} 【方法1.5】:循环法
![](http://blog.51cto.com/images/editer/InBlock.gif)
int sum=0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
while(sum=0 || sum==10)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
sum=0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
for (int i=0; i<10; i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i] = random(2);
![](http://blog.51cto.com/images/editer/InBlock.gif)
sum += a[i];
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
} 【方法2】:先后随机重新生成随机数太麻烦了,反正10个随机数字至少有一个0和一个1,不如先随机确定0和1的位置,再随机产生其它8个随机数。 定义变量n1是0的位置,变量n2是1的位置。第一次随机的n1有0~9一共10个位置,第二次的n2则只有9个位置:
![](http://blog.51cto.com/images/editer/InBlock.gif)
int n1,n2;
![](http://blog.51cto.com/images/editer/InBlock.gif)
n1 = random(10);
![](http://blog.51cto.com/images/editer/InBlock.gif)
n2=random(9);
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (n2 >= n1) n2++; 如果n1=3,n2=3,那么n2其实是第4个。同理如果n1=3,n2=4,其实是第5个。
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[n1]=0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[n2]=1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
for (int i=0; i<10; i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (i == n1 || i == n2)continue; 这两个已经有了,不用了。
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i] = random(2);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}【方法3】:逐个随机,再来随机先随机生成10个数。如果全为0的话,再随机选择一个位置生成1;如果全为1的话,则随机选择一个位置生成0。
![](http://blog.51cto.com/images/editer/InBlock.gif)
int n;
![](http://blog.51cto.com/images/editer/InBlock.gif)
int sum=0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
for (int i=0; i<10; i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i]=random(2);
![](http://blog.51cto.com/images/editer/InBlock.gif)
sum+=a[i];
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (sum==0)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
n=random(10);
![](http://blog.51cto.com/images/editer/InBlock.gif)
a
=1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (sum==10)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
n=random(10);
![](http://blog.51cto.com/images/editer/InBlock.gif)
a
=0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}当然,上面的程序还可以改为:(把最后的判断合一)。
![](http://blog.51cto.com/images/editer/InBlock.gif)
int n;
![](http://blog.51cto.com/images/editer/InBlock.gif)
int sum=0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
for (int i=0; i<10; i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i]=random(2);
![](http://blog.51cto.com/images/editer/InBlock.gif)
sum+=a[i];
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (sum==0 || sum == 10)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
n=random(10);
![](http://blog.51cto.com/images/editer/InBlock.gif)
a
= sum/10;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}【方法4】:整体随机,位运算利用位运算,随机产生一个1~210-1之间的数,这个数一共10位,而且不会每位皆为0(全为0的数是0),也不会全为1(全为1的数是210-1),那么再将这个数的每一位的取值赋值到数组a[i]中对应的元素去就可以了。
![](http://blog.51cto.com/images/editer/InBlock.gif)
int u;
![](http://blog.51cto.com/images/editer/InBlock.gif)
u = random(1023) + 1; 如果不加1,是0~1022之间,而我们需要1~1023之间。
![](http://blog.51cto.com/images/editer/InBlock.gif)
for(int i=0; i<10;i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i] = (u>>i)&1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}或者这样:
![](http://blog.51cto.com/images/editer/InBlock.gif)
int u;
![](http://blog.51cto.com/images/editer/InBlock.gif)
u = random(1023) + 1; 如果不加1,是0~1022之间,而我们需要1~1023之间。
![](http://blog.51cto.com/images/editer/InBlock.gif)
for(int i=0; i<10;i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i] = u&1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
u=u>>1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
当然,实际上还有更多的方法,而每种方法实现也有更多的表示方法,同学们在编程序的时候不要限制了自己的思维,不同的环境下,需要不同的方法。 相关文章:不拘一格编程序之一循环打印算法 不拘一格编程序之二俄罗斯方块新增行算法 不拘一格遍程序之三变量取值交换算法 不拘一格编程序之四循环的各种形式 以下是广告,非喜勿入
俄罗斯方块插入新增随机行算法
【题目】:一个数组int a[10],要求为每个元素随机赋值0或者1,但是这10个元素不能全0,也不能全1。【说明】:俄罗斯方块中需要在最下面插入若干具有随机方块的行,以增加游戏的难度。当然不能一行全是方块,这样就不能掉呢。也不能没有方块,那样难度会小一些。
【方法1】逐个随机,统一判断随机产生10个元素,如果都是0,或者都是1,就重新生成。 算法的关键不是逐个产生随机数,而是如何确定产生的随机数是全0?全1?或者0、1都有。
【方法1.1】标志法(部分法)增加变量n1。如果n1=1表示10个随机数全为0.在增加变量n2。如果n2=1表示10个随机数全为1. int n1 =1, n2 = 1;
for (int i=0; i<10; i++)
{
a[i] = random(2);
if (a[i] == 0) n2 = 0 ;
else n1 = 0;
}if (n1 == 1 || n2 == 1) 重新来过。 【方法1.2】整体法将a[i]的取值全部加起来,结果为0表示全0,结果为10表示全1。int sum=0;
for (int i=0; i<10; i++)
{
a[i] = random(2);
sum += a[i];
}if (sum==0 || sum == 10) 重新来过。
重新来过又有多种表示方法:【方法1.3】:标签法
![](http://blog.51cto.com/images/editer/InBlock.gif)
label1:
![](http://blog.51cto.com/images/editer/InBlock.gif)
n1 = 1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
n2 = 1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
for (int i=0; i<10; i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i] = random(2);
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (a[i] == 0) n2 = 0 ;
![](http://blog.51cto.com/images/editer/InBlock.gif)
else n1 = 0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (n1 == 1|| n2 == 1)goto lable1; 【方法1.4】:循环法法
![](http://blog.51cto.com/images/editer/InBlock.gif)
n1=1;n2=1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
while (n1==1||n2==1)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
n1 = 1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
n2 = 1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
for (int i=0; i<10; i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i] = random(2);
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (a[i] == 0) n2 = 0 ;
![](http://blog.51cto.com/images/editer/InBlock.gif)
else n1 = 0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
} 【方法1.5】:循环法
![](http://blog.51cto.com/images/editer/InBlock.gif)
int sum=0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
while(sum=0 || sum==10)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
sum=0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
for (int i=0; i<10; i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i] = random(2);
![](http://blog.51cto.com/images/editer/InBlock.gif)
sum += a[i];
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
} 【方法2】:先后随机重新生成随机数太麻烦了,反正10个随机数字至少有一个0和一个1,不如先随机确定0和1的位置,再随机产生其它8个随机数。 定义变量n1是0的位置,变量n2是1的位置。第一次随机的n1有0~9一共10个位置,第二次的n2则只有9个位置:
![](http://blog.51cto.com/images/editer/InBlock.gif)
int n1,n2;
![](http://blog.51cto.com/images/editer/InBlock.gif)
n1 = random(10);
![](http://blog.51cto.com/images/editer/InBlock.gif)
n2=random(9);
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (n2 >= n1) n2++; 如果n1=3,n2=3,那么n2其实是第4个。同理如果n1=3,n2=4,其实是第5个。
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[n1]=0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[n2]=1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
for (int i=0; i<10; i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (i == n1 || i == n2)continue; 这两个已经有了,不用了。
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i] = random(2);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}【方法3】:逐个随机,再来随机先随机生成10个数。如果全为0的话,再随机选择一个位置生成1;如果全为1的话,则随机选择一个位置生成0。
![](http://blog.51cto.com/images/editer/InBlock.gif)
int n;
![](http://blog.51cto.com/images/editer/InBlock.gif)
int sum=0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
for (int i=0; i<10; i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i]=random(2);
![](http://blog.51cto.com/images/editer/InBlock.gif)
sum+=a[i];
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (sum==0)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
n=random(10);
![](http://blog.51cto.com/images/editer/InBlock.gif)
a
=1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (sum==10)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
n=random(10);
![](http://blog.51cto.com/images/editer/InBlock.gif)
a
=0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}当然,上面的程序还可以改为:(把最后的判断合一)。
![](http://blog.51cto.com/images/editer/InBlock.gif)
int n;
![](http://blog.51cto.com/images/editer/InBlock.gif)
int sum=0;
![](http://blog.51cto.com/images/editer/InBlock.gif)
for (int i=0; i<10; i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i]=random(2);
![](http://blog.51cto.com/images/editer/InBlock.gif)
sum+=a[i];
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
if (sum==0 || sum == 10)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
n=random(10);
![](http://blog.51cto.com/images/editer/InBlock.gif)
a
= sum/10;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}【方法4】:整体随机,位运算利用位运算,随机产生一个1~210-1之间的数,这个数一共10位,而且不会每位皆为0(全为0的数是0),也不会全为1(全为1的数是210-1),那么再将这个数的每一位的取值赋值到数组a[i]中对应的元素去就可以了。
![](http://blog.51cto.com/images/editer/InBlock.gif)
int u;
![](http://blog.51cto.com/images/editer/InBlock.gif)
u = random(1023) + 1; 如果不加1,是0~1022之间,而我们需要1~1023之间。
![](http://blog.51cto.com/images/editer/InBlock.gif)
for(int i=0; i<10;i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i] = (u>>i)&1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}或者这样:
![](http://blog.51cto.com/images/editer/InBlock.gif)
int u;
![](http://blog.51cto.com/images/editer/InBlock.gif)
u = random(1023) + 1; 如果不加1,是0~1022之间,而我们需要1~1023之间。
![](http://blog.51cto.com/images/editer/InBlock.gif)
for(int i=0; i<10;i++)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
a[i] = u&1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
u=u>>1;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
当然,实际上还有更多的方法,而每种方法实现也有更多的表示方法,同学们在编程序的时候不要限制了自己的思维,不同的环境下,需要不同的方法。 相关文章:不拘一格编程序之一循环打印算法 不拘一格编程序之二俄罗斯方块新增行算法 不拘一格遍程序之三变量取值交换算法 不拘一格编程序之四循环的各种形式 以下是广告,非喜勿入
《计算机达人成长之路——憧憬与迷茫篇》终于上市了,现在已经在网上预售,预售地址为: 当当网:http://product.dangdang.com/product.aspx?product_id=22457857 卓越网:http://www.amazon.cn/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%BE%BE%E4%BA%BA%E6%88%90%E9%95%BF%E4%B9%8B%E8%B7%AF-%E6%9C%B1%E4%BA%91%E7%BF%94/dp/B005DIQMGU/ref=sr_1_1?ie=UTF8&qid=1311338256&sr=8-1 互动出版:http://product.china-pub.com/198427&chinapub=eqf&website_id=55880&eu_id=53013396_s6729905 各位《计算机达人成长之路》的粉丝们,感谢大家的支持,现在新书终于出版了,请大家:有钱的捧个预订,有人的到豆瓣网上做一个5星评价! 豆瓣地址为: http://book.douban.com/subject/6729905/ 我在豆瓣的主页为: http://www.douban.com/people/zyxhp/ 希望大家一如既往的支持! |
相关文章推荐
- 俄罗斯方块新增行算法:不拘一格编程序之二
- 一个MIDP俄罗斯方块游戏的设计和实现
- 设计俄罗斯方块游戏之时间——计算机达人成长之路(14)连载
- 一个MIDP俄罗斯方块游戏的设计和实现
- 一个MIDP俄罗斯方块游戏的设计和实现
- 我的第一个完整游戏程序:俄罗斯方块
- 俄罗斯方块游戏设计的有关问题
- 设计俄罗斯方块游戏之时间——计算机达人成长之路(14)连载
- 用面向对象方法进行俄罗斯方块游戏设计(持续更新中)
- J2ME游戏俄罗斯方块的设计与改良
- 我的一位学生设计的俄罗斯方块游戏
- Shell编程实现俄罗斯方块游戏(一步步详解)一
- QT -WS俄罗斯方块游戏
- 游戏程序的设计模式--工厂模式
- 俄罗斯方块游戏笔记(二)——参数配置窗体
- pyQt4实现俄罗斯方块游戏
- [转] 不错的俄罗斯方块程序代码(VC++版)
- 用TC2.0写俄罗斯方块游戏---cnasm
- Swift游戏开发之俄罗斯方块:No.6 构建形状
- [java游戏开发快速入门]俄罗斯方块游戏开发开篇