俄罗斯方块新增行算法:不拘一格编程序之二
生活随笔
收集整理的這篇文章主要介紹了
俄罗斯方块新增行算法:不拘一格编程序之二
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
不拘一格編程序之二? 俄羅斯方塊插入新增隨機(jī)行算法 作者:朱云翔 ? 【題目】: 一個(gè)數(shù)組int a[10],要求為每個(gè)元素隨機(jī)賦值0或者1,但是這10個(gè)元素不能全0,也不能全1。 【說(shuō)明】:俄羅斯方塊中需要在最下面插入若干具有隨機(jī)方塊的行,以增加游戲的難度。當(dāng)然不能一行全是方塊,這樣就不能掉呢。也不能沒(méi)有方塊,那樣難度會(huì)小一些。
【方法1】逐個(gè)隨機(jī),統(tǒng)一判斷 隨機(jī)產(chǎn)生10個(gè)元素,如果都是0,或者都是1,就重新生成。 ? 算法的關(guān)鍵不是逐個(gè)產(chǎn)生隨機(jī)數(shù),而是如何確定產(chǎn)生的隨機(jī)數(shù)是全0?全1?或者0、1都有。
【方法1.1】標(biāo)志法(部分法) 增加變量n1。如果n1=1表示10個(gè)隨機(jī)數(shù)全為0. 在增加變量n2。如果n2=1表示10個(gè)隨機(jī)數(shù)全為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) 重新來(lái)過(guò)。 ? 【方法1.2】整體法 將a[i]的取值全部加起來(lái),結(jié)果為0表示全0,結(jié)果為10表示全1。 int sum=0;
for (int i=0; i<10; i++)
{?
????????a[i] = random(2);?
????????sum += a[i];
} if (sum==0 || sum == 10) 重新來(lái)過(guò)。
重新來(lái)過(guò)又有多種表示方法: 【方法1.3】:標(biāo)簽法 label1:
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) goto lable1; 【方法1.4】:循環(huán)法法 n1=1;n2=1;
while (n1==1||n2==1)
{
????????n1 = 1;
????????n2 = 1;
????????for (int i=0; i<10; i++)
????????{
????????????????a[i] = random(2);
????????????????if (a[i] == 0)????n2 = 0 ;
????????????????else n1 = 0;
????????}
} 【方法1.5】:循環(huán)法 int sum=0;
while(sum=0 || sum==10)
{
????????sum=0;
????????for (int i=0; i<10; i++)
????????{
???????????????? a[i] = random(2);
????????????????sum += a[i];
????????}
} 【方法2】:先后隨機(jī) 重新生成隨機(jī)數(shù)太麻煩了,反正10個(gè)隨機(jī)數(shù)字至少有一個(gè)0和一個(gè)1,不如先隨機(jī)確定0和1的位置,再隨機(jī)產(chǎn)生其它8個(gè)隨機(jī)數(shù)。 ? 定義變量n1是0的位置,變量n2是1的位置。 第一次隨機(jī)的n1有0~9一共10個(gè)位置,第二次的n2則只有9個(gè)位置: int n1,n2;
n1 = random(10);
n2=random(9);
if (n2 >= n1) n2++;???? 如果n1=3,n2=3,那么n2其實(shí)是第4個(gè)。同理如果n1=3,n2=4,其實(shí)是第5個(gè)。
a[n1]=0;
a[n2]=1;
for (int i=0; i<10; i++)
{
????????if (i == n1 || i == n2) continue;????????????????這兩個(gè)已經(jīng)有了,不用了。
????????a[i] = random(2);
} 【方法3】:逐個(gè)隨機(jī),再來(lái)隨機(jī) 先隨機(jī)生成10個(gè)數(shù)。如果全為0的話,再隨機(jī)選擇一個(gè)位置生成1;如果全為1的話,則隨機(jī)選擇一個(gè)位置生成0。 int n;
int sum=0;
for (int i=0; i<10; i++)
{
????????a[i]=random(2);
????????sum+=a[i];
}
if (sum==0)
{
????????n=random(10);
????????a[n]=1;
}
if (sum==10)
{
????????n=random(10);
????????a[n]=0;
} 當(dāng)然,上面的程序還可以改為:(把最后的判斷合一)。 int n;
int sum=0;
for (int i=0; i<10; i++)
{
????????a[i]=random(2);
????????sum+=a[i];
}
if (sum==0 || sum == 10)
{
????????n=random(10);
????????a[n]= sum/10;
} 【方法4】:整體隨機(jī),位運(yùn)算 利用位運(yùn)算,隨機(jī)產(chǎn)生一個(gè)1~210-1之間的數(shù),這個(gè)數(shù)一共10位,而且不會(huì)每位皆為0(全為0的數(shù)是0),也不會(huì)全為1(全為1的數(shù)是210-1),那么再將這個(gè)數(shù)的每一位的取值賦值到數(shù)組a[i]中對(duì)應(yīng)的元素去就可以了。 int u;
u = random(1023) + 1;???? 如果不加1,是0~1022之間,而我們需要1~1023之間。
for(int i=0; i<10;i++)
{
????????a[i] = (u>>i)&1;
} 或者這樣: int u;
u = random(1023) + 1;???? 如果不加1,是0~1022之間,而我們需要1~1023之間。
for(int i=0; i<10;i++)
{
????????a[i] = u&1;
????????u=u>>1;
}
當(dāng)然,實(shí)際上還有更多的方法,而每種方法實(shí)現(xiàn)也有更多的表示方法,同學(xué)們?cè)诰幊绦虻臅r(shí)候不要限制了自己的思維,不同的環(huán)境下,需要不同的方法。 ? 相關(guān)文章:不拘一格編程序之一循環(huán)打印算法?? ????????? 不拘一格編程序之二俄羅斯方塊新增行算法 ???????????????? ?不拘一格遍程序之三變量取值交換算法 不拘一格編程序之四循環(huán)的各種形式
【方法1】逐個(gè)隨機(jī),統(tǒng)一判斷 隨機(jī)產(chǎn)生10個(gè)元素,如果都是0,或者都是1,就重新生成。 ? 算法的關(guān)鍵不是逐個(gè)產(chǎn)生隨機(jī)數(shù),而是如何確定產(chǎn)生的隨機(jī)數(shù)是全0?全1?或者0、1都有。
【方法1.1】標(biāo)志法(部分法) 增加變量n1。如果n1=1表示10個(gè)隨機(jī)數(shù)全為0. 在增加變量n2。如果n2=1表示10個(gè)隨機(jī)數(shù)全為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) 重新來(lái)過(guò)。 ? 【方法1.2】整體法 將a[i]的取值全部加起來(lái),結(jié)果為0表示全0,結(jié)果為10表示全1。 int sum=0;
for (int i=0; i<10; i++)
{?
????????a[i] = random(2);?
????????sum += a[i];
} if (sum==0 || sum == 10) 重新來(lái)過(guò)。
重新來(lái)過(guò)又有多種表示方法: 【方法1.3】:標(biāo)簽法 label1:
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) goto lable1; 【方法1.4】:循環(huán)法法 n1=1;n2=1;
while (n1==1||n2==1)
{
????????n1 = 1;
????????n2 = 1;
????????for (int i=0; i<10; i++)
????????{
????????????????a[i] = random(2);
????????????????if (a[i] == 0)????n2 = 0 ;
????????????????else n1 = 0;
????????}
} 【方法1.5】:循環(huán)法 int sum=0;
while(sum=0 || sum==10)
{
????????sum=0;
????????for (int i=0; i<10; i++)
????????{
???????????????? a[i] = random(2);
????????????????sum += a[i];
????????}
} 【方法2】:先后隨機(jī) 重新生成隨機(jī)數(shù)太麻煩了,反正10個(gè)隨機(jī)數(shù)字至少有一個(gè)0和一個(gè)1,不如先隨機(jī)確定0和1的位置,再隨機(jī)產(chǎn)生其它8個(gè)隨機(jī)數(shù)。 ? 定義變量n1是0的位置,變量n2是1的位置。 第一次隨機(jī)的n1有0~9一共10個(gè)位置,第二次的n2則只有9個(gè)位置: int n1,n2;
n1 = random(10);
n2=random(9);
if (n2 >= n1) n2++;???? 如果n1=3,n2=3,那么n2其實(shí)是第4個(gè)。同理如果n1=3,n2=4,其實(shí)是第5個(gè)。
a[n1]=0;
a[n2]=1;
for (int i=0; i<10; i++)
{
????????if (i == n1 || i == n2) continue;????????????????這兩個(gè)已經(jīng)有了,不用了。
????????a[i] = random(2);
} 【方法3】:逐個(gè)隨機(jī),再來(lái)隨機(jī) 先隨機(jī)生成10個(gè)數(shù)。如果全為0的話,再隨機(jī)選擇一個(gè)位置生成1;如果全為1的話,則隨機(jī)選擇一個(gè)位置生成0。 int n;
int sum=0;
for (int i=0; i<10; i++)
{
????????a[i]=random(2);
????????sum+=a[i];
}
if (sum==0)
{
????????n=random(10);
????????a[n]=1;
}
if (sum==10)
{
????????n=random(10);
????????a[n]=0;
} 當(dāng)然,上面的程序還可以改為:(把最后的判斷合一)。 int n;
int sum=0;
for (int i=0; i<10; i++)
{
????????a[i]=random(2);
????????sum+=a[i];
}
if (sum==0 || sum == 10)
{
????????n=random(10);
????????a[n]= sum/10;
} 【方法4】:整體隨機(jī),位運(yùn)算 利用位運(yùn)算,隨機(jī)產(chǎn)生一個(gè)1~210-1之間的數(shù),這個(gè)數(shù)一共10位,而且不會(huì)每位皆為0(全為0的數(shù)是0),也不會(huì)全為1(全為1的數(shù)是210-1),那么再將這個(gè)數(shù)的每一位的取值賦值到數(shù)組a[i]中對(duì)應(yīng)的元素去就可以了。 int u;
u = random(1023) + 1;???? 如果不加1,是0~1022之間,而我們需要1~1023之間。
for(int i=0; i<10;i++)
{
????????a[i] = (u>>i)&1;
} 或者這樣: int u;
u = random(1023) + 1;???? 如果不加1,是0~1022之間,而我們需要1~1023之間。
for(int i=0; i<10;i++)
{
????????a[i] = u&1;
????????u=u>>1;
}
當(dāng)然,實(shí)際上還有更多的方法,而每種方法實(shí)現(xiàn)也有更多的表示方法,同學(xué)們?cè)诰幊绦虻臅r(shí)候不要限制了自己的思維,不同的環(huán)境下,需要不同的方法。 ? 相關(guān)文章:不拘一格編程序之一循環(huán)打印算法?? ????????? 不拘一格編程序之二俄羅斯方塊新增行算法 ???????????????? ?不拘一格遍程序之三變量取值交換算法 不拘一格編程序之四循環(huán)的各種形式
總結(jié)
以上是生活随笔為你收集整理的俄罗斯方块新增行算法:不拘一格编程序之二的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 原来SMPlayer可以直接播放音乐CD
- 下一篇: asp.net mvc 405