估计得不错,点目后,仅一个方法: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. jsp原理

    在eclipse里jsp编译后的java和class文件的位置 eclipse版本不一样,位置也不一样第一种:1.java类编译后产生的.class文件在D:\workspace\test\WEB-I ...

  2. C#学习记录

    转眼几个月没更博了,把几个月前学C#的笔记发一下,就记录了点教重要的点子而已 1.打印 Console.WriteLine(); 打印 Console.ReadKey(); 按一个按键继续执行 Con ...

  3. 【C#公共帮助类】给大家分享一些加密算法 (DES、HashCode、RSA、AES等)

    AES 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的 ...

  4. XmlReader和XElement组合之读取大型xml文档

    简介 在.NET framework 中存在大量操作xml数据的类库和api,但在.NET framework 3.5后我们的首选一般就是linq to xml. linq to xml操作xml数据 ...

  5. linux下安装mysql

    下载Mysql包 因为mysql比较大,我们不能像安装nginx和php那样,通过下载源码,编译成二进制安装.mysql安装比php和nginx稍微麻烦一点. 这里mysql我们直接下载编译好的二进制 ...

  6. 浅谈C# 多态的法力

    前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象 ...

  7. 深入Java关键字this的用法的总结

    在Java程序设计中经常会见到this的使用,this使得程序设计变得规范.简单.灵活.但是在使用过程中,在不同场 合它的含义并不完全相同,使用不当还会出现错误, 本文对this的几种用法和出现的问题 ...

  8. 使用eclipse作为python开发工具安装旧版pydev

    在Eclipse中: Help->Install New Software add之后输入的链接地址 https://dl.bintray.com/fabioz/pydev/old/ 如果使用从 ...

  9. JS高程3.基本概念(5)语句

    1.if语句 2.do-while语句:后测循环语句,循环体内的代码至少执行一次. 3.while语句:前测循环语句. 4.for语句:前测循环语句. 注意:在ECMAScript中不存在块级作用域, ...

  10. IIS6.0添加上.net4.0后,以前的.net系统出现“服务器应用程序不可用”的错误提示解决办法

    把VS2010开发的网站.net4.0部署到Windows Server 2003的服务器上去, Windows Server 2003操作系统自带的为IIS 6.0,IIS 6.0一般只支持.NET ...