使用二維數組保存遊戲地圖:
//?遊戲地圖網格,每個網格保存壹個盒子,數組記錄盒子的狀態。
私人?狀態?映射[][]?=?新的?狀態[行][列];123
遊戲開始前將地圖中的所有格子初始化為空:
/*?將所有框初始化為空?*/
為了什麽?(int?我?=?0;?我?& lt?map .長度;?i++)?{
為了什麽?(int?j?=?0;?j?& lt?地圖[i]。長度;?j++)?{
map[i][j]?=?狀態。空的;
}
}1234567
在玩遊戲的過程中,我們可以看到界面上的方塊,所以我們要把地圖上的方塊都畫出來。當然,除了畫方塊,必要時還需要畫遊戲分數和遊戲結束時的字符串:
/**
*?繪制表單的內容,包括遊戲框、遊戲積分或結束字符串。
*/
@覆蓋
公共?作廢?油漆(圖形?g)?{
super.paint(克);
為了什麽?(int?我?=?0;?我?& lt?行;?i++)?{
為了什麽?(int?j?=?0;?j?& lt?列;?j++)?{
如果?(圖[i][j]?==?狀態。主動)?{?//?繪制活動塊
g . set color(active color);
g.fillRoundRect(j?*?塊大小?我?*?BLOCK_SIZE?+?25,
BLOCK_SIZE?-?1,?BLOCK_SIZE?-?1,?BLOCK_SIZE?/?5,
BLOCK_SIZE?/?5);
}?不然呢?如果?(圖[i][j]?==?狀態。STOPED)?{?//?畫壹個靜止的方塊
g . set color(stoped color);
g.fillRoundRect(j?*?塊大小?我?*?BLOCK_SIZE?+?25,
BLOCK_SIZE?-?1,?BLOCK_SIZE?-?1,?BLOCK_SIZE?/?5,
BLOCK_SIZE?/?5);
}
}
}
/*?打印分數?*/
g . set color(score color);
g.setFont(新?Font("Times?新的?羅曼“,?字體。大膽,?30));
g.drawString("分數?:?"?+?總分,?5,?70);
//?遊戲結束,打印結束字符串。
如果?(!正在進行)?{
g.setColor(顏色。紅色);
g.setFont(新?Font("Times?新的?羅曼“,?字體。大膽,?40));
g.drawString("遊戲?結束了?!",?this.getWidth()?/?2?-?140,
this.getHeight()?/?2);
}
}123456789101112131415161718192021222324252627282930313233343536
由塊組成的幾種圖形是由隨機數生成的,壹般是七種圖形:條形、場形、正7形、反7形、T形、Z形、反Z形。
地圖[0][randPos]?=?地圖[0][randPos?-?1]?=?地圖[0][randPos?+?1]?
=?地圖[0][randPos?+?2]?=?狀態。活躍;123
圖形生成後,實現下落的操作。如果遇到阻礙,就不能繼續往下掉:
isFall?=?真實;?//?是否能降。
//?從當前線開始檢查,遇到障礙物停止下落。
為了什麽?(int?我?=?0;?我?& lt?blockRows?i++)?{
為了什麽?(int?j?=?0;?j?& lt?列;?j++)?{
//?如果該行中的塊是活動塊,下壹行中的塊是靜態塊,就會遇到障礙。
如果?(圖【rowIndex?-?我][j]?==?狀態。活躍的
& amp& amp?map[rowIndex?-?我?+?1][j]?==?狀態。STOPED)?{
isFall?=?假的;?//?停止下降
打破;
}
}
如果?(!isFall)
打破;
}123456789101112131415
如果沒有障礙物,下落時,正方形圖形會整體下移壹行:
//?這個數字下降了壹行。
為了什麽?(int?我?=?0;?我?& lt?blockRows?i++)?{
為了什麽?(int?j?=?0;?j?& lt?列;?j++)?{
如果?(圖【rowIndex?-?我][j]?==?狀態。主動)?{?//?活動塊向下移動壹行。
map[rowIndex?-?我][j]?=?狀態。空的;?//?原始活動塊變為空。
map[rowIndex?-?我?+?1][j]?=?狀態。活躍;?//?下壹個塊成為活動塊。
}
}
}12345678910
向左和向右移動是類似的操作:
/**
*?向左轉
*/
私人?作廢?左()?{
//?標出左側是否有障礙物。
布爾?hasBlock?=?假的;
/*?判斷左側是否有障礙物。*/
為了什麽?(int?我?=?0;?我?& lt?blockRows?i++)?{
如果?(圖【rowIndex?-?我][0]?==?狀態。主動)?{?//?確定左邊是不是墻。
hasBlock?=?真實;
打破;?//?如果有障礙,不需要回收判斷線。
}?不然呢?{
為了什麽?(int?j?=?1;?j?& lt?列;?j++)?{?//?判斷左邊是否還有其他區塊。
如果?(圖【rowIndex?-?我][j]?==?狀態。活躍的
& amp& amp?map[rowIndex?-?我][j?-?1]?==?狀態。STOPED)?{
hasBlock?=?真實;
打破;?//?如果有障礙,不需要回收判斷欄。
}
}
如果?(hasBlock)
打破;?//?如果有障礙,不需要回收判斷線。
}
}
/*?如果左邊沒有障礙物,將圖形向左移動壹個街區?*/
如果?(!hasBlock)?{
為了什麽?(int?我?=?0;?我?& lt?blockRows?i++)?{
為了什麽?(int?j?=?1;?j?& lt?列;?j++)?{
如果?(圖【rowIndex?-?我][j]?==?狀態。主動)?{
map[rowIndex?-?我][j]?=?狀態。空的;
map[rowIndex?-?我][j?-?1]?=?狀態。活躍;
}
}
}
//?重畫
repaint();
}
}1234567891011121314151617181920212223242526272829303132333435363738394041
加速向下運動時,是為了減少每次正常下落的時間間隔:
/**
*?直走
*/
私人?作廢?down()?{
//?印記會加速墜落。
立竿見影?=?真實;
}12345678
如何改變圖形的方向,這裏只用壹個非常簡單的方法來實現方向的改變。當然,可以有更好的算法來實現變向操作,妳可以自己研究壹下:
/**
*?旋轉正方形圖形
*/
私人?作廢?rotate()?{
試試?{
如果?(形狀?==?4)?{?//?正方形,旋轉前後形狀相同。
返回;
}?不然呢?如果?(形狀?==?0)?{?//?剝奪
//?用於放置旋轉圖形的臨時數組。
狀態[][]?tmp?=?新的?狀態[4][4];
int?startColumn?=?0;
//?在形狀的開頭找到第壹個框的位置。
為了什麽?(int?我?=?0;?我?& lt?列;?i++)?{
如果?(map[rowIndex][i]?==?狀態。主動)?{
startColumn?=?我;
打破;
}
}
//?旋轉後尋找障礙物,有障礙物就不要旋轉。
為了什麽?(int?我?=?0;?我?& lt?4;?i++)?{
為了什麽?(int?j?=?0;?j?& lt?4;?j++)?{
如果?(圖【rowIndex?-?3?+?我][j?+?startColumn)?==?狀態。STOPED)?{
返回;
}
}
}
如果?(map[rowIndex][startColumn?+?1]?==?狀態。主動)?{?//?水平條,轉換成垂直條
為了什麽?(int?我?=?0;?我?& lt?4;?i++)?{
tmp[i][0]?=?狀態。活躍;
為了什麽?(int?j?=?1;?j?& lt?4;?j++)?{
tmp[i][j]?=?狀態。空的;
}
}
blockRows?=?4;
}?不然呢?{?//?豎線,轉換成橫線
為了什麽?(int?j?=?0;?j?& lt?4;?j++)?{
tmp[3][j]?=?狀態。活躍;
為了什麽?(int?我?=?0;?我?& lt?3;?i++)?{
tmp[i][j]?=?狀態。空的;
}
}
blockRows?=?1;
}
//?將原始地圖中的圖形修改為變換後的圖形。
為了什麽?(int?我?=?0;?我?& lt?4;?i++)?{
為了什麽?(int?j?=?0;?j?& lt?4;?j++)?{
map[rowIndex?-?3?+?我][startColumn?+?j]?=?tmp[I][j];
}
}
}?不然呢?{
//?用於放置旋轉圖形的臨時數組。
狀態[][]?tmp?=?新的?狀態[3][3];
int?startColumn?=?列;
//?在形狀的開頭找到第壹個框的位置。
為了什麽?(int?j?=?0;?j?& lt?3;?j++)?{
為了什麽?(int?我?=?0;?我?& lt?列;?i++)?{
如果?(圖【rowIndex?-?j][i]?==?狀態。主動)?{
startColumn?=?我?& lt?startColumn?我?:?startColumn
}
}
}
//?判斷改造後是否會有障礙。
為了什麽?(int?我?=?0;?我?& lt?3;?i++)?{
為了什麽?(int?j?=?0;?j?& lt?3;?j++)?{
如果?(圖【rowIndex?-?2?+?j][startColumn?+?2?-?我]?==?狀態。停止)
返回;
}
}
//?變化
為了什麽?(int?我?=?0;?我?& lt?3;?i++)?{
為了什麽?(int?j?=?0;?j?& lt?3;?j++)?{
tmp[2?-?j][i]?=?map[rowIndex?-?2?+?我][startColumn?+?j];
}
}
//?將原始地圖中的圖形修改為變換後的圖形。
為了什麽?(int?我?=?0;?我?& lt?3;?i++)?{
為了什麽?(int?j?=?0;?j?& lt?3;?j++)?{
map[rowIndex?-?2?+?我][startColumn?+?j]?=?tmp[I][j];
}
}
//?重畫
repaint();
//?修改行指針。
為了什麽?(int?我?=?0;?我?& lt?3;?i++)?{
為了什麽?(int?j?=?0;?j?& lt?3;?j++)?{
如果?(圖【rowIndex?-?我][startColumn?+?j]?!=?空
||?map[rowIndex?-?我][startColumn?+?j]?!=?狀態。空)?{
rowIndex?=?rowIndex?-?我;
blockRows?=?3;
返回;
}
}
}
}
}?接住?(例外?e)?{
//?當數組下標越界時,意味著圖形的形狀不經過任何處理就無法改變。
}
}123456789101112131415161718192021222324252627282930313233343536373 839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
當圖形的下降在受阻時停止,我們需要判斷是否有某壹條線或幾條線可以消除。這時,我們可以先得到每行的方塊數,然後判斷:
int[]?blocksCount?=?新的?int[rows];?//?記錄每行有方框的行數。
int?消除行?=?0;?//?消除的行數
/*?計算每行的方塊數?*/
為了什麽?(int?我?=?0;?我?& lt?行;?i++)?{
blocksCount[i]?=?0;
為了什麽?(int?j?=?0;?j?& lt?列;?j++)?{
如果?(圖[i][j]?==?狀態。停止)
blocks count[I]++;
}
}1234567891011
如果有壹整行盒子,則該行中的盒子被消除:
/*?實現滿行的消盒操作?*/
為了什麽?(int?我?=?0;?我?& lt?行;?i++)?{
如果?(blocksCount[i]?==?專欄)?{
//?清理線路
為了什麽?(int?m?=?我;?m?& gt=?0;?m -)?{
為了什麽?(int?n?=?0;?n?& lt?列;?n++)?{
map[m][n]?=?(m?==?0)?狀態。空的?:?地圖[m?-?1][n];
}
}
eliminate rows++;?//?記錄消除的行數
}
}12345678910111213
最後,我們可以重畫並顯示積分。
重復上述生成圖形、圖形下落、左右移動、判斷消除線條的操作,壹個簡單的俄羅斯方塊就完成了。