當前位置:編程學習大全網 - 源碼下載 - 源代碼塊

源代碼塊

用Java實現壹個小遊戲:俄羅斯方塊

使用二維數組保存遊戲地圖:

//?遊戲地圖網格,每個網格保存壹個盒子,數組記錄盒子的狀態。

私人?狀態?映射[][]?=?新的?狀態[行][列];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

最後,我們可以重畫並顯示積分。

重復上述生成圖形、圖形下落、左右移動、判斷消除線條的操作,壹個簡單的俄羅斯方塊就完成了。

  • 上一篇:C語言編程:任意輸入10個整數放入數組中,然後求其中的最大值和最小值
  • 下一篇:對於不喜歡玩遊戲的人,有哪些簡單上手的好玩遊戲值得推薦?
  • copyright 2024編程學習大全網