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 ...
随机推荐
- C++作用域
作用域通常和变量捆绑在一起,限定了变量可用范围,同时也规定了变量的生命周期:何时创建.何时销毁.作用域通常分为:全局作用域和局部作用域. 全局作用域(全局变量) 在所用函数体外部定义的变量就是全局变量 ...
- 重启SQL Server——总是好事?
在实际工作中,我经常看到——有时人们定期重启SQL Server!我们都希望接受,SQL Server的定期重启并不真的是一个好主意.但在今天的文章里,我想进一步讨论下,当你定期重启你的SQL Ser ...
- 为.NET搭建Linux的开发环境,鄙视那些将简单事情复杂化的人
写在前面的吐槽 原本跨平台开发很容易的事情, 很多人把它弄得很麻烦,给外人的感觉:你们.NET跨平台开发好不成熟,好麻烦哦. ..................................... ...
- ActiveX(二)Js 监听 ActiveX中的事件
在上一篇随笔:ActiveX(一)第一个简单的Demo 中,已经可以实现 js 单向调用 ActiveX 中的方法,在很多情况下ActiveX中的方法的执行时相对耗时.耗性能的.在这样的情况下.Act ...
- 纯C#实现屏幕指定区域截屏
以前在别的地方见过一个通过调用系统API实现屏幕截图的例子,从内心来说我不太喜欢在C#代码中出现这种情况,现在什么都讲“和谐”,我觉得这种做法就是破坏了我们的“和谐”代码,呵呵,开玩笑,有的时候,不通 ...
- httpHandlers与Http处理程序
ASP.NET HTTP 处理程序是响应对 ASP.NET Web 应用程序的请求而运行的过程(通常称为"终结点").最常用的处理程序是处理 .aspx 文件的 ASP.NET 页 ...
- autocad2008+C#2008开发中设置自动加载dll
一.复制编译后的dlll路径,比如我的是D:\zjy\cad开发\学习\宗地图\bin\Debug\zd.dll 二.随便找个地方新建一个记事本,在记事本中写入以下内容: (command " ...
- java条件语句练习题
输入三个数字显示最大的: System.out.println("请输入三个数字:"); int a,b,c; Scanner d = new Scanner(System.in) ...
- PowerDesigner15在win7-64位系统下对MySQL 进行反向工程以及建立物理模型产生SQL语句步骤图文傻瓜式详解
1.安装PowerDesigner15.MySQL5.不详细讲解了.网上一大把.请各位亲参考去. 2.安MyODBC-standard-3.51.0.7-win.msi.mysql-connector ...
- maven引入的jar带了时间戳
正常情况下,我们引入的第三方jar一般都是类似spider-1.0.5-SNAPSHOT.jar的名称,但是有些环境下,我们引入的三方jar会带上了时间戳,如下所示: spider-1.0.5-201 ...