x01.Weiqi.10: 死活问题
估计得不错,点目后,仅一个方法: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: 死活问题的更多相关文章
- x01.Weiqi.12: 定式布局
定式 下一步当将定式保存到数据库中,如布局中的代码所示,但其初始的代码更有利于理解.以小飞挂为例: // 0 // + 0 0 // + // // + List<Pos> P_LuSta ...
- x01.Weiqi.9: 点目功能
添加点目功能,虽不中,不远也.还是先看看截图吧. 确保其可行,再看一张: 其点目结果,还是比较令人满意的.这主要得益于多遍扫描,如编译器的词法分析阶段,下面的代码可以证明: private void ...
- x01.Weiqi.7: 调整重绘
GitHub 谁方便谁拍,谁重要拍谁.在这个砖头满天飞的时代,一个好的生态显得尤为重要. 红颜小头发,要的很简单. 也许成绝唱,只因鱼断肠. 姚贝福娃的离去,除感叹人生无常外,活着做点有意义的事情, ...
- x01.Weiqi.11: 神来之笔
在围棋中,一子两用,可谓妙手,而一子三用,则可称之为神来之笔.在解决征子问题时,一不小心,也来了个神来之笔,其代码如下: // 征子判断,p1, p2 为气,p2 为前进方向,p 为逃跑之子. boo ...
- x01.os.10: 输入输出
从 x01.Lab.Download 中下载源代码,进入工程目录,make 后再 bochs,即可见到如下界面: 随便打几个字,ok!按 F2,可切换到第二个终端,界面如下: 当然,按 F3 还可切换 ...
- x01.Weiqi.8: 一点改进
原来的代码全部删除,进行了深层次重构,得其意而忘其言.得意之处有二: 1.关于显示 以 StoneSize 属性为依托,在 set 中加了一句:Width = Height = m_StoneSize ...
- x01.Weiqi.13: 鼎力推荐
鼎力推荐 : 点击后即可观看,小伙子讲的很有深度. 说到深度,自然离不了深度学习.AlphaGo 的横空出世,似乎很有学习的必要. MuGo: 点击下载后,发现是 python,自然免不了一番学习,好 ...
- Goldengate trial队列维护
查看进程信息: Info replicat_name $Info replicat_name showch 注: 可以查看到详细的关于checkpoint的信息,用于查看GoldenGate进程处 ...
- GoldenGate Lag For Huge Insert
前些天客户的ogg延迟到达8小时左右.于是我当时用logdump追踪了一下: 看进程状态: send extsa staus EXTRACT ZBDBA (PID 2269368) Current s ...
随机推荐
- git安装和初次使用
为了知道某人安装git,我也是重装啊. 1.下载git并安装 2.打开我的电脑,右键属性,选择高级设置,打开环境变量设置: 3.键盘输入窗口键+r,或者点击开始->运行 输入cmd 在新打开的命 ...
- Switch to strategy
namespace RefactoringLib.SwitchToStrategy.Before { public class ClientCode { public decimal Calculat ...
- 用CSS3动画特效实现弹窗效果
提示:如果大家觉得本篇实现的弹窗效果有用,可持续关注.接下会添加更多效果并且封装成插件,这样使用就方便了.效果查看: https://heavis.github.io/hidialog/index.h ...
- Android封装OkHttpClient的类库
由于android6.0的SDK没有HttpClient,只有HttpURLConnection和OkHttpClient,特记下OkHttpClient的使用方法 1.Ui测试界面布局 <?x ...
- Hibernate 更新部分字段的实现
在Hibernate 中,有时我们只需要更新部分字段,此时如果使用update()方法,会将所有字段都更新,对于没有set的字段,就会设置成NULL,如果这些字段里面有非空的字段就会报错. 解决的方法 ...
- oracle函数大全(转载)
F.1字符函数--返回字符值 这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据 ...
- Spring Boot中静态资源(JS, 图片)等应该放在什么位置
Spring Boot的静态资源,比如图片应该放在什么位置呢, 如果你放在传统WEB共的类似地方, 比如webapp或者WEB-INF下,你会得到一张示意文件未找到的破碎图片.那应该放哪里呢? 百度一 ...
- android视频播放器
RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学.网景和RealNetworks公司提交的 ...
- Lind.DDD.Events领域事件介绍
回到目录 闲话多说 领域事件大叔感觉是最不好讲的一篇文章,所以拖欠了很久,但最终还是在2015年年前(阴历)把这个知识点讲一下,事件这个东西早在C#1.0时代就有了,那时学起来也是一个费劲,什么是委托 ...
- SQL切换真假状态标识字段
需求:用一条SQL(SQL SERVER)语句,实现反向更改状态标识字段(类型为bit)的值.即是从true变false,或从false到true. 方案: 一.判断原来这个字段值,然后UPDATE为 ...