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

项目环境:

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://github.com/llpig/GoBangNet

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

猜你喜欢

转载自blog.csdn.net/qq_39038983/article/details/86506518