人机博弈-吃子棋游戏(二)算气

2023-11-06

算法过程如下,输入计算棋气的起始子,检查我方棋子其周边的空白,并查看此空白是否已经计算过气了,如果没有计算过气加一,如果已经计算则略过,进而递归调用计算我方棋子上下左右子的气,最后算法会返回棋串的子数和气数。算法注释十分详尽。

这个计算棋子气的算法,参考http://www.cnblogs.com/tuanzang/archive/2013/02/27/2935861.html,结合我们自身的应用需要优化和修改。这篇博文介绍了更多关于围棋的算法,有兴趣的朋友可以进一步阅读。

原文suanqi函数会重复计算已经计算过的棋串效率不高,应该对已经算过气的函数不在重复算气,并且我们需要知道棋串的长度。


#include <iostream>
#include <utility>

#define EDGE 19
int go[EDGE][EDGE];//棋盘数据,0为黑棋,1为白棋,2为空白
int gokong[EDGE][EDGE]; //0=该空点未曾计算过气,1=已计算,避免重复计算公气
int gozi[EDGE][EDGE]; //0=该子未计算串气,1=已计算,避免重复计算同一个子的气
int goqi; //此棋串气数
int goziLength;//此棋串子数
int g_gozi[EDGE][EDGE];


 void str_qi(int x,int y,int hb)
  {
    //本函数计算 x,y 处的hb颜色棋子的气
    gozi[x][y]=1; //标记本子已经计算过气
    goziLength++;
    /右临子
    if (x+1<=19)//如果没有超出棋盘边线
    {
      if ((go[x+1][y]==2)&&(gokong[x+1][y]==0))
      //如果右临点为空并且该点未曾计算过气则
      {
        goqi++; //气数加一
        gokong[x+1][y]=1; //标记本空点已经计算过气
      }
      else if ((go[x+1][y]==hb)&&(gozi[x+1][y]==0))
      //否则如果右临点为和本子同色子并且该子未曾计算过气则
      str_qi(x+1,y,hb); //递归调用到右临子
    }
    /左临子
    if (x-1>=1) //果没有超出棋盘边线
    {
      if ((go[x-1][y]==2)&&(gokong[x-1][y]==0))
      //如果左临点为空并且该点未曾计算过气则
      {
        goqi++; //气数加一
        gokong[x-1][y]=1; //标记本空点已经计算过气
      }
      else if ((go[x-1][y]==hb)&&(gozi[x-1][y]==0))
      //否则如果左临点为和本子同色子并且该子未曾计算过气则
      str_qi(x-1,y,hb); //递归调用到左临子
    }
    下临子
    if (y-1>=1)//如果没有超出棋盘边线
    {
      if ((go[x][y-1]==2)&&(gokong[x][y-1]==0))
      //如果下临点为空并且该点未曾计算过气则
      {
        goqi++; //气数加一
        gokong[x][y-1]=1; //标记本空点已经计算过气
      }
      else if ((go[x][y-1]==hb)&&(gozi[x][y-1]==0))
      //否则如果下临子点为和本子同色子并且该子未曾计算过气则
      str_qi(x,y-1,hb); //递归调用到下临子
    }
    上临点
    if (y+1<=19)//如果没有超出棋盘边线
    {
      if ((go[x][y+1]==2)&&(gokong[x][y+1]==0))
      //如果上临点为空并且该点未曾计算过气则
      {
        goqi++; //气数加一
        gokong[x][y+1]=1; //标记本空点已经计算过气
      }
      else if ((go[x][y+1]==hb)&&(gozi[x][y+1]==0))
      //否则如果上临点为和本子同色子并且该子未曾计算过气则
      str_qi(x,y+1,hb); //递归调用到上临子
    }
  }

  std::pair<int,int> str_lib(int x,int y, int hb)
  {

    for (int i = 1; i <= 19; i++)
      for (int j = 1; j <= 19; j++)
      {
        gozi[i][j] = 0; //初始化变量,表示该子未计算串气
        gokong[i][j] = 0; //初始化变量,表示该空点未计算串气
      }
    goqi=0; //棋串气初值
    goziLength=0;//棋串初始子数
    str_qi(x,y,hb); //调用串气子程序
    for(int i=0;i<EDGE;i++)
     for(int j=0;j<EDGE;j++){
      if(gozi[i][j]==1)
      g_gozi[i][j]=1;
     }
    return std::make_pair<int,int>(goqi,goziLength);
  }

  void suanqi()
  {
    int qq;
    for (int i = 0; i <EDGE; i++)
      for (int j = 0; j <EDGE; j++)
      {
        go[i][j]=qipan[i][j].color;//初始化go数组
      }
    for (int i = 0; i <EDGE; i++)
      for (int j = 0; j <EDGE; j++)
      {
        if (go[i][j]!=2&&g_gozi[i][j]==0)//仅处理未计算过的棋串
        {

          qq=str_lib(i,j,go[i][j]).first;
          qipan[i][j].qs=qq;
        }
      }
  }

转载请标明出处,谢谢

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

人机博弈-吃子棋游戏(二)算气 的相关文章

随机推荐

  • Jina 实例秀 —— 智能聊天机器人

    Jina将开启一个全新的教程系列 实例秀 在这个系列中我们将进行Jina实际用例的教学 手把手教你把Jina用起来 在本教程中 你将创建一个基于文本到文本模型的聊天机器人 了解这个示例的每个部分是如何工作的 以及如何使用不同数据集来创建自己
  • 树莓派4B安装ROS的方法总结

    文章目录 准备 Raspberry Pi 安装ROS Ubuntu Mate安装ROS Ubuntu Server安装ROS Ubuntu Desktop安装ROS 总结 故障问题解决 sudo rosdep init rosdep upd
  • 配置acados时出现“Segmentation fault,Exception: Rendering of main.in.c failed!”报错

    问题描述 在安装acados后运行测试节点时出现错误 liangjunming XX program acados examples acados python getting started on git master o 11 49 1
  • 如何安装Chrome OS系统

    Chrome OS是由Google设计的基于Linux内核的操作系统 它源自免费软件Chromium OS 并使用Google Chrome网络浏览器作为其主要用户界面 因此 Chrome操作系统主要支持Web应用程序 谷歌于2009年7月
  • 【Linux】Shell脚本中获取命令运行的结果

    前言 写shell脚本的时候 常需要将一个命令的运行结果做为参数传递给另外一个命令 除了我们熟知的管道 和args 我们也可以通过获取命令的运行结果 1 通过反引号 command 来完成 result date echo result r
  • 象牙塔式的开发

    我向来不鼓励象牙塔式的开发模式 开发团队常年封闭在 高塔 之中 一门心思地做着魔法一样的软件 这些开发者根本不知道用户会怎样使用他们做出来的软件 你若问他们 最近一次面见用户是在什么时候 他们甚至可能都回答不上来 因为缺失强有力的证据 开发
  • HOOK框架——静态代理

    往期推荐 实战案列分析 Crakeme01 实战 AliCrackme 实战案列 AntiDebug self debugging反调试 需要相关资料的朋友 可以 加入此处即可打包获取 代理模式分为静态代理和动态代理 静态代理是编译阶段就生
  • C++学习日记1

    1 头文件 输入输出流 include
  • nanomsg(3): push/pull 模式

    推拉之间构建起数据的双向交互 值得注意的是 先推再拉 和先拉再推 并没有启动的先后顺序 pull cpp include
  • Linux搭建部署JDK1.7环境

    jdk下载 官网链接 https www oracle com java technologies javase javase7 archive downloads html jdk 7u80 oth JPR 打开linux系统的终端 在l
  • python题目58:工厂流水线调度

    一个工厂有m条流水线 来并行完成n个独立的作业 该工厂设置了一个调度系统 在安排作业时 总是优先执行处理时间最短的作业 现给定流水线个数m 需要完成的作业数n 每个作业的处理时间分别为 t1 t2 tn 请你编程计算处理完所有作业的耗时为多
  • Docker+NETCore系列文章(四、镜像commit操作)

    文章目录 镜像commit操作 一 Docker安装Tomcat 二 镜像commit操作 1 命令解析 2 实操 赞赏 镜像commit操作 一 Docker安装Tomcat 1 官方使用方法 用完容器就删除 docker run it
  • AD画PCB板子 基本步骤

    软件环境 Altium Designer13 汉化版 plus 大二上的电子工艺实习 第一次画pcb板子 在大佬的耐心指导下 反复倒腾这个软件 把步骤整理下 help其它新手 一 画原理图步骤 Schdoc文件 1 新建工程 点击左上角 2
  • Kettle入门(六)

    资源库 数据库资源库 数据库资源库是将作业和转换相关的信息存储在数据库中 执行的时候直接去数据库读取信息 便于跨平台使用 操作步骤 1 点击右上角 connect 选择 Other Resporitory 2 选择 Database Rep
  • dom影像图形成数字地形图_基于MapMatrix的数字正射影像图制作

    施卫东 周小扬 摘 要本论文基于武汉航天远景科技股份有限公司的新型数字摄影测量系统MapMatrix 结合武汉商学院三维数字校园生产实践进行1 2000数字正射影像图制作 探讨数字正射影像图 DOM 的制作方法 并说明了MapMatrix相
  • 关于md文件插入视频链接的方法。(亲测可用)

    md文件中插入了HTML5的代码 如下
  • 【计算机基础知识9】前端设计模式与常见类型

    目录 一 前言 二 设计模式的基本概念和原则 三 创建型设计模式 四 结构型设计模式 五 行为型设计模式 六 MVC和MVVM框架中的设计模式 七 实际应用案例分析 一 前言 在软件开发领域 设计模式是一种解决常见问题的最佳实践 它可以帮助
  • Sqlalchemy join连表查询

    摘要1 https blog csdn net weixin 33804582 article details 92471702 摘要2 https www cnblogs com juandx p 5442752 html 摘要3 htt
  • RFID服装管理系统改善零售供应链

    随着时尚零售业的竞争日益激烈 RFID技术正快速地改变着服装管理的方式 我们将探讨RFID服装管理系统的核心优点 以及如何在零售供应链中充分利用它 首先 让我们了解一下RFID技术是什么 RFID是一种无线通信技术 通过使用RFID标签和R
  • 人机博弈-吃子棋游戏(二)算气

    算法过程如下 输入计算棋气的起始子 检查我方棋子其周边的空白 并查看此空白是否已经计算过气了 如果没有计算过气加一 如果已经计算则略过 进而递归调用计算我方棋子上下左右子的气 最后算法会返回棋串的子数和气数 算法注释十分详尽 这个计算棋子气