public void UpdateMeshWorths(Pos next, bool isBlack = true, List <Pos> blackPoses = null, List <Pos> whitePoses = null) { if (blackPoses == null) { blackPoses = BlackPoses.ToList(); } if (whitePoses == null) { whitePoses = WhitePoses.ToList(); } for (int i = 0; i < 19; i++) { for (int j = 0; j < 19; j++) { m_MeshWorths[i, j] = 0; } } foreach (var p in blackPoses) { SetMeshWorth(p, true); } foreach (var p in whitePoses) { SetMeshWorth(p, false); } if (EmptyPoses.Contains(next) && isBlack) { SetMeshWorth(next, true); } else if (EmptyPoses.Contains(next) && !isBlack) { SetMeshWorth(next, false); } m_BlackMeshes.Clear(); m_WhiteMeshes.Clear(); for (int i = 0; i < 19; i++) { for (int j = 0; j < 19; j++) { if (m_MeshWorths[i, j] > 0) { m_BlackMeshes.Add(new Pos(i, j)); } else if (m_MeshWorths[i, j] < 0) { m_WhiteMeshes.Add(new Pos(i, j)); } } } FillMeshEmpty(1); }
// Usage: // Up..(true); 涉及到比气 // Up..(false); 剔除死子 void UpdateMeshes_DeadLife(bool isFirst = true) // 死活 { m_DeadLifeKeyPoses.Clear(); 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 == 6) { poses.ForEach(p => { var links = LinkPoses(p); if (links.Intersect(poses).Count() == 5) // 梅花六 { var tmp = poses.Except(links).ToList(); if (IsCusp(tmp[0], p)) { block.IsDead = true; block.KeyPos = p; m_DeadLifeKeyPoses.Add(p); } } }); } else if (poses.Count == 5) { poses.ForEach(p => { var links = LinkPoses(p); if (links.Intersect(poses).Count() == 4) // 刀把五 { var tmp = poses.Except(links).ToList(); if (IsCusp(tmp[0], p)) { block.IsDead = true; block.KeyPos = p; m_DeadLifeKeyPoses.Add(p); } } }); } else if (poses.Count == 4) { poses.ForEach(p => { var links = LinkPoses(p); if (links.Intersect(poses).Count() == 4) // 斗笠四 { block.IsDead = true; block.KeyPos = p; m_DeadLifeKeyPoses.Add(p); } else if (links.Intersect(poses).Count() == 3 && // 盘角曲四 (p == new Pos(0, 0) || p == new Pos(0, 18) || p == new Pos(18, 0) || p == new Pos(18, 18))) { block.IsDead = true; if (StepCount > 150) // 劫尽棋亡 { foreach (var key in links) { if (key != p && LinkPoses(key).Intersect(poses).Count() == 3) { block.KeyPos = key; m_DeadLifeKeyPoses.Add(key); } } } } }); } else if (poses.Count == 3) { poses.ForEach(p => { var links = LinkPoses(p); if (links.Intersect(poses).Count() == 3) // 直三、曲三 { block.IsDead = true; block.KeyPos = p; m_DeadLifeKeyPoses.Add(p); } }); } else if (poses.Count == 2) { poses.ForEach(p => { var links = LinkPoses(p); if (links.Intersect(poses).Count() == 2) { block.IsDead = true; } }); } else if (poses.Count < 2) { 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 == 6) { poses.ForEach(p => { var links = LinkPoses(p); if (links.Intersect(poses).Count() == 5) // 梅花六 { var tmp = poses.Except(links).ToList(); if (IsCusp(tmp[0], p)) { block.IsDead = true; block.KeyPos = p; m_DeadLifeKeyPoses.Add(p); } } }); } else if (poses.Count == 5) { poses.ForEach(p => { var links = LinkPoses(p); if (links.Intersect(poses).Count() == 4) // 刀把五 { var tmp = poses.Except(links).ToList(); if (IsCusp(tmp[0], p)) { block.IsDead = true; block.KeyPos = p; m_DeadLifeKeyPoses.Add(p); } } }); } else if (poses.Count == 4) { poses.ForEach(p => { var links = LinkPoses(p); if (links.Intersect(poses).Count() == 4) // 斗笠四 { block.IsDead = true; block.KeyPos = p; m_DeadLifeKeyPoses.Add(p); } else if (links.Intersect(poses).Count() == 3 && // 盘角曲四 (p == new Pos(0, 0) || p == new Pos(0, 18) || p == new Pos(18, 0) || p == new Pos(18, 18))) { block.IsDead = true; if (StepCount > 150) { foreach (var key in links) { if (key != p && LinkPoses(key).Intersect(poses).Count() == 3) { block.KeyPos = key; m_DeadLifeKeyPoses.Add(key); } } } } }); } else if (poses.Count == 3) { poses.ForEach(p => { var links = LinkPoses(p); if (links.Intersect(poses).Count() == 3) // 直三、曲三 { block.IsDead = true; block.KeyPos = p; m_DeadLifeKeyPoses.Add(p); } }); } else if (poses.Count == 2) { poses.ForEach(p => { var links = LinkPoses(p); if (links.Intersect(poses).Count() == 2) { block.IsDead = true; } }); } else if (poses.Count < 2) { 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() > 0) { 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() > 0) { 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); } } } }); } } }); } }