首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

黑白棋 (Othello) 網路對戰開發文檔:Winsock 同步架構與模組設計

     編輯:關於VC++

專案概覽

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

黑白棋網路對戰介面

架構分層

層級類別/模組職責
應用層CBWChessApp, CBWChessDlg程式進入點、主視窗、UI 事件分發
遊戲邏輯層BtoW(), DrawBitmap(), Ring()翻子規則、棋盤繪製、勝負判定、連續行棋處理
網路通訊層CConnection, CNetworkingSocket 封裝、連線建立、資料收發、回調分發
執行緒層登錄執行緒、監聽執行緒、網路收發執行緒並行處理連線建立、資料接收,避免阻塞主 UI

核心遊戲邏輯

翻子演算法 BtoW(x, y, flag)

從落子座標 (x,y) 向 8 方向掃描,若遇對方棋子後再遇己方棋子,將中間對方棋子全部翻轉。flag 區分黑/白方。

棋盤繪製 DrawBitmap()

使用位圖繪製棋盤格線、棋子、合法落子提示,雙重緩衝防閃爍。

回合結算 Ring()

翻子後統計雙方子數、判斷遊戲結束、檢測對方是否無合法手需連續行棋 (Pass)。

網路通訊協定設計

連線模式

  • 伺服器端:CNetworking 監聽埠口,接受連線建立 CConnection。
  • 客戶端:CConnection 主動連接伺服器 IP/埠。
  • 雙向通訊:建立連線後對稱收發,無主從之分。

資料封包格式 (固定 10 位元組)

struct Packet {
    BYTE cmd;      // 控制碼
    BYTE x;        // X 座標 (0-7)
    BYTE y;        // Y 座標 (0-7)
    BYTE reserved[7]; // 校驗/擴充保留
};

控制碼定義

常數值含義
CMD_CLICK1落子座標傳送
CMD_SKIP2請求/通知跳過回合 (Pass)
CMD_OVER3遊戲結束通知
CMD_RESIGN4認輸/投降

同步機制

  1. 雙方各自維護棋盤狀態,落子動作由本地驗證合法性後再發送。
  2. 收到 CMD_CLICK 直接在本地棋盤執行翻子、切換回合。
  3. 網路延遲/丟包未處理 (教學版簡化),實務需加入序號、ACK、重傳、狀態同步校驗。

多執行緒架構

// 主執行緒:UI 訊息泵、使用者落子、繪圖
// 登錄執行緒:向伺服器註冊/查詢房間列表 (若有大廳)
// 監聽執行緒:accept() 循環,建立 CConnection
// 網路執行緒 (每連線一條):recv() 循環,解析封包 → PostMessage 到主視窗處理

關鍵點:網路執行緒不直接操作 UI,而是 PostMessage(hWnd, WM_GAME_DATA, ...) 將封包轉發給主執行緒,由主執行緒在 OnGameData 中更新棋盤、重繪,確保 MFC 物件執行緒安全。

類別 CConnection / CNetworking 設計亮點

  • 完全物件化:Socket、事件、緩衝區封裝於類別,無需視窗即可運作 (非 CAsyncSocket 依賴視窗訊息)。
  • 回調函式:資料到達、連線斷開、錯誤事件透過函式指標/虛函式回調,上層邏輯解耦。
  • 非阻塞模式:ioctlsocket(FIONBIO) + select() 多工,單執行緒可管理多連線 (伺服器端)。

人機對戰 / 雙人同機模式

  • 人機:隨機演算法 + 簡單權重 (角落優先、邊緣次之),棋力弱,預留介面可換入 Minimax/Alpha-Beta/MCTS。
  • 雙人同機:單進程雙角色切換,邏輯最簡單。

已知限制與改進方向

限制改進建議
無斷線重連/狀態恢復加入棋盤狀態序列化、重連時同步完整棋譜
封包無序號/ACK,易亂序引入可靠 UDP (ENet/KCP) 或 TCP 封包幀解析
AI 極弱接入開源 Othello 引擎 (Edax, WZebra) 或自實現 Negamax + 位棋盤優化
僅支援 IPv4、固定埠支援 IPv6、UPnP 穿透、NAT 打洞
無加密/認證引入 TLS (OpenSSL) 或簡易 Token 認證

結語

本專案展示 MFC + Winsock 實現回合制網路遊戲的完整骨架:遊戲邏輯與網路層解耦、多執行緒非阻塞收發、訊息轉發主執行緒更新 UI。原始碼註解詳盡,適合作為網路棋類遊戲教學範本或快速原型基礎。

本文配套原始碼可供下載。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved