你的位置:首页 > ASP.net教程

[ASP.net教程]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