當前位置:首頁 » 操作系統 » 方塊的演算法

方塊的演算法

發布時間: 2022-09-08 09:59:39

㈠ 尋找關於俄羅斯方塊程序的演算法,不要程序,只要演算法

核心演算法:
這里把游戲的關鍵設計放在三個盒子和一個坐標上:
大盒子:一個兩維數組,記錄著方塊點陣的開與關(把游戲的舞台想像
成一個點陣),在下面也把這個東西稱為地圖
兩個5*5小盒子:兩維數組,一個盛放著正在下落的方塊,一個盛放在
下一個下落的方塊(即next),當然這兩個也必須想像成一個點陣:如長條
的點陣為:
00000
00100
00100
00100
00100
現在你只要有這么一個概念:一個不斷定時下落的小盒子從大盒子頂
部下降到底部,之後再將next盒子放在下落盒子,再進行下一輪的下落...
中間的控制等尚不要太著急.
現在面臨著一個問題:
下落的盒子和地圖之間要怎麼聯系起來?
一個好的方法是再定義一個坐標:x,y,保存著小盒子左上角在地圖上對應
的下標(位置),即當x = 0, y = 0時,小盒子處於地圖的左上部.如此,當
小盒子需要移動時,即只須要改變x,y的值.
現在說說旋轉.
小盒子保存著當前下落形狀的點陣,那麼旋轉就只須要將這個點陣旋
轉90度:例如:
00000 00000
00100 00000
00100 -> 01111
00100 00000
00100 00000
這一點實現起來還是不太難的.
判斷碰撞
通常這種情況只須要在有移動小盒或旋轉盒子時發生:也即點陣非空
是互斥的,當小盒要向下移(x++)時,如果小盒裡的點陣與地圖上的點陣(非
空的地方)重疊,則不能下移,(卡住了),旋轉則轉換後的形狀與地圖有沖
突則要放棄旋轉.
到了這里,你應該有一個大概的了解了,至於怎樣在屏幕上畫出來,這
個是比較簡單的

㈡ 俄羅斯方塊游戲的 演算法實現(或者設計原理)

這是個優化問題,目標函數是最終得分,變數是每個方塊的得分,邊界條件就是樓主所說的「同等條件」。

解決該問題,需要知道「同等條件」,即總的方塊數以及每個方塊的形狀、出現順序。知道了這些條件,即可以編程實現演算法。

每個方塊含有各自的狀態,變換只需改變到下一個狀態就行了,完全可以用數組來實現(不用寫旋轉演算法了:)

比如:

/* 方塊類型為 ■■■■ */
char[2][4][4] B1={{{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}},
{{0,0,0,0},{1,1,1,1},{0,0,0,0},{0,0,0,0}}};
含兩種狀態,每個狀態是一個4*4數組,為1表示實心,為0表示空心.
□■□□
□■□□
□■□□
□■□□

□□□□
■■■■
□□□□
□□□□

再詳細的就不用說了吧

㈢ 做俄羅斯方塊的思路或演算法是什麼

我用MFC做過俄羅斯方塊:
整個場景是一個10*20的長方形空間,你要建立一個10*20的數組int num[20][10]模仿之,你可以想像這是200個小塊,每個小塊只有0和1兩種狀態,為0時相應該位置為空白,為1時相應該位置畫一個小方塊.

每一個圖形由4個小方塊組成,當他落到底停住時,你就要把數組num的相應數項由0改成1(num數組初始化全為0),同時在OnPaint(可能有時是OnDraw)函數中根據數組的0,1情況重繪,思路就是這樣的.很簡單

java俄羅斯方塊旋轉演算法,求解

可以給每一個小方塊設置為一個坐標,變為一個三階行列式,3*3矩陣,轉變為二元數組旋轉。觀察一下左旋:

11 12 13 31 21 11

21 22 23 →→ 32 22 12

31 32 33 33 23 13

坐標變換如下:(1,1)變為(1,3),(1,2)變為(2,3),(1,3)變為(3,3)

(2,1)變為(1,2),(2,2)變為(2,2),(2,3)變為(3,2)

(3,1)變為(1,1),(3,2)變為(2,1),(3,3)變為(3,1)

規律就是(i,j)變為(j,3-i+1):

如果是2*2的方格,就可以變為二階行列式,也就是2*2的二元數組,這里給出3*3九宮格改變的示意,我的代碼如下:


importjava.util.Random;

publicclassT{

publicstaticvoidmain(String[]args){

int[][]a=newint[3][3];
System.out.println("");
Randomr=newRandom();
for(inti=0;i<3;i++){
for(intj=0;j<3;j++){
a[i][j]=r.nextInt(10);
}
}
System.out.println("thearrayisshownasfollows:");
for(inti=0;i<3;i++){
for(intj=0;j<3;j++){
System.out.print(a[i][j]+"");
}
System.out.println();
}
System.out.println("左轉九十度");
for(inti=0;i<a.length;i++){
for(intj=0;j<a[i].length;j++){
System.out.print(a[a[i].length-1-j][i]+"");
}
System.out.println();
}
}
}

㈤ C語言寫俄羅斯方塊旋轉演算法

問題描述不完整,給你我作業里德旋轉函數好了,//...#define LONG_SIZE 15
#define WIDE_SIZE 10//...char img[LONG_SIZE][WIDE_SIZE]; /*定義游戲區方塊移動范圍*/
int x_[4],y_[4],x,y; /*存放移動方塊在游戲區的位置序號和方塊的坐標*///...void rotate() /*旋轉*/
{
int tmx[4],tmy[4];
int tf=1;
int i;
int k;
if((x_[0]==x_[1])&&(x_[2]==x_[3])&&(y_[0]==y_[2])&&(y_[1]==y_[3])) /*排除"田"字形*/
return;
for(i=0;i<4;i++)
img[x_[i]][y_[i]]=0;
for(i=0;i<4;i++)
{ tmx[i]=x+(y_[i]-y);
tmy[i]=y-(x_[i]-x);
if(tmx[i]<0||tmx[i]>LONG_SIZE-1)
{
tf=0;
break;
}
if(tmy[i]<0||tmy[i]>WIDE_SIZE-1)
{
tf=0;
break;
}
if((tmx[i]==x_[i])||(tmy[i]==y_[i]))
{
if(tmx[i]==x_[i])
{ if(img[tmx[i]][tmy[i]]==1||img[tmx[i]][y]==1)
{
tf=0;
break;
}
}
else if(tmy[i]==y_[i])
{
if(img[tmx[i]][tmy[i]]==1||img[x][tmy[i]]==1)
{
tf=0;
break;
}
}
else continue;
}
if((tmx[i]<x_[i]&&tmy[i]>y_[i])||(tmx[i]>x_[i]&&tmy[i]<y_[i]))
k=1;
else k=0;
while(tmx[i]!=x_[i]||tmy[i]!=y_[i])
{ if(img[tmx[i]][tmy[i]]==1)
{
tf=0;
break;
}
if(k%2==0)
tmx[i]<x_[i]?tmx[i]++:tmx[i]--;
else
tmy[i]<y_[i]?tmy[i]++:tmy[i]--;
k++;
}
}
if(tf)
{
for(i=0;i<4;i++)
{
tmx[i]=x+(y_[i]-y);
tmy[i]=y-(x_[i]-x);
x_[i]=tmx[i];
y_[i]=tmy[i];
}
}
for(i=0;i<4;i++)
img[x_[i]][y_[i]]=1;
} 幾個月前寫的,可能因為之前的水平原因代碼有點亂(現在懶的編),不過是可行的..

㈥ 俄羅斯方塊演算法 總共需要多少個矩陣

俄羅斯方塊的演算法很簡單啊,286的機器運行都不會有速度問題,速度慢不是因為矩陣的原因,你看看你的演算法是不是有問題啊?

㈦ 魔術方塊 共有幾種不同顏色 演算法

首先你要明白每一個塊(可以取下來的整體叫做塊,比如那個有2個顏色的塊叫做棱塊,有3個顏色的塊叫做角塊)只有可能掉一個顏色,而魔方的配色是固定了,列:上白下黃,左紅右橙,前藍後綠;所以你可以利用這個定位輕松安好掉下來的色塊;
魔方共有6個面,所以每一個塊上不可能有相同的顏色,應為顏色的分布所以每一個塊上也不可能有相對應的顏色分布,比如一個棱塊(有2個顏色的塊)的一面是白色,那麼另一面一定不會是白色,也不可能是黃色;或者一個角塊的一面是黃色,那麼另外2面絕不會出現黃色和白色,而只有可能是紅色藍色,或者藍色和橙色;只要秉著這個方法,把塊安裝上去很簡單的;

如果那段字你看不懂的話,我就簡單點說,首先把正中間的那個塊取下來按照上面白色下面黃色,左邊紅色,右邊橙色(都是想對的),前面藍色後面綠的坐標安好,再安裝別的楞角塊時先觀察沒掉的顏色,通過這個顏色判斷另一側是什麼顏色。判斷的原則就是顏色一樣的絕對不會在一起,顏色相對的也絕對不會在一起

㈧ 俄羅斯方塊的演算法

看看對你有幫助嗎:

http://www.4oa.com/Article/html/6/31/445/2005/15278.html

㈨ 哪位大神給我講解一下俄羅斯方塊的演算法C語言

首先你得有個俄羅斯方塊界面的概念,它就是M*N的一個2維數組,那麼一個方塊向左移動的極限就是有一個點已經到了最左邊。
拿一個豎條為例,他本身是一個4*4的小格子,當他是豎條時可以看成
0010
0010
0010
0010
向左移動時,只要判斷1是否在左邊邊界,沒有就往左一格,另外要注意邊橫桿時,要先判斷是否最左邊越界,有越界就不能變化

㈩ 求方塊魔方的公式

最簡單的四階還原時以3階為基礎的,具體來說,就是把雜亂的四階魔方,變成一個3階,然後排出幾種特殊情況,就可以按照3階來還原了,這種事比較簡單了,如果你會3階,理解一下4階的公式,基本就可以還原四階了。四階的公式很少,大概有5個左右。但是前提是你會3階。 建議先去玩三階啦,我覺得最有魅力的就是3階了,百玩不厭。 【三階魔方公式】 三階魔方一共有二十六塊,分為三個部分。六個中心塊,這是不動的。八隻角和十二條棱。 常用的方法一般有三種,分層法,角先法和棱先法。不過我認為還是棱先法比較簡單和實用的。 還原棱就是在每一個面上都拼出個十字,拼十字時不是按面來的,而是按層來的。 先還第一層的,也就是在第一面上拼出個十字。這個很簡單,不過拼出來的十字一定要正確也就是十字的那四條棱側而的顏色一定要跟前後左右中心塊的顏色一致。 對了。忘了跟你說方向的定位了。朝上的稱為上,右手邊的為右,左手邊的為左之類的,這在以後的公式里是能用的上的。 第一面好了之後。現在還原第二層,這也很簡單的。公式也就是前+下+前- 前+下-前- 一類的很簡單的,還原這後,前後左右四面會出現四個倒著的T。 現在該把魔方倒過來了,也就是把下層變為上層。這時如果夠幸運的話,底下的一層也已經好了。 如果沒有的話。現在就真的要用上公式了。 拼十字公式 公式1 右-上-前-上+前+右+ 公式2 右-前-上-前+上+右+ 用這兩個公式時。用1分拼出兩個相對的棱,這時需要有2了。把魔方的上層看作一個時鍾把它的兩條已經轉到上方的棱看作時針和分針,應該放在六點整的們置上。這樣才能用公式2當用2時會拼出相鄰的兩條棱,再用公式1時,就要把魔方放在九點整的位置上,這時拼出的十字位置不一定對。有可能對一個,出有可能對兩個。也可能一個也不對,因為上層可以自由轉動。這時就要換公式了。在用公式的時候要把十字放在只有一條棱對的時候。也就是其它三個都不對時轉十字公式 公式1 右-上-右+上-右-上2 公式2 左+上+左-上+左+上2 用公式1會把那三個錯們的棱按順時針挪動一個位置。公式2則為逆完成之後。六面的十字就已經拼好了,現在要把角復原過來 轉角公式 公式1上+右+上-左-上+右-上-左+ 公式2上-左-上+右+上-左+上+右- 用法,用公式1是為了要把左前 左後 右後這三個角按逆時針挪動一個位置,但主要還是要把左後角轉到左前公式2是為了把右前 右後 左後這三個角順時針挪一下位置。但主要是為了把右後轉到右前用1時會把右後角挪動。如果這時這個角已經復原過了。只要把右手邊的旋轉一下就行了。用2則會把左後角打亂處理方法和1的原理一樣。 當還原了五隻角時。這時剩下的三隻角就可以一次轉過來了,不過說起來容易做起來難。對於新手來說,還是再還原一隻角吧,這時會出現幾種情況,第一種,相鄰的兩只角 位置不對。把那兩只錯亂的角放在左前角和左後角這兩個位置,這時你會發現兩只角會出現有兩只顏色一樣的在同一面。應該把那顏色一樣的面朝上,你還會發現這各顏色和左面的顏色是一致的。也就是直接可以翻轉到左邊。 先用公式1 之後。再後+。再把魔方整體順時翻轉九十度,是整體啊。不是一面。再用公式2。 如果你完成了上述步驟的話。恭喜你。完工了。 第二種情況。剩下相對的兩只角,這時只要把兩只角轉到相鄰的位置,就會變成了第一種情況了。 當然了,還會出現一種情況。就是魔方的兩只對角,不是一個面的,是對整個魔方來說的。處理方法和上面的一樣。

熱點內容
app什麼情況下找不到伺服器 發布:2025-05-12 15:46:25 瀏覽:711
php跳過if 發布:2025-05-12 15:34:29 瀏覽:465
不定時演算法 發布:2025-05-12 15:30:16 瀏覽:129
c語言延時1ms程序 發布:2025-05-12 15:01:30 瀏覽:163
動物園靈長類動物配置什麼植物 發布:2025-05-12 14:49:59 瀏覽:732
wifi密碼設置什麼好 發布:2025-05-12 14:49:17 瀏覽:147
三位數乘兩位數速演算法 發布:2025-05-12 13:05:48 瀏覽:395
暴風影音緩存在哪裡 發布:2025-05-12 12:42:03 瀏覽:539
access資料庫exe 發布:2025-05-12 12:39:04 瀏覽:627
五開的配置是什麼 發布:2025-05-12 12:36:37 瀏覽:363