本文分享一個教學用途的中國象棋遊戲原型,展示如何用 WinForms 實作 9×10 虛擬棋盤座標系、棋子統一介面 IChessItem、滑鼠事件處理選取/移動/吃子、以及各棋子特殊移動規則(馬腳、象眼、炮架、兵過河)的程式結構。
GridX (0-8)、GridY (0-9) 對應 9×10 交叉點,所有邏輯運算在虛擬座標,繪圖時換算為像素座標。
public interface IChessItem
{
ChessType Type { get; set; } // 紅/藍方
bool IsChecked { get; set; } // 是否被選取
int StepX { get; } int StepY { get; } // 基礎步長(供簡單棋子用)
int GridX { get; set; } int GridY { get; set; }
bool MoveItem(int targetX, int targetY); // 嘗試移動,含規則驗證
void InitItem(); // 初始化位置
void Remove(); // 被吃移除
}
MoveItem 呼叫虛擬 LimitPoint 驗證合法性。Che(車)、Ma(馬)、Xiang(象)、Shi(士)、Jiang(將/帥)、Pao(炮)、Bing(兵/卒),覆寫 LimitPoint 實作特殊規則。cib_Click(棋子點擊):處理選取切換、吃子判斷(目標位置有敵方棋子 → 移除敵方、移動己方)。Form1_MouseDown(空白處點擊):若有棋子被選取,計算虛擬座標並呼叫 MoveItem 嘗試移動。| 棋子 | 規則 | 實作關鍵 |
|---|---|---|
| 馬 | 日字腿,受「蹩馬腿」阻擋 | 檢查「腿」座標 (x±1,y) 或 (x,y±1) 是否有棋子 |
| 象 | 田字腳,不得過河,受「塞象眼」阻擋 | 檢查中心點 (x±1,y±1) 是否有棋子;Y 限制自方半邊 |
| 炮 | 直線移動,吃子需隔一個「炮架」 | 移動路徑上棋子數 = 0;吃子路徑上棋子數 = 1 |
| 兵 | 過河前只能直進,過河後可左右平移 | 依 Y 判斷是否過河,限制移動向量 |