俄羅斯演算法
❶ 求大神 java俄羅斯方塊翻轉演算法詳解(需要注釋),本人剛學Java
這個問題我也遇到過。
我曾經寫過一個俄羅斯方塊程序。
也是去找中心點。然後旋轉的方式去實現。
現在想想這種思路不好。
應該是用矩陣變換的思路。
1
1
0
1
0
1
順時針應該變成
0
0
1
1
1
1
追問
怎麼實現!
回答
剛才寫錯了。
一個二維矩陣X[x1][y1]
順時針旋轉90°
變成的二維矩陣定義肯定是
Y[y1][x1]
對於Y中的每一個元素
Y[n][m]
=
X[m][x1-n]
要應用到你的代碼里的話。
我需要知道你代碼里。現有的一些數據。
現在光看代碼本身,我不知道你定義的這些變數裡面到底存著什麼。你又需要什麼。
❷ 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();
}
}
}
❸ 俄羅斯創企推新型自動駕駛演算法 一個攝像頭可讓無人車實現3D感知
▲立體視覺工作原理示意
RGB-D可以看做是增加了可探測目標物體的距離功能的2D攝像頭,工作原理是,利用光到內部感測器的投射時間計算與目標物體的距離。此項技術路線成本相對較低,但易被干擾和遮擋。
Lidar即激光雷達,並且大多數的3DLidar感測器是多線的(最多64線),它利用發射的激光脈沖測算與目標的距離。此項技術路線探測距離遠、精度高,但過於笨重,而且成本較為昂貴,每台64線的Lidar需要約6萬美元(約合人民幣42.5萬元)的成本。
Ralient公司表示,基於神經網路的MIMIR自動駕駛系統成功開發,意味著可以使用普通智能手機的攝像頭取代激光雷達等昂貴的探測設備。
結語:神經網路將助力自動駕駛發展
目前,自動駕駛非常依賴於對場景的3D感知,而三種主流的感知技術路線又存在這樣或那樣的問題。
Ralient利用神經網路開發的MIMIR自動駕駛系統解決了探測精度等方面的問題,還大幅降低了成本,擁有較為廣闊的發展前景。
據悉,Ralient公司已經開始對MIMIR自動駕駛系統進行了上路測試,一旦驗證該系統成熟,神經網路將向更高級別發展。
本文來源於汽車之家車家號作者,不代表汽車之家的觀點立場。
❹ 尋找關於俄羅斯方塊程序的演算法,不要程序,只要演算法
核心演算法:
這里把游戲的關鍵設計放在三個盒子和一個坐標上:
大盒子:一個兩維數組,記錄著方塊點陣的開與關(把游戲的舞台想像
成一個點陣),在下面也把這個東西稱為地圖
兩個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++)時,如果小盒裡的點陣與地圖上的點陣(非
空的地方)重疊,則不能下移,(卡住了),旋轉則轉換後的形狀與地圖有沖
突則要放棄旋轉.
到了這里,你應該有一個大概的了解了,至於怎樣在屏幕上畫出來,這
個是比較簡單的
❺ 俄羅斯方塊演算法 總共需要多少個矩陣
俄羅斯方塊的演算法很簡單啊,286的機器運行都不會有速度問題,速度慢不是因為矩陣的原因,你看看你的演算法是不是有問題啊?
❻ 做俄羅斯方塊的思路或演算法是什麼
我用MFC做過俄羅斯方塊:
整個場景是一個10*20的長方形空間,你要建立一個10*20的數組int num[20][10]模仿之,你可以想像這是200個小塊,每個小塊只有0和1兩種狀態,為0時相應該位置為空白,為1時相應該位置畫一個小方塊.
每一個圖形由4個小方塊組成,當他落到底停住時,你就要把數組num的相應數項由0改成1(num數組初始化全為0),同時在OnPaint(可能有時是OnDraw)函數中根據數組的0,1情況重繪,思路就是這樣的.很簡單
❼ 俄羅斯方塊游戲的 演算法實現(或者設計原理)
這是個優化問題,目標函數是最終得分,變數是每個方塊的得分,邊界條件就是樓主所說的「同等條件」。
解決該問題,需要知道「同等條件」,即總的方塊數以及每個方塊的形狀、出現順序。知道了這些條件,即可以編程實現演算法。
每個方塊含有各自的狀態,變換只需改變到下一個狀態就行了,完全可以用數組來實現(不用寫旋轉演算法了:)
比如:
/* 方塊類型為 ■■■■ */
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表示空心.
□■□□
□■□□
□■□□
□■□□
□□□□
■■■■
□□□□
□□□□
再詳細的就不用說了吧
❽ 哪位大神給我講解一下俄羅斯方塊的演算法C語言
首先你得有個俄羅斯方塊界面的概念,它就是M*N的一個2維數組,那麼一個方塊向左移動的極限就是有一個點已經到了最左邊。
拿一個豎條為例,他本身是一個4*4的小格子,當他是豎條時可以看成
0010
0010
0010
0010
向左移動時,只要判斷1是否在左邊邊界,沒有就往左一格,另外要注意邊橫桿時,要先判斷是否最左邊越界,有越界就不能變化
❾ 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;
} 幾個月前寫的,可能因為之前的水平原因代碼有點亂(現在懶的編),不過是可行的..
❿ 俄羅斯方塊演算法
用二維數組表示方塊所在的整個區域,0表示有方塊,1表示有方塊。從上往下,從左往右開始輸出區域。
判斷消行,也就是當方塊下落後,從它所停留那一行(記錄此行)開始,計算每一行是否全為1,如果全為1,則往下繼續判斷下一行,再記錄消行的行數。
判斷完畢後,開始將這幾行數據全變為0即可。然後就是下降。
比如從第8行開始,消2行,也就是8,9行消掉。此時應該讓前面7行往下落2行。也就是第9行數據等於第7行,第8行數據等於第6行,以此類推。寫一個循環
就可以了。