J2ME 繼承 J2SE java.lang.Thread 與 Runnable,但無線程組、守護線程。本文以完整俄羅斯方塊源碼示範:Canvas 實現 Runnable,內部線程驅動遊戲主循環,鍵盤事件控制方塊移動/旋轉,repaint() 觸發繪製。
startApp() 顯示 TetrisCanvas。Thread(this).start()。run() 循環:方塊下落、碰撞檢測、消行計分、速度遞增、新方塊生成、Game Over 重置。paint(Graphics):繪製背景、下一個方塊預覽、分數/速度/行數、遊戲區格子、當前下落方塊。keyPressed(int keyCode):映射 Canvas.UP/DOWN/LEFT/RIGHT/FIRE 控制移動、加速下落、旋轉。static final int,便於移植調整。// 方塊定義:{x1,y1,x2,y2,x3,y3,x4,y4,color,rotationCount}
int BlockInfo[][] = {{1,0,1,1,1,2,1,3,0xff0000,2}, ...};
// 碰撞檢測
private boolean feasible() {
for (int i=0;i<=3;i++)
if (Gridmatrix[BlockY+BlockInfo[BlockType][i*2]][BlockX+BlockInfo[BlockType][i*2+1]]!=0)
return false;
return true;
}
// 消行邏輯
private void delline() { /* 將當前方塊固化至 Gridmatrix,從底向上掃描滿行,下移上方所有行,更新分數/速度 */ }
public void run() {
while (Blocker != null) {
if (!ISDOWN) {
BlockY++;
if (!feasible()) { ISDOWN=true; BlockY--; delline(); sleep(400); }
else { repaint(); sleep(950 - 100*BlockSpeed); }
} else {
// 固化、計分、生成新方塊、檢測 Game Over
ISDOWN=false; repaint(); BlockSpeed=CurSpeed;
BlockType=FutureBlockType; FutureBlockType=random(19);
BlockX=4; BlockY=0; if (!feasible()) init(); // Game Over 重置
}
}
Blocker = null;
}