俄羅斯方塊雖演算法簡單,但介面體驗卻是開發重心:方塊圖形渲染、使用者操控、消行計分邏輯皆需精心打磨。本文以 Windows Forms 搭配 GDI+ 繪圖,完整呈現從資料結構設計到遊戲迴圈實作的全過程。
採用馬賽克概念,將 7 種經典方塊(I、J、L、O、S、T、Z)統一以 3×3 整數矩陣 表示:0 為背景,1~8 對應不同顏色。例如 T 型方塊:
new int[3,3] {
{0,0,0},
{0,1,0},
{1,1,1}
}
非零值即代表方塊佔用的格子位置,數值同時編碼顏色,實現「一矩陣多用」。
KeyPress 事件處理左右移動、旋轉;Timer 觸發自動下落。check() 方法驗證目標位置是否越界或與已落定方塊重疊。0 則滿行,移除該行並以上所有行下移一格,累計分數。OnPaint,所有視覺變更(移動、旋轉、消行)均呼叫 Refresh() 觸發重繪。順時針旋轉本質為矩陣轉置後左右翻轉:newMatrix[j, n-1-i] = oldMatrix[i, j]。旋轉前必須呼叫 check() 驗證合法性。
Timer.Interval = 基礎間隔 - 等級 × 遞減值,等級越高下落越快,極限約 50ms/幀。
conversize() 將矩陣總元素數(9/16)映射為邊長格數(3/4),供繪圖計算實際像素座標。
public partial class TetrisForm : Form {
int[,] board = new int[10, 20]; // 遊戲區 10×20
int[,] currentFigure; // 當前方塊矩陣
int px, py; // 方塊左上角座標
Timer fallTimer;
// 初始化 8 種方塊矩陣...
// KeyDown 處理移動/旋轉...
// fallTimer_Tick 自動下落...
// check() 碰撞檢測...
// clearLines() 消行計分...
// OnPaint 統一繪製 board + currentFigure...
}
將遊戲邏輯封裝為獨立元件(UserControl),即可輕鬆嵌入任意專案。完整原始碼可作為 GDI+ 遊戲開發的入門範本。