在围棋中,一子两用,可谓妙手,而一子三用,则可称之为神来之笔。在解决征子问题时,一不小心,也来了个神来之笔,其代码如下:

        // 征子判断,p1, p2 为气,p2 为前进方向,p 为逃跑之子。
bool CanLevy(Pos p1, Pos p2, Pos p, bool isBlack = true)
{
if (!IsCusp(p1, p2)) return true;
if (p == m_InvalidPos) return true; List<Pos> selfPoses = isBlack ? BlackPoses : WhitePoses;
List<Pos> otherPoses = !isBlack ? BlackPoses : WhitePoses; // 征而被叫,岂不大笑?
var p1_links = LinkPoses(p1).Intersect(otherPoses).ToList();
if (p1_links.Count == && p1_links.Intersect(EmptyPoses).Count() == )
return false;
var p2_links = LinkPoses(p2).Intersect(otherPoses).ToList();
if (p2_links.Count == && p2_links.Intersect(EmptyPoses).Count() == )
return false; int count = ;
while (true) {
if (!InRange(p2.Row, p2.Col))
break;
bool isRow = p2.Row - p.Row == ? true : false;
int rowOffset = isRow ? (count == ? p1.Row - p2.Row : p2.Row - p1.Row) : ;
int colOffset = isRow ? : (count == ? p1.Col - p2.Col :p2.Col - p1.Col);
Pos pos = new Pos(p2.Row + rowOffset, p2.Col + colOffset);
var rounds = count < ? LinkPoses(pos) : RoundTwoPoses(pos);
foreach (var r in rounds) {
if (isBlack && count < ) continue; // 黑需先走两步
if (selfPoses.Contains(r))
return false;
if (otherPoses.Contains(r)) {
return true;
}
}
count++;
p1 = p;
p = p2;
p2 = pos;
} return true;
}

其中,count 变量,分别控制符号转换(count == 0),排除旧有(count < 5),黑棋预走(count < 2) 三种情况,并且三种情况皆不可少。

现在可以看看效果图了:

当 白10 征子时,不可逃,电脑选择了 黑11,而 白12 时,可以逃了,电脑就聪明的选择了 黑13,堪称完美!

完整代码下载,可参看上一篇博客。

x01.Weiqi.11: 神来之笔的更多相关文章

  1. x01.Weiqi.12: 定式布局

    定式 下一步当将定式保存到数据库中,如布局中的代码所示,但其初始的代码更有利于理解.以小飞挂为例: // 0 // + 0 0 // + // // + List<Pos> P_LuSta ...

  2. x01.Weiqi.10: 死活问题

    估计得不错,点目后,仅一个方法:UpdateMeshes5() 就完美解决了梅花六.刀把五.斗笠四.盘角曲四等死活问题.先来看看效果图: 其代码如下: void UpdateMeshes5(bool ...

  3. x01.Weiqi.9: 点目功能

    添加点目功能,虽不中,不远也.还是先看看截图吧. 确保其可行,再看一张: 其点目结果,还是比较令人满意的.这主要得益于多遍扫描,如编译器的词法分析阶段,下面的代码可以证明: private void ...

  4. x01.Weiqi.7: 调整重绘

    GitHub 谁方便谁拍,谁重要拍谁.在这个砖头满天飞的时代,一个好的生态显得尤为重要.  红颜小头发,要的很简单. 也许成绝唱,只因鱼断肠. 姚贝福娃的离去,除感叹人生无常外,活着做点有意义的事情, ...

  5. x01.os.11: IPC 路线图

    学习的最好方法就是看代码,所以我们不妨跟着 IPC 的调用路线图,来学习学习 IPC. 从 x01.Lab.Download 下载代码后,首先进入 main.c 文件,在 TestA 中,有这么一句: ...

  6. x01.Weiqi.8: 一点改进

    原来的代码全部删除,进行了深层次重构,得其意而忘其言.得意之处有二: 1.关于显示 以 StoneSize 属性为依托,在 set 中加了一句:Width = Height = m_StoneSize ...

  7. x01.Weiqi.13: 鼎力推荐

    鼎力推荐 : 点击后即可观看,小伙子讲的很有深度. 说到深度,自然离不了深度学习.AlphaGo 的横空出世,似乎很有学习的必要. MuGo: 点击下载后,发现是 python,自然免不了一番学习,好 ...

  8. python3之内置函数

    1.abs() 取数字的绝对值 >>> print(abs(-28)) 28 >>> print(abs(-2.34)) 2.34 >>> pri ...

  9. (二十一)python 3 内置函数

    阅读目录 1.abs() 2.dict() 3.help() 4.min() 5.setattr() 6.all() 7.dir() 8.hex() 9.next() 10.slice() 11.an ...

随机推荐

  1. 通过手动创建统计信息优化sql查询性能案例

    本质原因在于:SQL Server 统计信息只包含复合索引的第一个列的信息,而不包含复合索引数据组合的信息 来源于工作中的一个实际问题, 这里是组合列数据不均匀导致查询无法预估数据行数,从而导致无法选 ...

  2. 为 Web 设计师准备的 20 款 CSS3 工具

    1.CSS3 Generator 2. Border Radius 3. CSS3 Maker 4. CSS3 Transforms 5. CSS3 Drop shadow generator 6. ...

  3. 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法

    15年出现的JAVA反序列化漏洞,另一个是redis配置不当导致机器入侵.只要redis是用root启动的并且未授权的话,就可以通过set方式直接写入一个authorized_keys到系统的/roo ...

  4. 9.Configure One-to-One(配置一对一关系)【Code-First系列】

    现在,开始学习怎么配置一对一的关系,众所周知,一对一的关系是:一个表中的主键,在另外一个表中,同时是主键和外键[实际上是一对零或者一对一]. 请注意:一对一的关系,在MS SQL Server中,技术 ...

  5. Facebook Paper使用的第三方库

    Facebook Paper使用的第三方库 第三方库名 简介 链接 ACE code editor https://github.com/ajaxorg/ace Appirater 用户评分组件 ht ...

  6. C# 委托应用总结

    一.什么是委托 1.1官方解释 委托是一种定义方法签名的类型.当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联.您可以通过委托实例调用方法. 1.2个人理解 委托就是执行方法(函数)的一个 ...

  7. 5G

    前世 1G 2G 3G 4G 今生  5G 推荐书籍: Gold Smith -<无线通信> David Tse -<无线通信基础> 参考:

  8. 番外一:关于thinkphp框架下的文件导入路径问题

    总的来说,要使在thinkphp框架下面HTML导入的图片.css文件和js文件有效,只有两种方法:(1)使用绝对路径:(2)在项目目录下创建新目录Public,把所有的img文件夹.js文件夹和cs ...

  9. JVM-绘图展现字节码执行引擎执行过程

    在我的上一篇博客JVM-String比较-字节码分析中介绍了String字符串比较的原因,借着分析字节码的机会,我这篇博客将会绘图展现方法内部字节码执行过程. 话不多说,贴上我们将要分析的Java方法 ...

  10. H5与CS3权威上.5 绘制图形(1)

    1.canvas元素基础知识 (1)在页面上放置canvas元素,相当于在页面上放置一块"画布",可以用Javascript编写在其中进行绘画的脚本. (2)在页面中放置canva ...