1、功能说明

1.1 初始界面

初始界面中包含一个菜单栏,菜单栏中有一个建立连接选项,可以用来与其他程序建立连接。

1.2 建立连接

单击建立连接后,会弹出一个对话框以配置连接的相关信息,包括创建服务器/客户端,ip地址(服务器显示其ip地址,客户端可输入所需连接的ip),端口号。

1.3 等待连接

等待连接时,显示其ip地址与端口号。

1.4 游戏初始界面

连接建立后,会跳转到游戏的初始界面,包括一个菜单栏,一个label显示当前玩家编号,一个倒计时器,以及开始、保存、认输的按钮,在游戏未开始的时候,认输按钮被禁用。

1.5 游戏导入

菜单栏的开始选项中有导入按钮,按下后可选择本地残局进行导入。

1.6 游戏开始

游戏开始后,开始按钮被禁用,正在下棋的玩家的计时器启动。

1.7 游戏胜负判定

若成功吃掉对方的将/帅,则游戏胜利。

若点击认输,则游戏失利。

若在规定时间内没有下棋, 则游戏失利。

2、设计思路

网络象棋对战主要可拆分为象棋游戏和网络对战两个板块。

2.1 象棋游戏的实现

象棋游戏实现在类gameControler中, 这个类实现了棋局的控制、棋局的绘制以及棋局信息的传递,其主要对外接口如下。

classGameControler:publicQWidget

{

Q_OBJECT

public:

explicitGameControler(QWidget*parent=nullptr);

voidloadGame();

enumType

{

marshal=0,

guardian=1,

elephant=3,

horse=5,

car=7,

cannon=9,

soldier=11,

all=16

};

intgetCurPlayer()const;

QStringgetGame()const;

voidsetMove(QStringst);

voidsetGame(constQString&st="");

voidsetStart();

voidsetEnd();

voidsetPlayerID(intid);

signals:

voidmove(QStringst);

voidwin();

voidlose();

voidjiangjun();

voidbeijiang();

voidtimeout();

};

2.2.1 编号

红方为0号玩家,黑方为1号玩家,每方的16枚棋子的编号如下:

棋子种类

编号

将/帅

0

1,2

3,4

5,6

7,8

9,10

卒/兵

11,12,13,14,15

枚举类Type中每个棋子类型的枚举值为这种棋子的最小编号,all的枚举值是总的棋子个数。

2.2.2 对外接口

用户可通过以”set”为前缀的成员函数对棋局进行控制,包括设定残局setGame、玩家编号setPlayerID、开始游戏setStart、走子方式setMove、结束游戏setEnd。

用户可通过以”get”为前缀的成员函数获得棋局的基本信息,包括正在行动的玩家的编号getCurPlayer,现在的棋局getGame。

当局面发生改变的时候,该类会发射响应的信号,包括棋子移动move(st中存储了棋子的具体移动方式),获胜win,失利lose,将军jiangjun,被将军beijiang,超时timeout。

同时,该类还存储了主界面中的一个QLCDNumber的指针,用以显示剩余时间。

2.2.3 棋局的储存与传递

在类的内部,棋局存储在一个二维数组QPoint p[2][16]中,p[i][j]表示i号玩家的j号棋子的位置,若被吃掉储存为(-1,-1)。

在setGame和getGame中,棋局用与样例文件相同的格式保存。得到这种形式的棋局后,使用正则表达式对其进行解析。

2.2.4 棋局的绘制

使用QPainter的2D绘图绘制棋局,棋盘背景、棋子为添加到资源文件中的已有图片。

2.2.5 棋局控制

棋局控制的主要内容是判断合法性,合法性判定被封装在一个成员函数bool check(int per, int id, int x, int y)中,表示判断per号玩家的id号棋子能否移动到位置(x,y)。

红棋和黑棋的移动规则在本质上是一样的,因此如果检验的是黑棋的移动,该函数首先会对所有棋子做一次对称,然后执行与红棋相同的代码,最后再对称回去。

另外,还利用QTimer进行超时的判定,每一秒使QLCDNumber的值减一,当减到0时即为超时。

2.2 网络对战的实现

MainWindow类中存储一个GameControler类的对象,用以存储棋局信息。对于GameControler中的信号move,lose,jiangjun,beijiang,timeout,MainWindow都有相应的槽函数。另外,MainWindow类还利用QTcpServer与QTcpSocket实现了网络对战。

2.2.1 服务器的初始化

服务器的初始化主要包括void initServer();和void acceptConnection();两个函数,分别表示启动服务器和接受客户端连接。

2.2.2 客户端的初始化

客户端的初始化主要包括void connectHost();与void setConnect();两个函数,分别表示连接到服务器及连接成功后的响应。

2.2.3 通信协议

两个程序间需要互传游戏导入,游戏开始,认输,超时,下子的信息,其传输协议如下:

动作

语法

备注

游戏导入

load [导入的文件]

文件需严格按照样例文件的格式

游戏开始

start

认输

givein

超时

timeout

下子

move_per_id_x_y

per号玩家的id号棋子被移动到了点(x,y)

基于linux下QT象棋,课内资源 - 基于QT实现的网络象棋游戏相关推荐

  1. 基于java酒店管理系统_课内资源 - 基于JAVA实现的互联网酒店管理系统

    1 逻辑视角 互联网酒店管理系统中,选择了分层体系结构的风格,将系统分为3层(展示层.业务逻辑层.数据层)能够很好的示意整个高层抽象.展示层包括GUI页面的实现,业务逻辑层包含业务逻辑处理的实现,数据 ...

  2. linux科学计算器设计,课内资源 - Linux环境下的多项式计算器的实现

    1 实验目的实现一个多项式计算器 2 实验环境Linux下(g++编译) 3 分析与设计 3.1 需求分析:需要实现的基本功能有: 在任何时候能够返回主菜单界面 存储多项式 多项式加法 多项式减法 多 ...

  3. 基于linux的qt五子棋小游戏下载,课内资源 - 基于Qt的图形化界面网络在线对战五子棋游戏...

    一 需求分析 本软件是一款跨平台的网络实时五子棋对战软件,实现建立主机和连接主机.实时对战.判断输赢和危险提示等功能.支持Windows . Linux和OSX平台. 程序主要功能如下: 建立服务器 ...

  4. 基于linux的银行管理,课内资源 - 基于Linux的仓库管理系统

    1 需求分析 要求的仓库管理系统的功能如下: 查看仓库库存列表功能 查询功能:可以随时查看当前仓库的库存中的某些商品的一系列信息,包括商品名,剩余量 进货功能:(以下两个功能是根据输入自动选择的) 在 ...

  5. mysql -ss -e_课内资源 - 基于ssm框架和mysql的网上选课系统

    一.需求分析 1.1 业务需求 随着社会的发展,学生的人数和课程种类急速增加,传统的选课管理模式已经无法满足当前的实际需求,为此我们开发了学生选课管理系统.本人结合学生选课管理的实际需要,完成了对学生 ...

  6. mysql餐馆点餐系统_课内资源 - 基于Jsp和MySql的餐厅点餐系统

    1 总体概述 本设计主要通过HTML.CSS.JavaScript网页开发技术,会话及其会话技术,过滤器技术,Java语言以及连接mysql数据库来实现一个具有登录注册功能,且登录页面使用验证码技术来 ...

  7. C语言编程求解圆盘的汉诺塔,课内资源 - 基于80x86汇编的汉诺塔

    一.软件背景介绍 我们今天要陈述的应用叫做汉诺塔,大家可能小时候都接触过类似于鲁班锁,九连环的益智玩具,我们要说的汉诺塔其实也可以说是益智玩具的一种. 下面我们具体介绍一下汉诺塔.汉诺塔有三根杆子A, ...

  8. java洗衣店管理课程设计报告_课内资源 - 基于Java的洗衣店管理系统

    摘 要 随着科技的快速发展,人们的需求也是越来越多,为了方便对信息的管理我们小组就设计了一个洗衣店订单的管理系统. 洗衣店管理系统是典型的的信息管理系统,创建了六个类,分别是:Test类:Person ...

  9. android studio新闻界面,课内资源 - 基于Android Studio实现的新闻APP

    一.作业题目 二.作业描述 互联网科技的发展让新闻的传播从报纸.广播.电视等方式发展到了网页以及最近几年兴起的手机app客户端,人们获取新闻的方式变得异常容易.手机上的新闻app让大家随时随地掏出手机 ...

最新文章

  1. java集合学生信息_java 使用 集合 制作学生管理系统
  2. 使用urllib2简单爬取并保存内涵吧内涵段子指定分页的的描述信息
  3. 利用.bat(批处理)来删除KEIL编译生成的无用文件
  4. nyoj655光棍的yy
  5. [汇编语言]-第十章 ret,retf,call指令
  6. 第三次学JAVA再学不好就吃翔(part6)--基础语法之char数据类型
  7. JBoss Fuse:使用JEXL的动态蓝图文件
  8. 3.12 12!配对
  9. 按照月的第几周统计_Excel财务案例分享(3)——使用函数制作销售月报和周报...
  10. 随想录(B+树的实现)
  11. 蓝桥杯 ALGO-148 算法训练 5-1最小公倍数 java版
  12. VMware vSphere 5.1 vCenter安装
  13. 联想小新打印机M7268W配置步骤
  14. java 串口 rxtx_java使用RXTX进行串口通信
  15. python读excel两列为字典_python交换数据的两列,python处理excel数据,  python交换...
  16. flutter 顶部状态栏透明
  17. SAP 在表T043G中,XXXX 的输入丢失
  18. flink之SQL入门
  19. 庄思浩先生在清华大学的演讲(2002)
  20. 辽宁学考服务器位置,辽宁学考考点查询软件

热门文章

  1. 财务分账是什么意思?
  2. 火狐浏览器如何关闭右侧的“百度热搜”
  3. 数据挖掘#特征工程(二)特征重要性及可解释性总结
  4. 零基础学python-2.24 一些常用函数
  5. 闭关修炼(二十二)session和cookie原理
  6. CentOS7.5 重装 SSH 与 禁止网卡休眠
  7. 网页调用 iOS/Android 客户端
  8. 【超好懂的比赛题解】2020ICPC澳门站 个人题解
  9. 基于51单片机的数码录音放音系统设计
  10. 2021年起重机司机(限桥式起重机)考试题库及起重机司机(限桥式起重机)找解析