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,堪称完美!

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

时间: 2024-11-07 18:38:33

x01.Weiqi.11: 神来之笔的相关文章

x01.Weiqi.7: 调整重绘

GitHub 谁方便谁拍,谁重要拍谁.在这个砖头满天飞的时代,一个好的生态显得尤为重要.  红颜小头发,要的很简单. 也许成绝唱,只因鱼心火. 姚贝福娃的离去,除感叹人生无常外,活着做点有意义的事情,同样显得尤为重要. 数年前为学习人工智能,写了围棋程序,却发现其难度超出了我的想象.特将其放到 GitHub 上,希望有人斧正.注意,是斧正,而非小修小改. 调整重绘 窗口大小改变时,棋盘也要作相应的重绘.这个比较简单,我的方法是把 BoardBase 类中的 m_sbSteps 字段改成 publ

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); // 二次扫描有

x01.Weiqi.10: 死活问题

估计得不错,点目后,仅一个方法:UpdateMeshes5() 就完美解决了梅花六.刀把五.斗笠四.盘角曲四等死活问题.先来看看效果图: 其代码如下: 1 void UpdateMeshes5(bool isFirst = true) 2 { 3 UpdateAllMeshBlocks(); 4 5 m_BlackMeshBlocks.ForEach(block => { 6 var poses = block.Poses.ToList(); 7 block.Poses.ForEach(p =>

x01.Weiqi.12: 定式布局

定式 下一步当将定式保存到数据库中,如布局中的代码所示,但其初始的代码更有利于理解.以小飞挂为例: // 0 // + 0 0 // + // // + List<Pos> P_LuStar_UpFlyOne { get { var temp = new List<Pos>(); temp.Add(new Pos(3, 3)); // 第一步:左上星 temp.Add(new Pos(2, 5)); // 第二步:小飞挂 temp.Add(new Pos(5, 2)); // 第三

x01.os.11: IPC 路线图

学习的最好方法就是看代码,所以我们不妨跟着 IPC 的调用路线图,来学习学习 IPC. 从 x01.Lab.Download 下载代码后,首先进入 main.c 文件,在 TestA 中,有这么一句:Print("<Ticks:%x>", GetTicksIPC()); 其中,GetTicksIPC 就是通过 IPC 获取时间 tick 数.进入 GetTicksIPC,会看到如下代码: 1 m.type = M_GetTicks; 2 _SendReceive(M_Bot

x01.Weiqi.8: 一点改进

原来的代码全部删除,进行了深层次重构,得其意而忘其言.得意之处有二: 1.关于显示 以 StoneSize 属性为依托,在 set 中加了一句:Width = Height = m_StoneSize * 19:以此来控制棋盘大小.所有的对象在 Init() 方法中创建,而具体的渲染在 Redraw() 方法中完成.这种创建与重绘相分开的办法,使调整大小时进行重绘更简单易行.这两个方法的代码如下: 1 void Init() 2 { 3 // 线 4 for (int i = 0; i < 19

x01.Weiqi.13: 鼎力推荐

鼎力推荐 : 点击后即可观看,小伙子讲的很有深度. 说到深度,自然离不了深度学习.AlphaGo 的横空出世,似乎很有学习的必要. MuGo: 点击下载后,发现是 python,自然免不了一番学习,好在不求深入,倒也花不了多少时间. 运行步骤如下: 1. ubuntu 中 python3 已安装,所以只需安装 pip3 即可: sudo  apt  install python3-pip 2. 安装 tensorflow: sudo pip3 install tensorflow 我安装时,似乎

Python:内置函数

1.abs() 取数字的绝对值,参数可以是整数或浮点数.如果参数是一个复数,则返回其大小 >>> print(abs(-28))28>>> print(abs(-2.34))2.34>>> print(abs(1/3))0.3333333333333333 2.dict() 用于创建字典 >>> dict() #创建空字典{}>>> dict(a='who',b='while',c='whit') #传入关键字创建字

百度回复将按时缴费卡水立方

http://www.ebay.com/cln/ch.y908/-/176925541016/2015.02.11 http://www.ebay.com/cln/shaamjson/-/176833416018/2015.02.11 http://www.ebay.com/cln/x_ru421/-/176666486019/2015.02.11 http://www.ebay.com/cln/hua6592_18usz/-/176835881012/2015.02.11 http://www