基于c++的中國象棋游戲設計與實現(xiàn)
1.文檔
文檔分為兩部分,一部分在代碼中,然后通過doxygen生成HTML。解壓本目錄下的html.zip后打開index.html即可查看;第二部分在此說明文檔內(nèi),在這里會介紹一些架構(gòu)方面的信息。

2.游戲操作邏輯
相關的命名空間有:
Chess:這是包含中國象棋的操作邏輯的命名空間
主要操作是possibleMove(int x, int y),通過整個棋盤每個位置上的信息、中國象棋的規(guī)則來獲得位置(x, y)這個棋子可以移動到的位置。
其余操作有“判斷是否將、帥對視`、”判斷當前局面是否為必勝、必敗態(tài)”、“是否將軍”等,這些操作均使用最簡單的枚舉算法。
3.UI框架
相關的類有:
- MainWindow:主窗體
- ChessWidget:主窗體里的主要部件,用于顯示棋盤、操作棋盤,并且會發(fā)出相應音效
- PanelWidget:一個dock部件,置于主部件上方,用于顯示“輪到誰進行下棋”、“當前回合所剩時間”、“認輸按鈕”
- ClientDialog:連接到對戰(zhàn)的對話框,可以設置IP(IPv4)和端口
- ServerDialog:建立服務器,可以設置監(jiān)聽的端口、當前用戶執(zhí)紅or執(zhí)黑、每回合時間
- LoadingDialog:一個能播放動畫的等待連接的對話框
棋盤的繪制是用paintEvent和QPainter進行繪制的。
4.網(wǎng)絡通信
使用QTcpSocket進行傳輸數(shù)據(jù)(監(jiān)聽端是使用QTcpServer進行監(jiān)聽,并且只返回一個可用的socket)
發(fā)送端是阻塞(同步)發(fā)送的,接收端是非阻塞(異步)接收的。
我用的是QDataStream來操作QTcpSocket,這樣省去很多麻煩,比如發(fā)送、接受數(shù)據(jù)只需要簡單的這樣寫:
發(fā)送端:
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"
通信協(xié)議如下:
第1個數(shù)字表示操作類型:
- 0: server傳輸初始數(shù)據(jù)到client;首先傳輸client是紅方(0)還是黑方(1),接著傳輸每一回合的時間,最后將殘局文件傳輸過去
- 1: 移動棋子;接下來4個整數(shù)x1, y1, x2, y2,表示坐標(x1, y1)移動到(x2, y2)
- 2: 認輸;接下來不傳輸任何其他東西
- 3: 我贏了!接下來不傳輸任何其他東西
相關文章
C++操作MySQL大量數(shù)據(jù)插入效率低下的解決方法
這篇文章主要介紹了C++操作MySQL大量數(shù)據(jù)插入效率低下的解決方法,需要的朋友可以參考下2014-07-07
如何使用arm-none-eabi-gcc編譯器搭建STM32的Vscode開發(fā)環(huán)境
這篇文章主要介紹了使用arm-none-eabi-gcc編譯器搭建STM32的Vscode開發(fā)環(huán)境,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
C++類成員構(gòu)造函數(shù)和析構(gòu)函數(shù)順序示例詳細講解
這篇文章主要介紹了C++類成員構(gòu)造和析構(gòu)順序示例,看了這個例子大家就可以明白c++構(gòu)造析構(gòu)的奧秘2013-11-11
基于atoi()與itoa()函數(shù)的內(nèi)部實現(xiàn)方法詳解
本篇文章是對atoi()與itoa()函數(shù)的內(nèi)部實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05
C++ 多線程編程建議之 C++ 對多線程/并發(fā)的支持(下)
這篇文章主要介紹的是 C++ 多線程編程建議之 C++ 對多線程/并發(fā)的支持的相關資料,承接前文 現(xiàn)代 C++ 對多線程/并發(fā)的支持,接下來我們看看回發(fā)生什么吧2021-10-10

