x01.Weiqi.10: 死活问题

估计得不错,点目后,仅一个方法:UpdateMeshes5() 就完美解决了梅花六、刀把五、斗笠四、盘角曲四等死活问题。先来看看效果图:

其代码如下:

  1 void UpdateMeshes5(bool isFirst = true)
  2         {
  3             UpdateAllMeshBlocks();
  4
  5             m_BlackMeshBlocks.ForEach(block => {
  6                 var poses = block.Poses.ToList();
  7                 block.Poses.ForEach(p => {
  8                     if (BlackPoses.Contains(p))
  9                         poses.Remove(p);
 10                     LinkPoses(p).ForEach(l => {
 11                         if (m_WhiteMeshes.Contains(l))
 12                             poses.Remove(p);
 13                     });
 14                 });
 15
 16                 if (poses.Count == 6) {
 17                     poses.ForEach(p => {
 18                         var links = LinkPoses(p);
 19                         if (links.Intersect(poses).Count() == 5) {    // 梅花六
 20                             var tmp = poses.Except(links).ToList();
 21                             if (IsCusp(tmp[0], p)) {
 22                                 block.IsDead = true;
 23                                 block.KeyPos = p;
 24                             }
 25                         }
 26                     });
 27                 } else if (poses.Count == 5) {
 28                     poses.ForEach(p => {
 29                         var links = LinkPoses(p);
 30                         if (links.Intersect(poses).Count() == 4) {    // 刀把五
 31                             var tmp = poses.Except(links).ToList();
 32                             if (IsCusp(tmp[0], p)) {
 33                                 block.IsDead = true;
 34                                 block.KeyPos = p;
 35                             }
 36                         }
 37                     });
 38                 } else if (poses.Count == 4) {
 39                     poses.ForEach(p => {
 40                         var links = LinkPoses(p);
 41                         if (links.Intersect(poses).Count() == 4) {    // 斗笠四
 42                             block.IsDead = true;
 43                             block.KeyPos = p;
 44                         } else if (links.Intersect(poses).Count() == 3    // 盘角曲四
 45                             && (p == new Pos(0, 0) || p == new Pos(0, 18) || p == new Pos(18, 0) || p == new Pos(18, 18))) {
 46                             block.IsDead = true;
 47                         }
 48                     });
 49                 } else if (poses.Count == 3) {
 50                     poses.ForEach(p => {
 51                         var links = LinkPoses(p);
 52                         if (links.Intersect(poses).Count() == 3) {    // 直三、曲三
 53                             block.IsDead = true;
 54                             block.KeyPos = p;
 55                         }
 56                     });
 57                 } else if (poses.Count == 2) {
 58                     poses.ForEach(p => {
 59                         var links = LinkPoses(p);
 60                         if (links.Intersect(poses).Count() == 2) {
 61                             block.IsDead = true;
 62                         }
 63                     });
 64                 } else if (poses.Count < 2) {
 65                     block.IsDead = true;
 66                 }
 67
 68                 if (!isFirst && block.IsDead) {
 69                     m_BlackMeshes.RemoveAll(b => block.Poses.Contains(b));
 70                     m_WhiteMeshes.AddRange(block.Poses);
 71                 }
 72             });
 73
 74             m_WhiteMeshBlocks.ForEach(block => {
 75                 var poses = block.Poses.ToList();
 76                 block.Poses.ForEach(p => {
 77                     if (WhitePoses.Contains(p))
 78                         poses.Remove(p);
 79                     LinkPoses(p).ForEach(l => {
 80                         if (m_BlackMeshes.Contains(l))
 81                             poses.Remove(p);
 82                     });
 83                 });
 84                 if (poses.Count == 6) {
 85                     poses.ForEach(p => {
 86                         var links = LinkPoses(p);
 87                         if (links.Intersect(poses).Count() == 5) {    // 梅花六
 88                             var tmp = poses.Except(links).ToList();
 89                             if (IsCusp(tmp[0], p)) {
 90                                 block.IsDead = true;
 91                                 block.KeyPos = p;
 92                             }
 93                         }
 94                     });
 95                 } else if (poses.Count == 5) {
 96                     poses.ForEach(p => {
 97                         var links = LinkPoses(p);
 98                         if (links.Intersect(poses).Count() == 4) {    // 刀把五
 99                             var tmp = poses.Except(links).ToList();
100                             if (IsCusp(tmp[0], p)) {
101                                 block.IsDead = true;
102                                 block.KeyPos = p;
103                             }
104                         }
105                     });
106                 } else if (poses.Count == 4) {
107                     poses.ForEach(p => {
108                         var links = LinkPoses(p);
109                         if (links.Intersect(poses).Count() == 4) {    // 斗笠四
110                             block.IsDead = true;
111                             block.KeyPos = p;
112                         } else if (links.Intersect(poses).Count() == 3    // 盘角曲四
113                             && (p == new Pos(0, 0) || p == new Pos(0, 18) || p == new Pos(18, 0) || p == new Pos(18, 18))) {
114                             block.IsDead = true;
115                         }
116                     });
117                 } else if (poses.Count == 3) {
118                     poses.ForEach(p => {
119                         var links = LinkPoses(p);
120                         if (links.Intersect(poses).Count() == 3) {    // 直三、曲三
121                             block.IsDead = true;
122                             block.KeyPos = p;
123                         }
124                     });
125                 } else if (poses.Count == 2) {
126                     poses.ForEach(p => {
127                         var links = LinkPoses(p);
128                         if (links.Intersect(poses).Count() == 2) {
129                             block.IsDead = true;
130                         }
131                     });
132                 } else if (poses.Count < 2) {
133                     block.IsDead = true;
134                 }
135
136                 if (!isFirst && block.IsDead) {
137                     m_WhiteMeshes.RemoveAll(b => block.Poses.Contains(b));
138                     m_BlackMeshes.AddRange(block.Poses);
139                 }
140             });
141
142             if (isFirst) {
143                 m_BlackMeshBlocks.ForEach(block => {
144                     if (block.IsDead) {
145                         foreach (var pos in block.Poses) {
146                             var links = LinkPoses(pos);
147                             m_WhiteMeshBlocks.ForEach(w_block => {
148                                 if (links.Intersect(w_block.Poses).Count() > 0) {
149                                     if (w_block.IsDead) {
150                                         BlackPosBlocks.ForEach(bp_block => {
151                                             if (bp_block.Poses.Contains(pos)) {
152                                                 block.EmptyCount = bp_block.EmptyCount;
153                                             }
154                                             WhitePosBlocks.ForEach(wp_block => {
155                                                 if (wp_block.Poses.Intersect(w_block.Poses).Count() > 0) {
156                                                     w_block.EmptyCount = wp_block.EmptyCount;
157                                                 }
158                                             });
159                                         });
160                                         if (block.EmptyCount > w_block.EmptyCount) {
161                                             m_WhiteMeshes.RemoveAll(w => w_block.Poses.Contains(w));
162                                             m_BlackMeshes.AddRange(w_block.Poses);
163                                         } else if (block.EmptyCount < w_block.EmptyCount) {
164                                             m_BlackMeshes.RemoveAll(b => block.Poses.Contains(b));
165                                             m_WhiteMeshes.AddRange(block.Poses);
166                                         }
167                                     }
168                                 }
169                             });
170                         }
171                     }
172                 });
173             }
174
175             UpdateMeshColors();
176         }

UpdateMeshes5()

因为涉及到比气问题,所以要调用两次。这又是多遍扫描的应有之意,相信已经见怪不怪了。

最新代码下载链接https://github.com/chinax01/x01.Weiqi

时间: 2024-08-09 16:11:13

x01.Weiqi.10: 死活问题的相关文章

x01.Weiqi.12: 定式布局

定式 下一步当将定式保存到数据库中,如布局中的代码所示,但其初始的代码更有利于理解.以小飞挂为例: // 0 // + 0 0 // + // // + List<Pos> P_LuStar_UpFlyOne { get { var temp = new List<Pos>(); temp.Add(new Pos(3, 3)); // 第一步:左上星 temp.Add(new Pos(2, 5)); // 第二步:小飞挂 temp.Add(new Pos(5, 2)); // 第三

x01.Weiqi.7: 调整重绘

GitHub 谁方便谁拍,谁重要拍谁.在这个砖头满天飞的时代,一个好的生态显得尤为重要.  红颜小头发,要的很简单. 也许成绝唱,只因鱼心火. 姚贝福娃的离去,除感叹人生无常外,活着做点有意义的事情,同样显得尤为重要. 数年前为学习人工智能,写了围棋程序,却发现其难度超出了我的想象.特将其放到 GitHub 上,希望有人斧正.注意,是斧正,而非小修小改. 调整重绘 窗口大小改变时,棋盘也要作相应的重绘.这个比较简单,我的方法是把 BoardBase 类中的 m_sbSteps 字段改成 publ

x01.Weiqi.9: 点目功能

添加点目功能,虽不中,不远也.还是先看看截图吧. 确保其可行,再看一张: 其点目结果,还是比较令人满意的.这主要得益于多遍扫描,如编译器.如下代码可证: 1 private void InitMeshes() 2 { 3 UpdateMeshes1(); 4 5 if (StepCount < 120) return; 6 7 UpdateMeshes2(); 8 UpdateMeshes3(); 9 UpdateMeshes4(5); 10 UpdateMeshes4(8); // 二次扫描有

x01.os.10: 输入输出

从 x01.Lab.Download 中下载源代码,进入工程目录,make 后再 bochs,即可见到如下界面: 随便打几个字,ok!按 F2,可切换到第二个终端,界面如下: 当然,按 F3 还可切换第三个终端,但同第二个基本一样,就不再浪费空间了. 输入输出,涉及到键盘和显示器.键盘,主要是操作 8048 编码器,8042 控制器.显示器,则是操作 VGA 系统的寄存器.方方面面,非一人之力,非一时之功,是一个逐渐完善积累的过程.于渊讲解详细精当,只是切换 tty 时,他的是 Alt + F1

x01.Weiqi.11: 神来之笔

在围棋中,一子两用,可谓妙手,而一子三用,则可称之为神来之笔.在解决征子问题时,一不小心,也来了个神来之笔,其代码如下: // 征子判断,p1, p2 为气,p2 为前进方向,p 为逃跑之子. bool CanLevy(Pos p1, Pos p2, Pos p, bool isBlack = true) { if (!IsCusp(p1, p2)) return true; if (p == m_InvalidPos) return true; List<Pos> selfPoses = i

x01.Weiqi.8: 一点改进

原来的代码全部删除,进行了深层次重构,得其意而忘其言.得意之处有二: 1.关于显示 以 StoneSize 属性为依托,在 set 中加了一句:Width = Height = m_StoneSize * 19:以此来控制棋盘大小.所有的对象在 Init() 方法中创建,而具体的渲染在 Redraw() 方法中完成.这种创建与重绘相分开的办法,使调整大小时进行重绘更简单易行.这两个方法的代码如下: 1 void Init() 2 { 3 // 线 4 for (int i = 0; i < 19

x01.Weiqi.13: 鼎力推荐

鼎力推荐 : 点击后即可观看,小伙子讲的很有深度. 说到深度,自然离不了深度学习.AlphaGo 的横空出世,似乎很有学习的必要. MuGo: 点击下载后,发现是 python,自然免不了一番学习,好在不求深入,倒也花不了多少时间. 运行步骤如下: 1. ubuntu 中 python3 已安装,所以只需安装 pip3 即可: sudo  apt  install python3-pip 2. 安装 tensorflow: sudo pip3 install tensorflow 我安装时,似乎

GoldenGate Lag For Huge Insert

前些天客户的ogg延迟到达8小时左右,于是我当时用logdump追踪了一下: 看进程状态: send extsa staus EXTRACT ZBDBA (PID 2269368) Current status: Recovery complete: Processing data with empty data queue Current read positions: Redo thread #: 1 Sequence #: 36694 RBA: 35831764 Timestamp: 20

百度粉红色风科技上来看积分

http://www.ebay.com/cln/508gua_gvqjq/-/167266747010/2015.02.10 http://www.ebay.com/cln/jhu2290/-/167423283013/2015.02.10 http://www.ebay.com/cln/cha.m22/-/167166250017/2015.02.10 http://www.ebay.com/cln/fenyu56/-/167382503016/2015.02.10 http://www.eb