这次增加了与引擎的通信模块,这主要是为了使引擎和界面保持独立,在调试时不会相互影响。现在暂时不考虑界面怎么加载引擎的过程,启动时界面和引擎分别打开。

通信使用的是socket通信方式,为了简单起见,采用UDP无连接的通信方式。目前界面和引擎在同一台电脑上,IP地址使用的是都是本机回送地址127.0.0.1,界面的端口号是1234,引擎的端口号是5678。

创建socket时分为本地socket和目的socket,本地socket用来监听是否收到数据,目的socket用来向引擎发送数据

 local.sin_family = AF_INET;local.sin_addr.s_addr=INADDR_ANY;local.sin_port = htons(1234);if(bind(socket_fd, (struct sockaddr *)&local, sizeof(struct sockaddr) )<0){printf("Bind Error!\n");pthread_detach(pthread_self());}
 addr.sin_family = AF_INET;inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);addr.sin_port = htons(5678);pJunqi->socket_fd = socket_fd;pJunqi->addr = addr;

socket通信运行在一个单独的线程里,一直监听引擎发过来的数据并进行处理。

void CreatCommThread(Junqi* pJunqi)
{pthread_t tidp;pthread_create(&tidp,NULL,(void*)comm_thread,pJunqi);
}
 while(1){recvbytes=recvfrom(socket_fd, buf, 100, 0,NULL ,NULL);(void)recvbytes;//暂时不用,消除告警DealRecData(pJunqi, buf);}

通信报文由头部和数据内容组成,头部总共有8个字节,格式如下:

偏移地址(字节)

长度(字节)

描述

0

4

固定标识符

4

1

方位

5

1

功能码

6

2

待定

typedef struct CommHeader
{u8 aMagic[4];u8 iDir;u8 eFun;u8 reserve[2];
}CommHeader;

前4个字节固定为0x57,0x04,0,0,第5个字节指定方位,用来表示是哪一家行棋或者是哪一家的布阵。功能码用来表示具体发送的事件,不同的功能码会有不同的数据报文内容,目前定义了以下功能码:

#define COMM_OK          0
#define COMM_ERROR       1
#define COMM_GO          2
#define COMM_MOVE        3
#define COMM_EVNET       4
#define COMM_START       5
#define COMM_READY       6
#define COMM_LINEUP      7
#define COMM_INIT        8
#define COMM_STOP        9

各功能码的意义如下:

  • COMM_OK
    代表收到数据或处理完毕,没有实际意义。
  • COMM_ERROR
    接收到非法数据,如不按规则的移动和布阵
  • COMM_GO
    当引擎长时间思考时,该指令让引擎立即出招,点击橙色的小按钮会发送该指令
  • COMM_MOVE
    代表每一步的行棋和比较结果,引擎向界面只发送棋子移动坐标,在每一次行棋后界面都会向引擎发送棋子的移动还有判定结果告诉引擎棋盘上的信息变化。该指令的数据格式如下:

    偏移地址(字节)

    长度(字节)

    描述

    0

    2

    棋子移动前坐标

    2

    2

    棋子移动后坐标

    4

    1

    判决结果(移动、吃子、打兑、撞死)

    5

    1

    用最低3位bit分别表示附加判决:

    0:军旗被挖

    1:移动方司令阵亡

    2:目标方司令阵亡

    6

    2

    移动方军旗坐标

    8

    2

    目标方军旗坐标

  • COMM_EVNET
    除了棋子的移动,棋盘上还会发生一些其他的事件,如跳过和投降,超时也算跳过,在头部后的一个字节用来表示发生的事件,0表示跳过,1表示投降
  • COMM_START
    当点击开始按钮时会发送该指令表示开始行棋,这条指令没有数据内容,方位字节表示先手。
  • COMM_READY
    界面向引擎发送该指令表示socket已经启动,当前处于布阵状态,当引擎向界面发送该指令时,界面会给引擎发送上家和下家的初始布阵
  • COMM_LINEUP
    当对上一家和下一家调入布阵或者调整布阵时,界面会向引擎发送该指令,该指令紧跟着30字节表示布阵的内容,即5*6个格子(25个棋子+5个营)。 引擎向界面发送该指令表示设置布阵。
  • COMM_INIT
    当界面收到COMM_READY指令后,会发送该指令到引擎表示初始化布阵,数据格式如下

    偏移地址(字节)

    长度(字节)

    描述

    0

    4

    4字节代表每个方位,置1表示收到这一家布阵

    4~30*?

    30*?

    收到的布阵

  • COMM_STOP
    当界面暂停时会发送该指令,此时停止计时,此时点击继续会立即出招按钮来告诉引擎继续行棋。

通信的内容基本就这么多吧,以后开发引擎时如果有需要再增加,至此界面部分的开发工作也就告一段落了,接下来要开始开发引擎了,现在展示一下当前的界面效果吧

源代码地址:

https://github.com/pfysw/JunQi

四国军棋界面开发(7)与引擎的通信模块相关推荐

  1. 四国军棋界面开发(1) 棋盘与棋子

    本人比较喜欢下四国军棋,由于网上并没有一款好的四国军棋单机版软件,所以打算自己开发一个.软件分为界面和引擎2部分,为了可维护性和降低开发难度的考虑,使用C语言作为开发语言,界面用的是GTK+ 3. 开 ...

  2. 四国军棋界面开发(4) 行棋规则和工兵路径

    现在开始来实现界面开发过程中最关键的部分,也就是行棋路线的合法性判断,这里工兵路径的判定是一个主要的难点,在此基础上再加上线路只能走直线的条件就可以得到其他棋子在铁道上的行棋规则. 1.路径箭头 每一 ...

  3. 四国军棋界面开发(2) 让棋子动起来

    在上一篇文章讲了如何显示棋盘和棋子,接下来开始实现鼠标点击棋子时移动棋子. 1.获取鼠标位置 整个棋盘都是在fixed容器里,而fixed容器不可以与鼠标点击事件直接绑定,这里我们用到了消息事件的容器 ...

  4. 四国军棋界面开发(6)复盘功能及其他修改

    这次主要增加了一个复盘的功能,另外代码也改了很多地方,现在做一个集中的说明. 1.复盘功能 1.1复盘控件 复盘时需要有一个前进与后退的按钮,另外还需要有一个比例滑块,通过拉动滑块来快速跳转到某一步, ...

  5. 四国军棋界面开发(5)吃子规则与声音效果

    之前已经完成了对行棋路线的判定,接下来需要实现对军棋中吃子规则的判定 1.大小比较 只有在行棋路线合法的情况下才比较大小,比较棋子大小的函数为CompareChess 输入的参数是选中的棋子和目标棋子 ...

  6. 四国军棋界面开发(3) 标棋和调入布局

    通过上一章的讲解,棋子已经能动起来了,接下来我们来添加标棋和调入布局的功能 1.标棋 1.1获取素材 首先调用InitFlagPixbuf(pJunqi);来初始化棋子,先导入标棋图片,如下图 把这张 ...

  7. 四国军棋界面Swing/AWT的代码

    代码是Eclipse工程,需要JDK1.5,没有其他JAR依赖:界面截图 [img]http://metaphy.iteye.com/upload/picture/pic/11509/5d756788 ...

  8. 四国军棋引擎开发(1)随机下棋

    现在开始来开发四国军棋的引擎,所谓引擎就是根据当前的局面给出最佳的下法,而界面只是一个显示的功能.目前由玩家控制自家和对家的棋,由引擎控制上家和下家的棋. 1.通信 和界面类似,socke通信放在一个 ...

  9. 四国军棋引擎开发(9)子力概率判断分析

    本文分为2部分,第1部分继续深入分析子力的概率问题,第2部分记录下刚刚碰到的一个非常棘手的bug,解决这个bug后,目前这个版本基本上没有什么明显的bug,可以作为版本为2.0.如果全部着法都搜索的话 ...

最新文章

  1. Flink 基本原理与生产实践分享【入门必读,概念清晰】
  2. linux 设置mysql 数据库编码utf8
  3. Lambda表达式及应用
  4. Codeforces Round #666 (Div. 2)D. Stoned Game(博弈问题)
  5. OEM XP 让你的盗版xp像品牌机一样华丽
  6. 自己经常测试,不要等别人发现系统死了
  7. 智慧酒店雷达传感方案,人体存在感应技术应用,雷达探测模块
  8. 埃森哲互动并购了56家广告公司
  9. java 类中 serialversionuid 作用
  10. html图片绝对地址相对地址,HTML中background的图片地址是相对地址吗?
  11. 华为云宣布将在全球范围内推出区块链服务
  12. 还不错的微信活码程序源码+功能强大
  13. SQL中modify和alter用法区别
  14. 计算机任务计划程序已损坏,win7系统弹出任务计划程序窗口显示该任务映像损坏或已篡改0x80041321错误代码的解决方法...
  15. 韩国研发人工智能武器 遭30国专家联名抵制:和你绝交!
  16. 第一行代码第三版笔记
  17. 【安全与风险】计算机系统基本资源安全
  18. 区块链架构--fabric基本介绍
  19. CBM 2099 OTG扩容U盘量产,亲自试验经验
  20. 今日科技联播:阿里倡导成立“罗汉堂” 6名诺贝尔奖得主加入

热门文章

  1. Flink在爱奇艺广告业务的实践
  2. 吃个宵夜的时间,脑子里进点三相交流无刷电机驱动原理不过分吧
  3. 如何将自己开发的手机APP软件上传到各大手机软件下载平台上(´・_・`)
  4. 【python实现网络爬虫(7)】scrapy爬取笑话大全网站全过程(505问题的解决)
  5. [zkaq靶场]逻辑漏洞--支付漏洞
  6. 番茄的随笔7:从PI和PR的传递函数波特图分析参数的影响
  7. html图片轮播怎么写,用js和CSS写图片切换效果(轮播图)
  8. 从618开门红,看京东家电的价格攻势及对消费升级的推动
  9. Ubuntu/Linux下自动获取最佳GPU编号的脚本
  10. etabs数据_[转载]使用Etabs提取数据的问题