估计得不错,点目后,仅一个方法: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 }
因为涉及到比气问题,所以要调用两次。这又是多遍扫描的应有之意,相信已经见怪不怪了。
加点智能:
Pos Defend2() { var empties = RoundThreePoses(m_CurrentPos).Intersect(EmptyPoses).ToList(); int count = empties.Count; Dictionary<Pos,int> store = new Dictionary<Pos, int>(); int backCount = 0; for (int j = 0; j < 100; j++) { bool isFirst = false; Pos firstPos = m_InvalidPos; for (int i = 0; i < 10; i++) { int index = m_Rand.Next(0, 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=0; b <backCount; b++) { BackOne(); } backCount = 0; } int value = -1; Pos pos = m_InvalidPos; foreach (var pair in store) { if (value < pair.Value) { value = pair.Value; pos = pair.Key; } } return pos; }