首页 > 学院 > 开发设计 > 正文

x01.Weiqi.11: 神来之笔

2019-11-17 02:20:37
字体:
来源:转载
供稿:网友

x01.Weiqi.11: 神来之笔

在围棋中,一子两用,可谓妙手,而一子三用,则可称之为神来之笔。在解决征子问题时,一不小心,也来了个神来之笔,其代码如下:

        // 征子判断,p1, p2 为气,p2 为前进方向,p 为逃跑之子。        bool CanLevy(Pos p1, Pos p2, Pos p, bool isBlack = true)        {            if (!IsCusp(p1, p2)) return true;            if (p == m_InvalidPos) return true;            List<Pos> selfPoses = isBlack ? BlackPoses : WhitePoses;            List<Pos> otherPoses = !isBlack ? BlackPoses : WhitePoses;            // 征而被叫,岂不大笑?            var p1_links = LinkPoses(p1).Intersect(otherPoses).ToList();            if (p1_links.Count == 1 && p1_links.Intersect(EmptyPoses).Count() == 2)                return false;            var p2_links = LinkPoses(p2).Intersect(otherPoses).ToList();            if (p2_links.Count == 1 && p2_links.Intersect(EmptyPoses).Count() == 2)                return false;            int count = 0;            while (true) {                if (!InRange(p2.Row, p2.Col))                    break;                bool isRow = p2.Row - p.Row == 0 ? true : false;                int rowOffset = isRow ? (count == 0 ? p1.Row - p2.Row : p2.Row - p1.Row) : 0;                int colOffset = isRow ? 0 : (count ==  0 ? p1.Col - p2.Col :p2.Col - p1.Col);                Pos pos = new Pos(p2.Row + rowOffset, p2.Col + colOffset);                var rounds = count < 5 ? LinkPoses(pos) : RoundTwoPoses(pos);                foreach (var r in rounds) {                    if (isBlack && count < 2) continue; // 黑需先走两步                    if (selfPoses.Contains(r))                        return false;                    if (otherPoses.Contains(r)) {                        return true;                    }                }                count++;                p1 = p;                p = p2;                p2 = pos;            }            return true;        }

其中,count 变量,分别控制符号转换(count == 0),排除旧有(count < 5),黑棋预走(count < 2) 三种情况,并且三种情况皆不可少。

现在可以看看效果图了:

当 白10 征子时,不可逃,电脑选择了 黑11,而 白12 时,可以逃了,电脑就聪明的选择了 黑13,堪称完美!

完整代码下载,可参看上一篇博客。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表