标签:
添加点目功能,虽不中,不远也。还是先看看截图吧。
确保其可行,再看一张:
其点目结果,还是比较令人满意的。这主要得益于多遍扫描,如编译器。如下代码可证:
1 private void InitMeshes() 2 { 3 UpdateMeshes1(); 4 5 if (StepCount < 120) return; 6 7 UpdateMeshes2(); 8 UpdateMeshes3(); 9 UpdateMeshes4(5); 10 UpdateMeshes4(8); // 二次扫描有必要 11 UpdateMeshes5(); 12 UpdateMeshes6(); 13 }
主要思路,也不过如此,实现的关键点,在于 UpdateMeshBlocks() 方法:
1 void UpdateMeshBlocks(List<Pos> poses, List<PosBlock> blocks) 2 { 3 List<Pos> copyPoses = poses.ToList(); 4 if (copyPoses.Count == 0) return; 5 6 List<Pos> tmp = new List<Pos>(); 7 foreach (var pos in copyPoses) { 8 if (tmp.Count == 0) tmp.Add(pos); 9 var links = LinkPoses(pos); 10 if (tmp.Intersect(links).Count() > 0) { 11 links.ForEach(l => { 12 if (copyPoses.Contains(l) && !tmp.Contains(l)) 13 tmp.Add(l); 14 }); 15 } 16 } 17 for (int i = 0; i < 4; i++) { // 确保不遗漏到疯狂程度 18 foreach (var pos in copyPoses) { 19 var links = LinkPoses(pos); 20 if (tmp.Intersect(links).Count() > 0) { 21 links.ForEach(l => { 22 if (copyPoses.Contains(l) && !tmp.Contains(l)) 23 tmp.Add(l); 24 }); 25 } 26 } 27 } 28 29 PosBlock block = new PosBlock(); 30 block.Poses = tmp; 31 blocks.Add(block); 32 33 copyPoses.RemoveAll(p => tmp.Contains(p)); 34 UpdateMeshBlocks(copyPoses, blocks); 35 }
这同 UpdateStepBlocks() 相同,只是为确保不遗漏,多了几遍而已。
整个程序都是建立在集合的基础上的,更新块成为关键,也就不足为奇了。
完整代码下载链接:https://github.com/chinax01/x01.Weiqi
标签:
原文地址:http://www.cnblogs.com/china_x01/p/4524626.html