估计得不错,点目后,仅一个方法: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. CentOS6.5网络设置

    CentOS6.5网络设置 不知道哪里做错了,长时间无法连接网络,百度了各种还是不可以.最后自己提取了以前可以联网的配置粘贴过来,成功.配置文件内容如下: vim /etc/resolv.conf 1 ...

  2. Js运动框架

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  3. C# 关键字extern用法

    修饰符用于声明在外部实现的方法.extern 修饰符的常见用法是在使用 Interop 服务调入非 托管代码时与 DllImport 属性一起使用:在这种情况下,该方法还必须声明为 static,如下 ...

  4. iOS学习笔记——使用ChildViewController

    之前在使用TableView的时候遇到过问题,需要使用另外的TableViewController来先存放TableView,原有的View则使用ViewContainer来引用TableViewCo ...

  5. 怎么搭建EF的环境?(Entity Framework)

    1.EF是什么? EF是.net封装的一个用于数据库交互的实体层框架,它的全称是Entity Framework. 2.EF搭建: 新建之后,我们就可以看到里面的内容: 我们可以分别看一下它里面有些什 ...

  6. PHP工作笔记:yii2各种功能汇总

    数据库操纵: 基础知识:数据库基础 查询语句: 使用yii migrate管理.生成数据库 Yii2 AR find用法 Yii2.0 对数据库 查询的一些简单的操作 修改语句: Yii 修改数据的两 ...

  7. Maven命令行使用:mvn clean compile(编译)

    先把命令行切换到Maven项目的根目录,比如:/d/xxxwork/java/maven-test,然后执行命令: mvn clean compile 执行结果如下: [INFO] Scanning ...

  8. [Tool] SourceTree操作中遇到错误(Filename too long)的解决方案

    [Tool] SourceTree操作中遇到错误(Filename too long)的解决方案 问题情景 使用SourceTree,可以方便开发人员使用图形化接口的Git指令来管理原始码.但是在Wi ...

  9. iOS下Audio自动播放(Autoplay)音乐

    前几天做了一个H5活动页面,产品要求初始化播放音乐,因晓得H5 Audio标签支持Autoplay就没在意. 完了在手机上测试,发现手机上打开页面死活就是不会自动播放,点击播放按钮才可以播放,很是纠结 ...

  10. NSMutableString 常用操作

    //字符串的创建 //在可变字符串中 空字符串就有意义 NSMutableString *mString = [[NSMutableString alloc]init]; NSLog(@"m ...