四国军棋开发
文章平均质量分 89
基于GTK+ 3 的四国军棋单机版软件,包括界面与引擎2部分
偏test
这个作者很懒,什么都没留下…
展开
-
四国军棋引擎开发(12)关键步加深搜索
调了很久终于能够更新一个版本了,这东西是越来越难调了,每一次输棋都要处理茫茫多的复杂逻辑,而且有些bug隐藏在递归的最深处很难定位,真希望软件可以像人一样自己学会想算法调代码做验证。这次更新大的框架没有什么改动,只是调了很多很多的bug,最主要添加的功能是在搜索时记录一些关键步,在关键步如威胁到军旗时,再加深2层,从而在残局中能调集一些子力防守。我不打算把这个软件的棋力做到顶尖,做到能稳赢...原创 2019-03-17 21:42:11 · 702 阅读 · 1 评论 -
四国军棋引擎开发(11)多线程搜索
由于现在没有什么好的办法优化剪枝来增加搜索深度,所以现在通过不同的方法进行搜索,最后综合各种搜索方法的结果选择最佳着法。每一种搜索方法是独立的,所以单独放在一个线程里搜索,如果CPU是多核的,操作系统会自动把每个线程放在不同的核心上搜索,达到了并行计算的效果。当前更新版本是2.2,大的框架基本差不多了,行棋时还有很多bug,所以胜率不是很理想,测试结果如下 1.多线程框架首先...原创 2019-01-05 13:00:29 · 494 阅读 · 0 评论 -
四国军棋引擎开发(10)局面评估优化
这次对局面评估做了一些优化,棋力有了一些提升,可以定为2.1版本,测试结果如下:引擎A vs 引擎B 战绩(胜:负:和) 1.1 vs 1.0 8:2:0 1.2 vs 1.1 8:2:0 1.2 vs 1.0 10:0:0 2.0 vs 1.2 8:1:1 2.0 vs 1.1 8:0:2 2.1 vs 2.0 ...原创 2018-12-14 22:05:17 · 606 阅读 · 0 评论 -
四国军棋引擎开发(9)子力概率判断分析
本文分为2部分,第1部分继续深入分析子力的概率问题,第2部分记录下刚刚碰到的一个非常棘手的bug,解决这个bug后,目前这个版本基本上没有什么明显的bug,可以作为版本为2.0。如果全部着法都搜索的话,1秒最多搜4层,军棋每步可行的走法太多,搜索已经很难优化了,接下来的主要优化在局面评估和局部搜索,目前2.0版本的测试结果如下:引擎A vs 引擎B 战绩(胜:负:和) 1.1 vs ...原创 2018-11-25 13:50:39 · 1022 阅读 · 0 评论 -
四国军棋引擎开发(8)主要变例提取
alpha-beta剪枝算法对着法的搜索顺序有比较高的要求,最好是先搜索好的着法再搜索坏的着法,这样就可以最大程度的进行剪枝。在搜索前我们当然不知道着法的优劣,如果知道了那就不需要搜索了,但我们搜索时是一层层递进的,上一层搜索到的最佳着法在这一层来说也相对较优,提取出来之后我们就可以优先搜索上一层的最佳着法序列,也就是主要变例。从算法上来说,主要变例就是value介于alpha和beta之间的...原创 2018-10-29 08:39:31 · 514 阅读 · 0 评论 -
四国军棋引擎开发(7)概率分析与搜索优化
1.概率分析四国军棋属于不完全信息博弈,我们是看不到敌方的棋子,但是可以通过棋子间的碰撞来判断敌方的子力分布情况和棋子大小的概率。当棋子产生碰撞后,可能的判决结果有吃子、打兑、撞死3种结果,有时还会附加是否亮军旗的信息,之前的处理只是简单的把所有情况取平均值,这是不对的,因为某些情况虽然存在,但是概率特别小,如果取平均值就会对着法评分的准确性造成很大的影响,所以更好的方式应该是对每一种情况生成...原创 2018-10-14 14:27:58 · 1142 阅读 · 0 评论 -
四国军棋引擎开发(6)alpha-beta剪枝算法
在讲alpha-beta剪枝算法之前先要了解最大最小算法,在棋类游戏中,给每一个局面打一个分数,轮到自己下时会选择有利于自己的下法,即选择局面分数高的,而对手会选择更加不利于自己的局面,即分数最低的。如下图所示,max结点会选择分数最高的子结点作为分值,而min结点会选择分数低的,最后得到根结点的分数。在上图中为了确定最后根结点的值,我们要查询所有叶子结点的值,事实上没有必要查询所有叶子的值,...原创 2018-09-30 15:18:48 · 2418 阅读 · 0 评论 -
四国军棋引擎开发(5)着法生成与棋谱分析
1.着法生成软件下棋时需要搜索大量的局面并对局面进行评估从而选出最好的着法,每一次行棋时生成所有可行的着法,每个着法产生后对应一个新的局面,然后下一家在新的局面基础上再生成所有着法。军棋软件和普通的象棋软件的着法生成有所不同,象棋是明棋,每一步行棋的结果都是确定的,而军棋则不同,军棋是暗棋,在产生子力的碰撞后可能会有不同的结果,所以还要根据之前的子力判断分析生成可能的碰撞结果。在下棋时引擎给...原创 2018-09-24 09:19:35 · 1092 阅读 · 0 评论 -
四国军棋引擎开发(4)子力判断和局面评估初步
1.子力判断子力判断在局面评估中起着非常重要的作用,在前一篇文章中已经介绍了子力判断的部分,那时相对还比较粗糙,这次会更细致的分析并优化上一次的不足。pLineup->type用来代表棋子的类型,这里是用枚举变量来表示,要注意级别大的变量值小,如40的值是5,39的值是6,排长的值12,工兵的值是13,所以在级别比较的时候要注意区分变量的大小和级别的大小。本方棋子的类型是明确的,敌方...原创 2018-09-16 21:00:20 · 1021 阅读 · 0 评论 -
四国军棋引擎开发(3)寻找到军旗的最短路径
1.问题描述本来打算接下来做α-β剪枝算法,但是我觉得还是要先解决下棋时一个非常蠢的问题,就是军旗都在旁边了却不懂得去挖。这里要解决的算法就是寻找本方棋子到对方军旗的通路,还要在所有通路中寻找最少步数的路径。这是一个非常有意思的算法场景,所以特地为这个问题来写一篇文章。 如下图所示,此时到军旗的路径有绿色和黄色2条,首先要把这2条路径找出来,然后由于绿色路径的长度是4,而黄色路径的长度是3,...原创 2018-09-09 09:30:01 · 1384 阅读 · 0 评论 -
四国军棋引擎开发(2)简单的事件驱动模型下棋
这次在随机乱下的基础上加上了一些简单的处理,如进营、炸棋、吃子等功能,在和敌方棋子产生碰撞之后会获取敌方棋子大小的一些信息,目前采用的是事件驱动模型,当下完一步棋界面返回结果后会判断是否触发了相关事件,有事件发生则处理相关事件,没有事件发生则仍然是随机下棋。1.事件驱动模型首先定义一个各种事件的枚举变量,目前的事件有工兵吃子,摸暗棋,进营,明确吃子,炸棋。定义如下:enum MoveE...原创 2018-08-31 17:21:53 · 634 阅读 · 0 评论 -
四国军棋引擎开发(1)随机下棋
一个多线程引发的问题接下来说明一下解决的一个非常棘手的程序崩溃问题,曾一度调的都要放弃。在软件和界面联调时,经常出现莫名奇妙的界面显示异常,也经常出现GTK内部函数的断言错误,还时不时的出现内存引起的程序崩溃而推出。这个问题不是必现,出现的概率是很高,但是又琢磨不透。自己手工测试很多次,加上打印信息,基本上可以确定是在通信线程执行行棋(即PlayResult)时出现的,但是没发现什么规律,...原创 2018-08-21 20:27:29 · 1742 阅读 · 0 评论 -
四国军棋界面开发(7)与引擎的通信模块
这次增加了与引擎的通信模块,这主要是为了使引擎和界面保持独立,在调试时不会相互影响。现在暂时不考虑界面怎么加载引擎的过程,启动时界面和引擎分别打开。通信使用的是socket通信方式,为了简单起见,采用UDP无连接的通信方式。目前界面和引擎在同一台电脑上,IP地址使用的是都是本机回送地址127.0.0.1,界面的端口号是1234,引擎的端口号是5678。创建socket时分为本地socket...原创 2018-08-17 15:49:03 · 520 阅读 · 0 评论 -
四国军棋界面开发(6)复盘功能及其他修改
这次主要增加了一个复盘的功能,另外代码也改了很多地方,现在做一个集中的说明。1.复盘功能1.1复盘控件复盘时需要有一个前进与后退的按钮,另外还需要有一个比例滑块,通过拉动滑块来快速跳转到某一步,最后显示“步数”文字的label也是一个控件。我们把这几个控件组合在一起,都放在一个pJunqi->step_fixed里,这样只要隐藏pJunqi->step_fixed就可以把所...原创 2018-08-14 21:00:09 · 1675 阅读 · 1 评论 -
四国军棋界面开发(5)吃子规则与声音效果
之前已经完成了对行棋路线的判定,接下来需要实现对军棋中吃子规则的判定1.大小比较只有在行棋路线合法的情况下才比较大小,比较棋子大小的函数为CompareChess输入的参数是选中的棋子和目标棋子(也可能目标位置上没棋子),返回值是比较的结果,比较的结果有4种,分别如下:移动吃掉打兑碰死如果目标位置上没棋,那么说明是没有比较,只是棋子的移动。如果一方有炸弹,则判定为打兑,...原创 2018-08-09 20:01:26 · 2257 阅读 · 0 评论 -
四国军棋界面开发(4) 行棋规则和工兵路径
现在开始来实现界面开发过程中最关键的部分,也就是行棋路线的合法性判断,这里工兵路径的判定是一个主要的难点,在此基础上再加上线路只能走直线的条件就可以得到其他棋子在铁道上的行棋规则。1.路径箭头每一次行棋,都需要在行棋的线路上加上箭头来表示行棋路径,先获取8个方向上的箭头素材 把图中的小箭头裁剪下来放在pJunqi->paArrowPixbuf的数组里,此后在需要添加路径时通...原创 2018-08-07 17:54:03 · 2361 阅读 · 0 评论 -
四国军棋界面开发(3) 标棋和调入布局
通过上一章的讲解,棋子已经能动起来了,接下来我们来添加标棋和调入布局的功能1.标棋1.1获取素材首先调用InitFlagPixbuf(pJunqi);来初始化棋子,先导入标棋图片,如下图 把这张图片先放在消息盒里,然后在放在pJunqi->flagObj.image变量里,当鼠标右键按下棋子时就会弹出该图片。这里有20个标记小图标,需要把这些小图标取出来当素材,...原创 2018-08-04 11:41:17 · 2466 阅读 · 0 评论 -
四国军棋界面开发(2) 让棋子动起来
在上一篇文章讲了如何显示棋盘和棋子,接下来开始实现鼠标点击棋子时移动棋子。1.获取鼠标位置整个棋盘都是在fixed容器里,而fixed容器不可以与鼠标点击事件直接绑定,这里我们用到了消息事件的容器,fixed不是直接放在盒状容器里,而是先放在消息盒子里,再把消息盒子放在盒状容器里,然后把事件盒状与鼠标点击的事件绑定在一起,这样当鼠标点击棋盘时,就会触发鼠标事件的回调函数。 Gtk...原创 2018-08-02 14:16:11 · 927 阅读 · 0 评论 -
四国军棋界面开发(1) 棋盘与棋子
本人比较喜欢下四国军棋,由于网上并没有一款好的四国军棋单机版软件,所以打算自己开发一个。软件分为界面和引擎2部分,为了可维护性和降低开发难度的考虑,使用C语言作为开发语言,界面用的是GTK+ 3。开发顺序是先完成界面的开发,再开发引擎。本文就来介绍棋盘与棋子的显示。1.界面布局每一个界面软件都要新建一个窗口,GTK也不例外,代码如下int main(int argc, char...原创 2018-07-30 21:45:14 · 4072 阅读 · 1 评论