添加点目功能,虽不中,不远也。还是先看看截图吧。

x01.Weiqi.9: 点目功能-LMLPHP

确保其可行,再看一张:

x01.Weiqi.9: 点目功能-LMLPHP

其点目结果,还是比较令人满意的。这主要得益于多遍扫描,如编译器的词法分析阶段,下面的代码可以证明:

                private void InitMeshes()
{
UpdateMeshes1(); if (StepCount < ) return; UpdateMeshes2();
UpdateMeshes3();
UpdateMeshes4();
UpdateMeshes4(); // 二次扫描有必要
UpdateMeshes5();
UpdateMeshes6();
}

InitMeshes()

主要思路,也不过如此,实现的关键点,在于 UpdateMeshBlocks() 方法:

                 void UpdateMeshBlocks(List<Pos> poses, List<PosBlock> blocks)
{
List<Pos> copyPoses = poses.ToList();
if (copyPoses.Count == ) return; List<Pos> tmp = new List<Pos>();
foreach (var pos in copyPoses) {
if (tmp.Count == ) tmp.Add(pos);
var links = LinkPoses(pos);
if (tmp.Intersect(links).Count() > ) {
links.ForEach(l => {
if (copyPoses.Contains(l) && !tmp.Contains(l))
tmp.Add(l);
});
}
}
for (int i = ; i < ; i++) { // 确保不遗漏到疯狂程度
foreach (var pos in copyPoses) {
var links = LinkPoses(pos);
if (tmp.Intersect(links).Count() > ) {
links.ForEach(l => {
if (copyPoses.Contains(l) && !tmp.Contains(l))
tmp.Add(l);
});
}
}
} PosBlock block = new PosBlock();
block.Poses = tmp;
blocks.Add(block); copyPoses.RemoveAll(p => tmp.Contains(p));
UpdateMeshBlocks(copyPoses, blocks);
}

UpdaeMeshBlocks()

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

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

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

04-13 22:37