基於單機黑白棋擴充為網路對戰版,採用 MFC 對話框架構構 + Winsock (wsock32.lib, mpr.lib) 實現雙進程同步對戰。核心挑戰:異機進程狀態同步、網路連線與封包設計、非阻塞 UI。

| 層級 | 類別/模組 | 職責 |
|---|---|---|
| 應用層 | CBWChessApp, CBWChessDlg | 程式進入點、主視窗、UI 事件分發 |
| 遊戲邏輯層 | BtoW(), DrawBitmap(), Ring() | 翻子規則、棋盤繪製、勝負判定、連續行棋處理 |
| 網路通訊層 | CConnection, CNetworking | Socket 封裝、連線建立、資料收發、回調分發 |
| 執行緒層 | 登錄執行緒、監聽執行緒、網路收發執行緒 | 並行處理連線建立、資料接收,避免阻塞主 UI |
BtoW(x, y, flag)從落子座標 (x,y) 向 8 方向掃描,若遇對方棋子後再遇己方棋子,將中間對方棋子全部翻轉。flag 區分黑/白方。
DrawBitmap()使用位圖繪製棋盤格線、棋子、合法落子提示,雙重緩衝防閃爍。
Ring()翻子後統計雙方子數、判斷遊戲結束、檢測對方是否無合法手需連續行棋 (Pass)。
CNetworking 監聽埠口,接受連線建立 CConnection。CConnection 主動連接伺服器 IP/埠。struct Packet {
BYTE cmd; // 控制碼
BYTE x; // X 座標 (0-7)
BYTE y; // Y 座標 (0-7)
BYTE reserved[7]; // 校驗/擴充保留
};
| 常數 | 值 | 含義 |
|---|---|---|
CMD_CLICK | 1 | 落子座標傳送 |
CMD_SKIP | 2 | 請求/通知跳過回合 (Pass) |
CMD_OVER | 3 | 遊戲結束通知 |
CMD_RESIGN | 4 | 認輸/投降 |
CMD_CLICK 直接在本地棋盤執行翻子、切換回合。// 主執行緒:UI 訊息泵、使用者落子、繪圖
// 登錄執行緒:向伺服器註冊/查詢房間列表 (若有大廳)
// 監聽執行緒:accept() 循環,建立 CConnection
// 網路執行緒 (每連線一條):recv() 循環,解析封包 → PostMessage 到主視窗處理
關鍵點:網路執行緒不直接操作 UI,而是 PostMessage(hWnd, WM_GAME_DATA, ...) 將封包轉發給主執行緒,由主執行緒在 OnGameData 中更新棋盤、重繪,確保 MFC 物件執行緒安全。
CConnection / CNetworking 設計亮點CAsyncSocket 依賴視窗訊息)。ioctlsocket(FIONBIO) + select() 多工,單執行緒可管理多連線 (伺服器端)。| 限制 | 改進建議 |
|---|---|
| 無斷線重連/狀態恢復 | 加入棋盤狀態序列化、重連時同步完整棋譜 | 封包無序號/ACK,易亂序 | 引入可靠 UDP (ENet/KCP) 或 TCP 封包幀解析 | AI 極弱 | 接入開源 Othello 引擎 (Edax, WZebra) 或自實現 Negamax + 位棋盤優化 | 僅支援 IPv4、固定埠 | 支援 IPv6、UPnP 穿透、NAT 打洞 | 無加密/認證 | 引入 TLS (OpenSSL) 或簡易 Token 認證 |
本專案展示 MFC + Winsock 實現回合制網路遊戲的完整骨架:遊戲邏輯與網路層解耦、多執行緒非阻塞收發、訊息轉發主執行緒更新 UI。原始碼註解詳盡,適合作為網路棋類遊戲教學範本或快速原型基礎。
本文配套原始碼可供下載。