基於c++的中國象棋遊戲設計與實現

1.文檔

文檔分為兩部分,一部分在代碼中,然後通過doxygen生成HTML。解壓本目錄下的html.zip後打開index.html即可查看;第二部分在此說明文檔內,在這裡會介紹一些架構方面的信息。

2.遊戲操作邏輯

相關的命名空間有:

Chess:這是包含中國象棋的操作邏輯的命名空間

主要操作是possibleMove(int x, int y),通過整個棋盤每個位置上的信息、中國象棋的規則來獲得位置(x, y)這個棋子可以移動到的位置。

其餘操作有“判斷是否將、帥對視`、”判斷當前局面是否為必勝、必敗態”、“是否將軍”等,這些操作均使用最簡單的枚舉算法。

3.UI框架

相關的類有:

  • MainWindow:主窗體
  • ChessWidget:主窗體裡的主要部件,用於顯示棋盤、操作棋盤,並且會發出相應音效
  • PanelWidget:一個dock部件,置於主部件上方,用於顯示“輪到誰進行下棋”、“當前回合所剩時間”、“認輸按鈕”
  • ClientDialog:連接到對戰的對話框,可以設置IP(IPv4)和端口
  • ServerDialog:建立服務器,可以設置監聽的端口、當前用戶執紅or執黑、每回合時間
  • LoadingDialog:一個能播放動畫的等待連接的對話框

棋盤的繪制是用paintEventQPainter進行繪制的。

4.網絡通信

使用QTcpSocket進行傳輸數據(監聽端是使用QTcpServer進行監聽,並且隻返回一個可用的socket)

發送端是阻塞(同步)發送的,接收端是非阻塞(異步)接收的。

我用的是QDataStream來操作QTcpSocket,這樣省去很多麻煩,比如發送、接受數據隻需要簡單的這樣寫:

發送端:

QByteArray data;
QDataStream st(&data, QIODevice::WriteOnly);
QString str = "hahaha";
int op = 2333;
st << op << str;
socket->write(data);
socket->waitForBytesWritten();

接收端:

auto data = socket->readAll();
QDataStream st(&data, QIODevice::ReadOnly);
QString str;
int op;
st >> op >> str; // op == 2333, str == "hahaha"

通信協議如下:

第1個數字表示操作類型:

  • 0: server傳輸初始數據到client;首先傳輸client是紅方(0)還是黑方(1),接著傳輸每一回合的時間,最後將殘局文件傳輸過去
  • 1: 移動棋子;接下來4個整數x1, y1, x2, y2,表示坐標(x1, y1)移動到(x2, y2)
  • 2: 認輸;接下來不傳輸任何其他東西
  • 3: 我贏瞭!接下來不傳輸任何其他東西

 

推薦閱讀: