# 简易的国际象棋双人对战程序设计
# 一、程序介绍
## 1.1 现实背景
国际象棋是世界上一个古老的棋种。据现有史料记载,国际象棋的发展历史已将近2000年。关于它的起源,有多种不同的说法,诸如起源于古印度、中国、阿拉伯国家等。
国际象棋分为黑白两方共32枚,每方各16枚;棋盘为正方形,由64个黑白(深色与浅色)相间的格子组成。每方有王、后、象、车、马、兵六种棋子,不同棋子走子和吃子的方法不同,不再赘述。
## 1.2 设计目的
使用Qt自带的Socket编程,实现客户端和服务端一对一的网络对战,正确复现国际象棋的规则。在基本的走子和吃子回合制下,要求有:
对局中,出现下列情况之一,本方算输,对方赢:
己方王被将死(不允许送吃); 2)己方发出认输请求; 3)己方走棋超出步时限制;实现兵生变,用户可选择生变为的棋子。
加入逼和和车马易位功能。车马易位不考虑车和马是否移动过,只要在固定位置,满足车马易位的其他条件即可进行易位。
一局结束时(胜负,逼和)在两端弹出对话框告知结果。
加入残局载入和保存功能。
## 1.3 程序使用方法
程序初始界面如下
![](https://www.writebug.com/myres/static/uploads/2022/9/12/ded9a226e0a3c454d80429e4ae341c74.writebug)
本程序采用客户端和服务端集成的设计,点击初始化—连接,用户自主选择创建客户端抑或服务端,以及ip地址和端口号。
![](https://www.writebug.com/myres/static/uploads/2022/9/12/cb1ba04cd216a01612824ab5c9521ab4.writebug)
选择创建服务端,点击OK,处于等待连接状态;可随时取消等待。
![](https://www.writebug.com/myres/static/uploads/2022/9/12/5781ca39d584467144486e273e3384a1.writebug)
再开一个程序,选择创建客户端,设置对应端口号,点击OK连接服务端。这时客户端和服务端的创建连接窗口销毁,代表二者成功建立连接。这时两端的界面分别变为
![](https://www.writebug.com/myres/static/uploads/2022/9/12/4f04424f3702dc0a4015cd17f3e6297e.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/9/12/878f322bf5369f421cdbdaa0fb17a322.writebug)
服务端
客户端
本程序的特色之一是客户端和服务端的不对称权限。一个不成文的规定是,数据的运算和主动权握在服务端手里,于是只有服务端能点击开始游戏,能够载入残局等。在服务端点击开始游戏,双方同时开始
![](https://www.writebug.com/myres/static/uploads/2022/9/12/1ecf4ed51fe987175e2d79c3809fc4c2.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/9/12/0d946054b341d919bba6177f0d9979c2.writebug)
双方均可正常走子。此时黑方不走,倒计时结束后,双方均弹出消息框
![](https://www.writebug.com/myres/static/uploads/2022/9/12/3d0ed743ab119b9b6210e7e545545da5.writebug)
认输和将死效果相同,不再演示。载入兵升变残局,将兵走到底线,出现如下界面
![](https://www.writebug.com/myres/static/uploads/2022/9/12/beef5fe65d9900900653ab3fcf5a09fa.writebug)
若选择后,则将死对方
![](https://www.writebug.com/myres/static/uploads/2022/9/12/0dffee435cfa3e5f9bd1a8e7bd116c3e.writebug)
若选择象,则逼和
![](https://www.writebug.com/myres/static/uploads/2022/9/12/d88f6e1a1360f6e4c2a3cf2cc41226f1.writebug)
最后演示车马易位。载入残局
![](https://www.writebug.com/myres/static/uploads/2022/9/12/ede63e7fa241a009b114c3a561cca71f.writebug)
此时由于王受黑车威胁,无法进行车马易位
![](https://www.writebug.com/myres/static/uploads/2022/9/12/f2ea2b2772d1a1cf57265678e9e57e96.writebug)
将局势走成上图所示,此时王以及王经过的路径均不受威胁,可进行长短易位。长易位后效果如下
![](https://www.writebug.com/myres/static/uploads/2022/9/12/2b9d3554fac9b78bafb31dd4adea2e56.writebug)
# 二、程序设计
技术基础本程序在Qt Creator中编写测试,共约1400行代码,使用自带编译器(mingW)编译。
使用了Qt自带的QString文本库,QFile文件库,QMap、QSet、QVector、QList等容器库存储数据,QTimer进行计时,QPaintEvent、QMouseEvent处理鼠标和绘图事件,QMessageBox、
QFileDialog标准消息框和文件对话框,QPainter绘图方法;没有使用QThread进行多线程并发操作;网络通信部分使用的是Qt Socket部分的QTcpServer和QTcpSocket类,以及数据打包和处理时的QDataStream,QByteArray等。
类的职责和关系
utils.h中首先定义了方便数据传输和运算的结构体包装,并重载了 QDataStream 的流运算符用于结构 体的序列化、二进制化,编码和解码的过程
```c++
struct Pos{//坐标二元组
int x,y;
bool operator == (const Pos & value) const{//用于比较以及取得作QSet键值的资格
return (value.x==x&&value.y==y);
}
bool operator < (const Pos & value) const{//用于比较以及取得作QMap键的资格
if(x<value.x)return true;
if(x>value.x)return false;
if(y<value.y)return true;
if(y>value.y)return false;
return false;
}
friend QDataStream& operator>>(QDataStream& in, Pos& s);
friend QDataStream& operator<<(QDataStream& out,const Pos& s);
};
struct Piece{//棋子
bool white;//棋子属于白方与否
int type;//棋子类型,0~5 queen bishop rook knight pawn king
friend QDataStream& operator>>(QDataStream& in, Piece& s);
friend QDataStream& operator<<(QDataStream& out,const Piece& s);
};
struct Walk{//棋子的移动,将王车易位也看做一种移动,在下面的move()函数中一视同仁进行充分处理
Pos pos;//目标位置
int attack;//移动的附加属性 0:走 1:攻击 2:王车易位
};
struct Situation{//对局面的快照
//单独标记王的位置
Pos black_king;
Pos white_king;
QMap<Pos,Piece> pieces;//记录全局所有位置-棋子映射
friend QDataStream& operator>>(QDataStream& in, Situation& s);
friend QDataStream& operator<<(QDataStream& out,const Situation& s);
};
inline uint qHash(const Pos key){//用于结构体契合QSet的key,与大作业一的功能相同,不再赘述
return key.x + key.y;
}
```
需要将死、逼和、王车易位功能,在得到棋子可走范围时需要进行虚拟的模拟,于是有了两个步骤的处理。这样的处理也使得将死和逼和的判断轻而易举:当某方所有子的FinalRange的并集为空集时,若此时此方被将军,则是将死;否则为逼和。
updialog.h中的UpDialog继承自QDialog,是进行兵生变选择的对话框,调用其int getSetting()函数将执行exec()并阻塞,窗口销毁后返回选择的生变类型。 connectiondialog.h提供了一开始选择服务端/客户端并创建连接的窗口。
```c++
public:
explicit ConnectionDialog(QWidget *parent); signals:
void serverdone(QTcpSocket*);
void clientdone(QTcpSocket*);
```
父窗口只需新建ConnectionDialog对象进行初始化并进行信号的连接即可。当用户选择建立服务器并成功创建连接时触发携带socket的void serverdone(QTcpSocket*)信号,当用户选择建立客户端并成功创建连接时触发携带socket的void clientdone(QTcpSocket*)信号。
chessboard.h是国际象棋棋盘的显示控件,内部将处理鼠标的点击事件、可移动区域的计算和显示等。对外层来说重要的只有
```c++
public:
explicit ChessBoard(QWidget *parent);
void setSituation(Situation s);//设置局面,立刻repaint()生效
void setStatus(int id);//设置棋盘显示状态 //0:empty 1:loaded 2:selecting
//下面两个函
没有合适的资源?快使用搜索试试~ 我知道了~
基于C++(QT)设计的简易国际象棋双人对战程序【100011696】
共39个文件
png:13个
cpp:8个
h:8个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 121 浏览量
2023-04-07
14:29:31
上传
评论
收藏 6.93MB ZIP 举报
温馨提示
使用Qt自带的Socket编程,实现客户端和服务端一对一的网络对战,正确复现国际象棋的规则。在基本的走子和吃子回合制下,要求有: 对局中,出现下列情况之一,本方算输,对方赢: 己方王被将死(不允许送吃); 2)己方发出认输请求; 3)己方走棋超出步时限制;实现兵生变,用户可选择生变为的棋子。 加入逼和和车马易位功能。车马易位不考虑车和马是否移动过,只要在固定位置,满足车马易位的其他条件即可进行易位。 一局结束时(胜负,逼和)在两端弹出对话框告知结果。 加入残局载入和保存功能。
资源推荐
资源详情
资源评论
收起资源包目录
100011696-基于C++(QT)设计的简易国际象棋双人对战程序.zip (39个子文件)
platform
chessclient.h 807B
updialog.ui 1KB
updialog.cpp 347B
chessserver.h 1KB
mainwindow.h 1KB
connectiondialog.h 712B
image
black_pawn.png 8KB
white_knight.png 14KB
black_king.png 18KB
white_bishop.png 18KB
black_rook.png 4KB
image.qrc 36B
white_rook.png 6KB
white_queen.png 22KB
bg.png 1.76MB
white_king.png 15KB
black_bishop.png 15KB
black_knight.png 10KB
white_pawn.png 9KB
black_queen.png 22KB
LICENSE 1KB
image.qrc 605B
mainwindow.cpp 4KB
main.cpp 172B
mainwindow.ui 3KB
Chess.pro 2KB
connectiondialog.ui 3KB
Chess.pro.user 24KB
docs.pdf 5.17MB
packet.cpp 996B
packet.h 385B
chessboard.cpp 4KB
connectiondialog.cpp 3KB
README.md 12KB
updialog.h 334B
chessclient.cpp 2KB
chessserver.cpp 5KB
utils.h 18KB
chessboard.h 807B
共 39 条
- 1
资源评论
神仙别闹
- 粉丝: 2687
- 资源: 7642
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功