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 ...
随机推荐
- 2.羽翼sqlmap学习笔记之MySQL注入
1.判断一个url是否存在注入点: .sqlmap.py -u "http://abcd****efg.asp?id=7" -dbs 假设找到数据库:student ------- ...
- 将Json数据转换为ADO.NET DataSet对象
Json数据转换为ADO.NET DataSet其实方法有很多,Newtonsoft.Json也提供了DataSet的Converter用以转换Json数据.但是有些情况下DataSet Conver ...
- 3.Code-First 约定(EF Code-First系列)
前面,我们已经了解了Code-First利用领域类,怎么为我们创建数据库的简单示例.现在我们来学习一下Code-First约定吧. 什么是约定 约定说白了,就是基于一套规矩办事,这里就是基于你定义好的 ...
- Oracle 英文 非标准格式 日期 格式化
最近在处理一张表的时候,需要按照日期排序,日期字段中日期的格式有两种. 格式一:07-Aug-2015 格式二:10/28/16 日期转化及格式化sql语句: select to_date('07-A ...
- 微软版的SqlHelper.cs类
一,微软SQLHelper.cs类 中文版: using System; using System.Data; using System.Xml; using System.Data.SqlClien ...
- 纯css3天气动画场景特效
CSS3超强大,以下是纯用CSS3+HTML实现的场景效果图: 查看效果:http://hovertree.com/h/bjaf/cssrotate.htm css3 3d展示中rotate()介绍与 ...
- jquery css事件编程 位置 操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 3、Python字符串和循环
1.while循环 #猜lucky_number = 6 #如果比6大,提示你猜的大了 #如果比6小,提示你猜的小了 #猜的等于6,提示Bingo #限制3次 lucky_num = 6 count ...
- 从零开始学Python第六周:面向对象基础(需修改)
标签(空格分隔): 面向对象 一,面向对象基础 (1)面向对象概述 面向过程:根据业务逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类 ...
- Zookeeper Api(java)入门与应用(转)
如何使用 Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储 ...