估计得不错,点目后,仅一个方法: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 == ) {
  17. poses.ForEach(p => {
  18. var links = LinkPoses(p);
  19. if (links.Intersect(poses).Count() == ) { // 梅花六
  20. var tmp = poses.Except(links).ToList();
  21. if (IsCusp(tmp[], p)) {
  22. block.IsDead = true;
  23. block.KeyPos = p;
  24. }
  25. }
  26. });
  27. } else if (poses.Count == ) {
  28. poses.ForEach(p => {
  29. var links = LinkPoses(p);
  30. if (links.Intersect(poses).Count() == ) { // 刀把五
  31. var tmp = poses.Except(links).ToList();
  32. if (IsCusp(tmp[], p)) {
  33. block.IsDead = true;
  34. block.KeyPos = p;
  35. }
  36. }
  37. });
  38. } else if (poses.Count == ) {
  39. poses.ForEach(p => {
  40. var links = LinkPoses(p);
  41. if (links.Intersect(poses).Count() == ) { // 斗笠四
  42. block.IsDead = true;
  43. block.KeyPos = p;
  44. } else if (links.Intersect(poses).Count() == // 盘角曲四
  45. && (p == new Pos(, ) || p == new Pos(, ) || p == new Pos(, ) || p == new Pos(, ))) {
  46. block.IsDead = true;
  47. }
  48. });
  49. } else if (poses.Count == ) {
  50. poses.ForEach(p => {
  51. var links = LinkPoses(p);
  52. if (links.Intersect(poses).Count() == ) { // 直三、曲三
  53. block.IsDead = true;
  54. block.KeyPos = p;
  55. }
  56. });
  57. } else if (poses.Count == ) {
  58. poses.ForEach(p => {
  59. var links = LinkPoses(p);
  60. if (links.Intersect(poses).Count() == ) {
  61. block.IsDead = true;
  62. }
  63. });
  64. } else if (poses.Count < ) {
  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 == ) {
  85. poses.ForEach(p => {
  86. var links = LinkPoses(p);
  87. if (links.Intersect(poses).Count() == ) { // 梅花六
  88. var tmp = poses.Except(links).ToList();
  89. if (IsCusp(tmp[], p)) {
  90. block.IsDead = true;
  91. block.KeyPos = p;
  92. }
  93. }
  94. });
  95. } else if (poses.Count == ) {
  96. poses.ForEach(p => {
  97. var links = LinkPoses(p);
  98. if (links.Intersect(poses).Count() == ) { // 刀把五
  99. var tmp = poses.Except(links).ToList();
  100. if (IsCusp(tmp[], p)) {
  101. block.IsDead = true;
  102. block.KeyPos = p;
  103. }
  104. }
  105. });
  106. } else if (poses.Count == ) {
  107. poses.ForEach(p => {
  108. var links = LinkPoses(p);
  109. if (links.Intersect(poses).Count() == ) { // 斗笠四
  110. block.IsDead = true;
  111. block.KeyPos = p;
  112. } else if (links.Intersect(poses).Count() == // 盘角曲四
  113. && (p == new Pos(, ) || p == new Pos(, ) || p == new Pos(, ) || p == new Pos(, ))) {
  114. block.IsDead = true;
  115. }
  116. });
  117. } else if (poses.Count == ) {
  118. poses.ForEach(p => {
  119. var links = LinkPoses(p);
  120. if (links.Intersect(poses).Count() == ) { // 直三、曲三
  121. block.IsDead = true;
  122. block.KeyPos = p;
  123. }
  124. });
  125. } else if (poses.Count == ) {
  126. poses.ForEach(p => {
  127. var links = LinkPoses(p);
  128. if (links.Intersect(poses).Count() == ) {
  129. block.IsDead = true;
  130. }
  131. });
  132. } else if (poses.Count < ) {
  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() > ) {
  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() > ) {
  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()

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

加点智能:

  1. Pos Defend2()
  2. {
  3. var empties = RoundThreePoses(m_CurrentPos).Intersect(EmptyPoses).ToList();
  4. int count = empties.Count;
  5. Dictionary<Pos,int> store = new Dictionary<Pos, int>();
  6. int backCount = ;
  7.  
  8. for (int j = ; j < ; j++) {
  9. bool isFirst = false;
  10. Pos firstPos = m_InvalidPos;
  11. for (int i = ; i < ; i++) {
  12. int index = m_Rand.Next(, count);
  13. Pos e = empties[index];
  14. if (!NextOne(e.Row, e.Col)) continue;
  15. if (!isFirst) {
  16. isFirst = true;
  17. firstPos = e;
  18. }
  19. backCount++;
  20. }
  21. UpdateMeshes1();
  22. store[firstPos] = m_BlackMeshes.Count - m_WhiteMeshes.Count;
  23. for (int b=; b <backCount; b++) {
  24. BackOne();
  25. }
  26. backCount = ;
  27. }
  28.  
  29. int value = -;
  30. Pos pos = m_InvalidPos;
  31. foreach (var pair in store) {
  32. if (value < pair.Value) {
  33. value = pair.Value;
  34. pos = pair.Key;
  35. }
  36. }
  37. return pos;
  38. }

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. C++作用域

    作用域通常和变量捆绑在一起,限定了变量可用范围,同时也规定了变量的生命周期:何时创建.何时销毁.作用域通常分为:全局作用域和局部作用域. 全局作用域(全局变量) 在所用函数体外部定义的变量就是全局变量 ...

  2. 重启SQL Server——总是好事?

    在实际工作中,我经常看到——有时人们定期重启SQL Server!我们都希望接受,SQL Server的定期重启并不真的是一个好主意.但在今天的文章里,我想进一步讨论下,当你定期重启你的SQL Ser ...

  3. 为.NET搭建Linux的开发环境,鄙视那些将简单事情复杂化的人

    写在前面的吐槽 原本跨平台开发很容易的事情, 很多人把它弄得很麻烦,给外人的感觉:你们.NET跨平台开发好不成熟,好麻烦哦. ..................................... ...

  4. ActiveX(二)Js 监听 ActiveX中的事件

    在上一篇随笔:ActiveX(一)第一个简单的Demo 中,已经可以实现 js 单向调用 ActiveX 中的方法,在很多情况下ActiveX中的方法的执行时相对耗时.耗性能的.在这样的情况下.Act ...

  5. 纯C#实现屏幕指定区域截屏

    以前在别的地方见过一个通过调用系统API实现屏幕截图的例子,从内心来说我不太喜欢在C#代码中出现这种情况,现在什么都讲“和谐”,我觉得这种做法就是破坏了我们的“和谐”代码,呵呵,开玩笑,有的时候,不通 ...

  6. httpHandlers与Http处理程序

    ASP.NET HTTP 处理程序是响应对 ASP.NET Web 应用程序的请求而运行的过程(通常称为"终结点").最常用的处理程序是处理 .aspx 文件的 ASP.NET 页 ...

  7. autocad2008+C#2008开发中设置自动加载dll

    一.复制编译后的dlll路径,比如我的是D:\zjy\cad开发\学习\宗地图\bin\Debug\zd.dll 二.随便找个地方新建一个记事本,在记事本中写入以下内容: (command " ...

  8. java条件语句练习题

    输入三个数字显示最大的: System.out.println("请输入三个数字:"); int a,b,c; Scanner d = new Scanner(System.in) ...

  9. PowerDesigner15在win7-64位系统下对MySQL 进行反向工程以及建立物理模型产生SQL语句步骤图文傻瓜式详解

    1.安装PowerDesigner15.MySQL5.不详细讲解了.网上一大把.请各位亲参考去. 2.安MyODBC-standard-3.51.0.7-win.msi.mysql-connector ...

  10. maven引入的jar带了时间戳

    正常情况下,我们引入的第三方jar一般都是类似spider-1.0.5-SNAPSHOT.jar的名称,但是有些环境下,我们引入的三方jar会带上了时间戳,如下所示: spider-1.0.5-201 ...