2021-03-31

关于象棋程序中走子【送将】的算法研究及改进

所谓送将,即走了一个子,刚好形成对方将你的局面,这是不允许的。
如果黑方在我红帅一线架了空头,我方上士,黑炮即可打掉老王,这就是送将。

我下载了几个源码,其算法是:
1,假设我方走子到点位。
2,算出对方每个子的每种着法。
3,轮循每个子的每种着法的目标坐标,是否等于我方王的坐标,是,即为我方送将。

这个算法让我觉得很恶心:
1,八杆子打不到的一九路黑卒也要算出来,与王坐标比较。
2,每个子都比较一次。

改进思想如下:
1,车炮兵卒将帅,都在王坐标的XY轴,才有可能形成攻击,错开不在XY轴任意一条线上,是形不成攻击的。
2,马要离王近,其坐标xy值与王坐标xy值比较,ABS(马x-王x) == 2 并且 ABS(马y-王y) == 1 或者 ABS(马y-王y) == 2 并且 ABS(马x-王x) == 1,只在这两种情况之1,才可以算马将。
3,把上面两种计算完成,就可以得出是否送将。

算法如下:
先检查马将,再检查王X轴将,再检查王Y轴将
1,红方先行一步
2,先判断马将
3,查找黑方数组,如果黑方有马,则检查两个马坐标与当前王坐标形成将,算法如上,马腿算法是在马XY与王XY相减的绝对值为2那一侧,x或y根据王的方向+-1,另一个坐标也+-2,此处不细述。
4,如果有马将,则为送将,返回true,不是继续。
5,轮询红方帅X轴的所有值,生成棋子值字串:RNBAKABNR,即原始的“车马相士帅士相马车”
6,查找黑方数组,如果黑方有车,正则数组添加 regexAry.push(/r\s{0,8}K/g,/K\s{0,8}r/g),添加黑车左将右将的正则检测。
7,查找黑方数组,如果黑方有炮,正则数组添加 regexAry.push(/c\s{0,7}\S{1}\s{0,7}K/g,/K\s{0,7}\S{1}\s{0,7}c/g),添加黑炮左将右将的正则检测。
8,查找黑方数组,如果黑方有兵,正则数组添加 regexAry.push(/pK/g,/Kp/g),添加黑卒左将右将的正则检测。
9,轮循正则数组,与棋子值字串计算,返回不为空,则找到将,则为送将,返回true,不是继续。
10,X轴送将检测未找到送将,继续检测Y轴送将。
11,轮询红方帅X轴的所有值,生成棋子值字串:K  P  p  k,即原始的“帅  兵  卒  将”
12,正则数组添加 regexAry.push(/K\s{4,8}k/g),添加将帅见面杀。
13,查找黑方数组,如果黑方有车,正则数组添加 regexAry.push(/r\s{0,8}K/g,/K\s{0,8}r/g),添加黑车左将右将的正则检测。
14,查找黑方数组,如果黑方有炮,正则数组添加 regexAry.push(/c\s{0,7}\S{1}\s{0,7}K/g,/K\s{0,7}\S{1}\s{0,7}c/g),添加黑炮左将右将的正则检测。
15,查找黑方数组,如果黑方有卒,正则数组添加 regexAry.push(/Kp/g),添加黑卒右将的正则检测,右将即卒往前将,向后将不可以。
16,轮循正则数组,与棋子值字串计算,返回不为空,则找到将,则为送将,返回true,不是返回false。

这个算法,个人认为,更加合理高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xchenbb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值