Qt项目----基于Tcp协议的局域网内的五子棋对战

一、局域网内的五子棋对战平台
项目功能: 模拟 QQ 游戏大厅,实现局域网内的五子棋对战。
项目介绍: 该项目是在 windows 系统环境下,利用 qt 图形框架和 c++语言编写的。分为服务器和
客户端两部分,服务器端的作用是负责记录各个客户端的状态;客户端则是为用户提供登录和游
戏等功能。
系统功能: (1)系统登录校验、(2)用户信息显示、(3)文字聊天、(4)人机对战、(5)网
络对战、(6)认输重开、 (7)超时处理、 (8)对局详情记录、(9)客户机状态记录。

 

项目环境:

qtcreator 5.4

项目语言:

C++

项目主要难点

(1)单机模式下的机器算法。

(2)网络对战的模式下双方如何进行消息交互。

(3)互通消息时的粘包处理。

(4)网络对战下双方的选子,棋局的同步以及如何判断输赢。

      其中第一个难点说容易也容易,说难也难。难的是如果你想自己写一个很好的算法这个是非常不容易的,容易的是网上关于五子棋的人机对战的策略都已经很成熟了,这个在这里就不赘述了。我们重点来看一下第二、三点。

网络对战的模式下双方如何进行消息交互

         在Tcp协议下需要进行通讯时,必须依靠服务器来完成。要和Tcp的服务器进行链接就必须通过3次握手,3次握手一旦成功就会和服务器链接上,之后就可以和客户端进行通讯了。和服务器的链接在Qt中实现比较简单,可以利用QTcpSocket类中提供的相关函数来完成。之后利用Qt中相关的信号和槽的机制就可以进行通信了。

互通消息时的粘包处理

        在通讯时,会出现一种比较麻烦的事情就是“粘包”,说到这里需要解释一下什么是“粘包”。“粘包”是发送方发出的多个包被接收方一次接受了。从接收方的角度来看是好像发送方发来的是一个包,但是实际上多个包,这种情况就是粘包。

粘包发生的原因:

       这是因为在发送消息时,并不是直接发送出去的,而是先将数据存储到缓冲区中,等待操作系统的调度,然后进行发送。这样发送的原因时Tcp默认采用的是Nagle算法。而Nagle算法主要做两件事:1)只有上一个分组得到确认,才会发送下一个分组;2)收集多个小分组,在一个确认到来时一起发送,这就是导致Tcp粘包的原因。这样就会导致原本的多个处理变成了一个,就会导致一些意外的发生。

解决粘包的方法:

      解决这个问题有两种方法:(1)在客户端解决(2)在服务器端解决

     (1)客户端:在每次发送消息后等待一段时间。

     (2)服务器:每次将缓冲中的数据全部读完(可以采用定长包来区分每个包,或者每次将包的长度发给服务器)。

网络对战下双方的选子,棋局的同步以及如何判断输赢

      当解决了上面的问题后剩余最主要的问题就是双方的选子,棋局的同步以及如何判断输赢。这是我们需要设计一个数据结构,也就是上面说的数据包的格式。这是采用的数据包的格式是:

typedef enum{LOGIN=1,LOGOUT,LOGOK,LOGERR,TRANSMIT,SRVSTOP,BEGIN,PLAY,GIVEUP}FUN;//功能号
typedef enum{WHITE=0,BLACK,NOTHING}ChessPlay;
//数据格式
typedef struct
{
    FUN   fun;//功能号
    char  SenderId[32];//发送者ID
    char  ReceiveId[32];//接收者ID
    char  Content[256];//内容

}NET_PACK;

这是一个定长的包。

之后的问题就是一些绘图的小问题不是很难。

链接:https://pan.baidu.com/s/1dZmKMjAjS0nPuCx3Sj1_oA 
提取码:uhni

大家可以去下载使用,上面是地址。

 

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值