基於網友版本重構優化,完整實現數字塊合並、上下左右移動、隨機生成、勝負判定、重新開始。採用 GridLayout 4x4 佈局,JLabel 繼承實現數字塊顏色映射,鍵盤事件驅動遊戲邏輯。
| 類 | 職責 | 關鍵點 |
| Block extends JLabel | 單個數字塊視圖 | value 屬性驅動文本/背景色(0=灰,2=米黃,2048=金黃,4096=紅) |
| My2048 extends JFrame | 主窗口 | Substance LookAndFeel 美化,GridLayout(4,4,5,5) 間距 |
| Operation implements KeyListener | 遊戲邏輯核心 | 16 元素數組建模棋盤,四向移動合並算法,隨機生成 2/4,勝負檢測 |
移動合並算法解析(以向上為例)
public void upBlock() {
for (int col = 0; col < 4; col++) {
int target = col; // 目標位置
for (int row = col + 4; row < 16; row += 4) {
// 1. 下沉非零塊到目標位置
if (block[target].getValue() == 0) {
int src = findNextNonZero(target, 4, 16);
if (src != -1) { move(src, target); } else break;
}
int valTarget = block[target].getValue();
// 2. 尋找下一非零塊
if (block[row].getValue() == 0) {
int src = findNextNonZero(row, 4, 16);
if (src != -1) { move(src, row); } else break;
}
int valRow = block[row].getValue();
// 3. 相等且非零 → 合並
if (valTarget == valRow && valTarget != 0) {
block[target].setValue(valTarget + valRow);
block[row].setValue(0);
numFlag = true; // 標記可生成新塊
}
target = row; // 推進目標位置
}
}
}
關鍵輔助方法
findNextNonZero(start, step, limit):按步長尋找下一個非零塊索引
judgeAppear():掃描 16 格,全滿則 numFlag=false
appearBlock():隨機空位生成 2(50%)/4(50%)
over():無法移動且無法生成 → 顯示 GAMEOVER,點擊重啟
win():出現 2048 → 顯示 YOU WIN,點擊重啟
運行與擴展
javac *.java
java My2048
- 增加分數統計、最高分持久化、撤銷功能、動畫過渡
- 遷移至 JavaFX/LibGDX 獲得更流暢動畫與跨平台能力
- 上一篇文章: Java synchronized 關鍵字實現線程同步:原理與實戰模式
- 下一篇文章: AndEngine 實現菜單滑動效果:SurfaceScrollDetector + 雙向箭頭導航
Copyright ©
程式碼之家 All Rights Reserved