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); // 二次扫描有必要
11             UpdateMeshes5();
12             UpdateMeshes6();
13         }
InitMeshes()

主要思路,也不过如此,实现的关键点,在于 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         }
UpdaeMeshBlocks()

这同 UpdateStepBlocks() 相同,只是为确保不遗漏,多了几遍而已。

整个程序都是建立在集合的基础上的,更新块成为关键,也就不足为奇了。

完整代码下载链接https://github.com/chinax01/x01.Weiqi

原文地址:https://www.cnblogs.com/china_x01/p/4524626.html