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

其代码如下:

 void UpdateMeshes5(bool isFirst = true)
{
UpdateAllMeshBlocks(); m_BlackMeshBlocks.ForEach(block => {
var poses = block.Poses.ToList();
block.Poses.ForEach(p => {
if (BlackPoses.Contains(p))
poses.Remove(p);
LinkPoses(p).ForEach(l => {
if (m_WhiteMeshes.Contains(l))
poses.Remove(p);
});
}); if (poses.Count == ) {
poses.ForEach(p => {
var links = LinkPoses(p);
if (links.Intersect(poses).Count() == ) { // 梅花六
var tmp = poses.Except(links).ToList();
if (IsCusp(tmp[], p)) {
block.IsDead = true;
block.KeyPos = p;
}
}
});
} else if (poses.Count == ) {
poses.ForEach(p => {
var links = LinkPoses(p);
if (links.Intersect(poses).Count() == ) { // 刀把五
var tmp = poses.Except(links).ToList();
if (IsCusp(tmp[], p)) {
block.IsDead = true;
block.KeyPos = p;
}
}
});
} else if (poses.Count == ) {
poses.ForEach(p => {
var links = LinkPoses(p);
if (links.Intersect(poses).Count() == ) { // 斗笠四
block.IsDead = true;
block.KeyPos = p;
} else if (links.Intersect(poses).Count() == // 盘角曲四
&& (p == new Pos(, ) || p == new Pos(, ) || p == new Pos(, ) || p == new Pos(, ))) {
block.IsDead = true;
}
});
} else if (poses.Count == ) {
poses.ForEach(p => {
var links = LinkPoses(p);
if (links.Intersect(poses).Count() == ) { // 直三、曲三
block.IsDead = true;
block.KeyPos = p;
}
});
} else if (poses.Count == ) {
poses.ForEach(p => {
var links = LinkPoses(p);
if (links.Intersect(poses).Count() == ) {
block.IsDead = true;
}
});
} else if (poses.Count < ) {
block.IsDead = true;
} if (!isFirst && block.IsDead) {
m_BlackMeshes.RemoveAll(b => block.Poses.Contains(b));
m_WhiteMeshes.AddRange(block.Poses);
}
}); m_WhiteMeshBlocks.ForEach(block => {
var poses = block.Poses.ToList();
block.Poses.ForEach(p => {
if (WhitePoses.Contains(p))
poses.Remove(p);
LinkPoses(p).ForEach(l => {
if (m_BlackMeshes.Contains(l))
poses.Remove(p);
});
});
if (poses.Count == ) {
poses.ForEach(p => {
var links = LinkPoses(p);
if (links.Intersect(poses).Count() == ) { // 梅花六
var tmp = poses.Except(links).ToList();
if (IsCusp(tmp[], p)) {
block.IsDead = true;
block.KeyPos = p;
}
}
});
} else if (poses.Count == ) {
poses.ForEach(p => {
var links = LinkPoses(p);
if (links.Intersect(poses).Count() == ) { // 刀把五
var tmp = poses.Except(links).ToList();
if (IsCusp(tmp[], p)) {
block.IsDead = true;
block.KeyPos = p;
}
}
});
} else if (poses.Count == ) {
poses.ForEach(p => {
var links = LinkPoses(p);
if (links.Intersect(poses).Count() == ) { // 斗笠四
block.IsDead = true;
block.KeyPos = p;
} else if (links.Intersect(poses).Count() == // 盘角曲四
&& (p == new Pos(, ) || p == new Pos(, ) || p == new Pos(, ) || p == new Pos(, ))) {
block.IsDead = true;
}
});
} else if (poses.Count == ) {
poses.ForEach(p => {
var links = LinkPoses(p);
if (links.Intersect(poses).Count() == ) { // 直三、曲三
block.IsDead = true;
block.KeyPos = p;
}
});
} else if (poses.Count == ) {
poses.ForEach(p => {
var links = LinkPoses(p);
if (links.Intersect(poses).Count() == ) {
block.IsDead = true;
}
});
} else if (poses.Count < ) {
block.IsDead = true;
} if (!isFirst && block.IsDead) {
m_WhiteMeshes.RemoveAll(b => block.Poses.Contains(b));
m_BlackMeshes.AddRange(block.Poses);
}
}); if (isFirst) {
m_BlackMeshBlocks.ForEach(block => {
if (block.IsDead) {
foreach (var pos in block.Poses) {
var links = LinkPoses(pos);
m_WhiteMeshBlocks.ForEach(w_block => {
if (links.Intersect(w_block.Poses).Count() > ) {
if (w_block.IsDead) {
BlackPosBlocks.ForEach(bp_block => {
if (bp_block.Poses.Contains(pos)) {
block.EmptyCount = bp_block.EmptyCount;
}
WhitePosBlocks.ForEach(wp_block => {
if (wp_block.Poses.Intersect(w_block.Poses).Count() > ) {
w_block.EmptyCount = wp_block.EmptyCount;
}
});
});
if (block.EmptyCount > w_block.EmptyCount) {
m_WhiteMeshes.RemoveAll(w => w_block.Poses.Contains(w));
m_BlackMeshes.AddRange(w_block.Poses);
} else if (block.EmptyCount < w_block.EmptyCount) {
m_BlackMeshes.RemoveAll(b => block.Poses.Contains(b));
m_WhiteMeshes.AddRange(block.Poses);
}
}
}
});
}
}
});
} UpdateMeshColors();
}

UpdateMeshes5()

因为涉及到比气问题,所以要调用两次。这又是多遍扫描的应有之意,相信已经见怪不怪了。

加点智能:

Pos Defend2()
{
var empties = RoundThreePoses(m_CurrentPos).Intersect(EmptyPoses).ToList();
int count = empties.Count;
Dictionary<Pos,int> store = new Dictionary<Pos, int>();
int backCount = ; for (int j = ; j < ; j++) {
bool isFirst = false;
Pos firstPos = m_InvalidPos;
for (int i = ; i < ; i++) {
int index = m_Rand.Next(, count);
Pos e = empties[index];
if (!NextOne(e.Row, e.Col)) continue;
if (!isFirst) {
isFirst = true;
firstPos = e;
}
backCount++;
}
UpdateMeshes1();
store[firstPos] = m_BlackMeshes.Count - m_WhiteMeshes.Count;
for (int b=; b <backCount; b++) {
BackOne();
}
backCount = ;
} int value = -;
Pos pos = m_InvalidPos;
foreach (var pair in store) {
if (value < pair.Value) {
value = pair.Value;
pos = pair.Key;
}
}
return pos;
}

Defend2

最新代码下载链接https://github.com/chinax01/x01.Weiqi

x01.Weiqi.10: 死活问题的更多相关文章

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

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

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

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

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

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

  4. x01.Weiqi.11: 神来之笔

    在围棋中,一子两用,可谓妙手,而一子三用,则可称之为神来之笔.在解决征子问题时,一不小心,也来了个神来之笔,其代码如下: // 征子判断,p1, p2 为气,p2 为前进方向,p 为逃跑之子. boo ...

  5. x01.os.10: 输入输出

    从 x01.Lab.Download 中下载源代码,进入工程目录,make 后再 bochs,即可见到如下界面: 随便打几个字,ok!按 F2,可切换到第二个终端,界面如下: 当然,按 F3 还可切换 ...

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

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

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

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

  8. Goldengate trial队列维护

    查看进程信息: Info replicat_name $Info replicat_name showch 注:   可以查看到详细的关于checkpoint的信息,用于查看GoldenGate进程处 ...

  9. GoldenGate Lag For Huge Insert

    前些天客户的ogg延迟到达8小时左右.于是我当时用logdump追踪了一下: 看进程状态: send extsa staus EXTRACT ZBDBA (PID 2269368) Current s ...

随机推荐

  1. 用MVC做支付宝手机网页支付问题

    支付宝支付接口手机网页支付 从官网扒下来的demo阿里做得还是相当不错的,只要参数改正确了基本上都是能跑通,WebForm的没什么大问题,这次要讲的主要是几个要注意的问题,因为是用MVC来做. 1.要 ...

  2. 资源等待类型sys.dm_os_wait_stats

    动态管理视图  sys.dm_os_wait_stats 返回执行的线程所遇到的所有等待的相关信息.可以使用该聚合视图来诊断 SQL Server 以及特定查询和批处理的性能问题. 列名 数据类型 说 ...

  3. jQuery-1.9.1源码分析系列(二)jQuery选择器续1

    在分析之前说一点题外话. ownerDocument和 documentElement的区别 ownerDocument是Node对象的一个属性,返回的是某个元素的根节点文档对象:即document对 ...

  4. [转载]C/C++框架和库

    C/C++框架和库 装载自:http://blog.csdn.net/xiaoxiaoyeyaya/article/details/42541419 值得学习的C语言开源项目 Webbench Web ...

  5. 数据结构(C语言第2版)-----数组,广义表,树,图

    任何一个算法的设计取决于选定的数据结构,而算法的实现依赖于采用的存储结构. 之前线性表的数据元素都是非结构的原子类型,元素的值是不可再分的.下面学习的这两个线性表是很特殊的,其中数据元素本身也可能是一 ...

  6. Xamarin.Android和UWP之MVVM的简单使用(二)

    0x01 前言 前面一篇,Xamarin.Android和UWP之MVVM的简单使用(一),主要讲了MvvmLight的简单使用 这篇主要讲讲MvvmCross的简单使用,例子的话,还是和上篇的一样. ...

  7. javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)

    在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...

  8. 微信JSApi支付~订单号和微信交易号

    返回目录 谈谈transactionId和out_trade_no 前一篇微信JSApi支付~坑和如何填坑文章反映不错,所以又写了个后篇,呵呵. 每个第三方在线支付系统中都会有至少两类订单号,其一为支 ...

  9. java中的对象,类。与 方法的重载。

    对象: 一切皆为对象.对象包括两部分内容:属性(名词形容词),行为(动词).对象和对象之间是有关系的: 派生,关联,依赖. 类: 对同一类别的众多对象的一种抽象.类,还是用来生成对象的一种模板,对象是 ...

  10. UDS(ISO14229-2006) 汉译(No.1 范围)

    ISO14229指定的数据链路是独立于诊断服务的,该数据链路允许测试仪(Client)操作ECU(Server)中的诊断功能(如电子燃油喷射.变速箱.ABS等)并接入一条嵌入车辆的串行数据链路.它指定 ...