吴昊品游戏核心算法 Round 10 —— 吴昊教你下围棋(利用递归来解决吃子的问题)...

2023-11-19

 

如图所示,此即为日本动漫棋魂中的千年佐为,也就是SAI。众所周知,围棋的规则相比于中国象棋,国际象棋等等都简单许多,真是因为更简单的规则,才诞生 了更复杂的逻辑。目前的围棋AI还很不行,最NB的应该是日本人做出的后又经过众多中国的围棋爱好者改进之后的AI——首谈,其水平号称是国际大师的水 平,其实际水平估计也就是业余一段左右(比我的水平还是要稍微高一点点的样子)。而且,只要在其中下出一些“非主流布局”,比如神马天元+五五啊,宇宙流 之类的,手谈基本上就GAME OVER了。

  目前在OJ(Online Judge)上还没有类似的围棋的全面模拟算法,局部的还是有,这是因为围棋的规则如果包括一些不常见的,比如盘角曲四啊,三劫循环等等,也是很难用计算 机模拟出的,而一些著名的围棋模拟软件(比如在线的TOM啊,弈城啊等等)又无法开源,在CSDN上和PUDN上又基本上是工程级别的项目,鲜有直接的核 心算法。多亏了一个叫荷蒲的网站,我看其作者应该也是围棋爱好者吧,他自己建立了一个网站,主要是在网上接一些项目,由于他本人喜欢围棋,故也创办了“荷 蒲围棋”,并向广大的围棋爱好者提供了关于模拟算法的一些思路。但是,关于三劫循环等等,还是没有列出来。

 

  这 一期的Round,我只给出一些主要的函数以及成员变量,函数与函数之间没有明显的先后关系,但是,每一个函数可以实现一些主要功能,在以后封装的时候也 很好解决。该思路一共分为六个部分,关于吃子的那个部分利用了递归的思想解决了对于“一片棋”的气眼的计算。在统计谁是获胜方时,不能单一地像黑白棋一样 来分别统计黑子和白子的数目,因为其中有些空缺的地方需要判断是黑方还是白方或者既不是黑方又不是白方的,这样描述起来还是有些麻烦。

  

    更多地关于该源码的解析(比如具体的数目问题)以及关于源码在其它功能的拓展和完善,我有待联系荷蒲的作者之后再予以补充。

 

   以下,我分为六大块来解析“荷蒲”先生的源码:

  


  1   // 1、首先定义围棋子信息
  2   
  3   #define EDGE 23         // 棋盘最大格数
  4   #define MAXMM 500    // 最大手数
  5   // color表示棋子颜色,x,y表示在棋盘上的坐标
  6    // num表示下子的顺序。=0表示提前摆放的子。
  7    // zt 表示棋子状态
  8    // qs 表示棋子的气数
  9    // sm 表示有说明信息
 10 
 11  typedef  struct qizi
 12  {
 13     int color,x,y,num,zt,qs,sm;
 14  }qizi;
 15 
 16    // 吴昊评述:这个用法比较不常见,意义是为这个实例化的结构体定义新的成员变量。
 17   qizi qipu[MAXMM];   // 棋谱信息
 18   qizi qipan[EDGE][EDGE];   // 棋盘信息
 19   
 20    // 2、紧接着要考虑的是下棋相关信息。
 21     // 吴昊评述:这里的定义比较复杂,作者考虑了人机对战以及非人机对战中的总共四种情况,并且有学习和联系模式,有围棋中需要的计时器,最后还在规则上考虑了中国规则,日本规则等等(中日韩三国的围棋规则有不同,比如在盘角曲四的处理上),但是,很多成员变量只是为了以后代码的扩充作准备的,在后面的代码 描述中并没有出现。
 22    int nk= 0;       // 显示棋子序号,nk=2显示序号,1=气数
 23    int BoardLines= 19;          // 棋盘线数,默认19
 24    bool ComputerPlaying;    // 1=该计算机下  0=人下
 25    bool Computerp1= 0;    // 1=计算机下黑  0=人下
 26    bool Computerp2= 0;    // 1=计算机下白  0=人下
 27    int PlayType= 0;     // 2=人-人,1=人-计算机,13=人-网络,0=没有开始,-1=删除棋盘上死子,-2=暂停,3=布黑子,4=布白子,9=演示,11=学习
 28    int PlayType1= 0;     // 2=人-人,1=人-计算机,13=人-网络,0=没有开始,-1=删除棋盘上死子,-2=暂停,3=布黑子,4=布白子,11=学习
 29    int MoveCount,MoveCount1;           // 计步器,记录落子手数,自然顺序
 30    int Playnum= 0,Playnum1= 0;   // 要标识的围棋手数,下棋顺序
 31    int CurrentX;            // 记录热子X坐标,
 32    int CurrentY;            // 记录热子Y坐标
 33    char CurrentWho;         // 记录当前棋子颜色,0=黑  1=白  2=空(终局等,待写)
 34    char CurrentWho1;  // 备份上一次CurrentWho
 35    int timew= 0,timeb= 0// 计时器设定数据
 36    int sdy1= 0,sdy2= 0// 学习功能上使用
 37    int gz;      // 规则0=中国规则,1=日本规则,2=应氏规则
 38    bool plays1= true;   // 学习持黑
 39    bool plays2= false;   // 学习持白
 40   
 41    // 3、围棋电子棋盘的数据初始化。
 42    // 数据初始化
 43   
 44   void wqinit( void)
 45  {
 46    BoardLines= 19;   // 19X19路标准围棋盘
 47     MoveCount= 0;     // 一步棋未下,自然顺序
 48     MoveCount1= 0;     // 一步棋未下
 49     ComputerPlaying= 1;     // 默认电脑执黑先行
 50     CurrentWho= 0;          // 默认黑先;  黑方=0;白方=1;空方=2;
 51     CurrentX= 0;            // 当前一步棋的X坐标,水平从左至右为1...19
 52     CurrentY= 0;            // 当前一步棋的Y坐标,垂直从上到下为1...19
 53     timew= 0,timeb= 0;
 54    Playnum= 0;   // 下棋顺序
 55     Playnum1= 0;
 56     // 下面是棋盘初始化
 57      for ( int i= 0;i<=BoardLines;i++)
 58       for ( int j= 0;j<=BoardLines;j++)
 59      {
 60        qipan[i][j].color= 2;
 61        qipan[i][j].x= 0;
 62        qipan[i][j].y= 0;
 63        qipan[i][j].num= 0;
 64        qipan[i][j].zt= 0;
 65      }
 66  
 67     // 清空棋谱记录,全部设为无效点。QiPu[0][x]留作它用
 68      for ( int i= 0;i< 500;i++)
 69    {
 70      qipu[i].color= 2;
 71      qipu[i].x= 0;
 72      qipu[i].y= 0;
 73      qipu[i].num= 0;
 74      qipu[i].zt= 0;
 75      qipu[i].sm= 0;     
 76      qpsm1[i].n= 0;
 77      qpsm1[i].t= 0;
 78      strcpy(qpsm1[i].sm, " / ");
 79    }
 80  }
 81  
 82   /*
 83        4、根据围棋规则编写的一些相关处理函数模块
 84       围棋棋子的吃子,是根据围棋棋子的气数来计算的。气数为0的棋子应当从棋盘上拿掉。
 85       围棋气数的计算问题,应当说是围棋软件的核心问题。
 86       "气"是指棋子在棋盘上可以连接的交叉点,也是棋子的出路。
 87       围棋的气数计算,要考虑一个围棋子的连通问题。  
 88       下面的图形中,交叉点的X代表棋子的气,
 89     */
 90 
 91 
 92 [图1]
 93 图1中右上角的黑子,有两个交叉点和它的直线相接,因此它有两口气。左上角的黑子有三口气,而下边的黑子有四口气。
 94  
 95 
 96  
 97            [图2]
 98 图2中右边的黑子有四口气,中间连接在一起的两个黑子有六口气,而右边连接在一起的三个黑子有八口气。连接在一起的棋子越多,气也越多。
 99  
100 
101 
102 [图3]
103 图2中同样是四个连接在一起的黑子,左边的四个黑棋有十口气,中间的黑棋只有九口气,而右边的黑棋仅有八口气。
104     从上面分析,可以得出,计算一个棋子的气,还有分析该棋子周围的情况,因此我们利用递归函数来解决围棋气数的计算。实现方法看下面程序断(这一点可以采用递归思想来解决)。 另外,注意下面三个函数是互相嵌套的关系,第二个函数利用第一个函数来递归地求出“一片棋”中的气的多少,第三个函数将第二个函数算出的气数存储在成员变量qs中,以便于最后的提子中调用。
105  
106   int go[EDGE][EDGE];
107  
108   /*
109     表示棋盘 其中第0路和第20路为沉余数据
110     在 (X,Y)下黑子
111     go[x][y]=0;// 0表示黑
112     在 (X,Y)下白子
113     go[x][y]=1;// 1表示白子
114     在 (X,Y)提子
115     go[x][y]=2; //2表示空子
116     当前棋步脱先pass则 当前棋步 X坐标=0,y=0
117     否则 1<=x<=19, 1<=x<=19,
118    */
119 
120   int gokong[EDGE][EDGE];  // 0=该空点未曾计算过气,1=已计算,避免重复计算公气
121    int gozi[EDGE][EDGE];  // 0=该子未计算串气,1=已计算,避免重复计算同一个子的气
122    int goqi;  // 气数
123    // 以上变量声明为全局变量
124   
125   void str_qi( int x, int y, int hb)
126  {
127     // 本函数计算 x,y 处的hb颜色棋子的气
128     gozi[x][y]= 1// 标记本子已经计算过气
129      /// //右临子
130      if (x+ 1<= 19) // 如果没有超出棋盘边线
131     {
132       if ((go[x+ 1][y]== 2)&&(gokong[x+ 1][y]== 0))
133       // 如果右临点为空并且该点未曾计算过气则
134       {  
135        goqi++;  // 气数加一
136         gokong[x+ 1][y]= 1// 标记本空点已经计算过气
137       }
138       else  if ((go[x+ 1][y]==hb)&&(gozi[x+ 1][y]== 0))
139       // 否则如果右临点为和本子同色子并且该子未曾计算过气则
140       str_qi(x+ 1,y,hb);  // 递归调用到右临子
141     }
142     /// //左临子
143      if (x- 1>= 1// 果没有超出棋盘边线
144     {
145       if ((go[x- 1][y]== 2)&&(gokong[x- 1][y]== 0))
146       // 如果左临点为空并且该点未曾计算过气则
147       {
148        goqi++;  // 气数加一
149         gokong[x- 1][y]= 1// 标记本空点已经计算过气
150       }
151       else  if ((go[x- 1][y]==hb)&&(gozi[x- 1][y]== 0))
152       // 否则如果左临点为和本子同色子并且该子未曾计算过气则
153       str_qi(x- 1,y,hb);  // 递归调用到左临子
154     }
155     /// /下临子
156      if (y- 1>= 1) // 如果没有超出棋盘边线
157     {
158       if ((go[x][y- 1]== 2)&&(gokong[x][y- 1]== 0))
159       // 如果下临点为空并且该点未曾计算过气则
160       {
161        goqi++;  // 气数加一
162         gokong[x][y- 1]= 1// 标记本空点已经计算过气
163       }  
164       else  if ((go[x][y- 1]==hb)&&(gozi[x][y- 1]== 0))
165       // 否则如果下临子点为和本子同色子并且该子未曾计算过气则
166       str_qi(x,y- 1,hb);  // 递归调用到下临子
167     }
168     /// /上临点
169      if (y+ 1<= 19) // 如果没有超出棋盘边线
170     {
171       if ((go[x][y+ 1]== 2)&&(gokong[x][y+ 1]== 0))
172       // 如果上临点为空并且该点未曾计算过气则
173       {  
174        goqi++;  // 气数加一
175         gokong[x][y+ 1]= 1// 标记本空点已经计算过气
176       }
177       else  if ((go[x][y+ 1]==hb)&&(gozi[x][y+ 1]== 0))
178       // 否则如果上临点为和本子同色子并且该子未曾计算过气则
179       str_qi(x,y+ 1,hb);  // 递归调用到上临子
180     }
181  }
182  
183   int str_lib( int x, int y,  int hb)
184  {
185     int i,j;
186     for (i =  1; i <=  19; i++)
187       for (j =  1; j <=  19; j++)
188      {
189        gozi[i][j] =  0// 初始化变量,表示该子未计算串气
190         gokong[i][j] =  0// 初始化变量,表示该空点未计算串气
191       }
192    goqi= 0// 串气初值
193     str_qi(x,y,hb);  // 调用串气子程序
194      return(goqi);  // 全局变量goqi带回串气值
195   }  
196  
197   void suanqi( void)
198  {
199     int i,j,cc,qq;
200     for (i =  1; i <= 19; i++)
201       for (j =  1; j <=  19; j++)
202      {
203        go[i][j]=qipan[i][j].color;  
204      }
205     for (i =  1; i <= 19; i++)
206       for (j =  1; j <= 19; j++)
207      {
208         if (go[i][j]!= 2)
209        {
210          cc=go[i][j];
211          qq=str_lib(i,j,cc);
212          qipan[i][j].qs=qq;
213        }
214      }
215  }
216  
217   /*
218         5、围棋的提子(吃子)
219        提子:就是把没有气的棋子从棋盘上拿掉。
220        下面函数实现提子功能。
221    */
222  
223   void chizi( void)
224  {
225     int i,j,qq,cc;
226    suanqi();
227     for (i =  1; i <= 19; i++)
228       for (j =  1; j <=  19; j++)
229      {
230        qq=qipan[i][j].qs;
231        cc=qipan[i][j].color;
232 
233         // 吴昊评述:这里,提子的同时需要满足(1)该子的气没有了(2)该子为对手的,记得国际象棋中有一个方法叫ByWho,这里同理,同时,我们没有必要当心被提掉的子会对将来正要被提掉的子构成威胁,因为,qq这个成员变量。
234          if (qq== 0 &&  cc!= 2 && cc!=CurrentWho)
235        {
236          qipan[i][j].color= 2;
237          qipan[i][j].x=i;
238          qipan[i][j].y=j;
239          qipan[i][j].num= 0;
240          qipan[i][j].zt= 0;
241        }
242      }
243  }
244  
245     // 围棋程序设计的核心,基本完成,下面是输赢的判断问题。
246      /*
247       6、围棋胜负判断
248       围棋盘上共有三百六十一个交叉点,一盘棋的胜负就是由对局双方所占据的交叉点的多少所决定的。更精确地说就是由双方活棋所占据的地域的大小来决定的。一个交叉点为一子,每方以一百八十又二分之一子为归本数,超过此数者为胜,不足此数者为负。
249       按我国现行的围棋规则规定,由于黑棋先走,有一定的先手威力,应由执黑的一方贴出2(3/4)子。所以黑所占的地域必须超过183(1/4)子(180 (1/2)+2(3/4))才能取胜。比如黑棋数出来有185个子,即黑棋1(3/4)子。而白方的地域只要超过177(3/4)子 (180(1/2)-2(3/4))即可获胜。
250    
251   
252       下面函数实现计算围棋的地域功能。在计算前,应当先去掉围棋中的死子。
253     */
254  
255   //  计算围棋的地域
256    int sum[ 3];  // sum[0]=黑子数量,sum[1]=白子数量
257 
258   int summ( void)
259  {
260     int i= 0,j= 0,c= 2,k= 2;
261     // 计数白子,黑子,空白的数目
262     sum[ 0]= 0;
263    sum[ 1]= 0;
264    sum[ 2]= 0;
265     for (i= 1;i<= 19;i++)
266    {
267 
268      // 从最外层开始搜索
269       k=qipan[i][ 1].color;
270       for (j= 1;j<= 19;j++)
271      {
272        c=qipan[j][i].color;
273         switch (c)
274        {
275           case  2:
276             if (k== 2) sum[ 2]++;
277             else sum[k]++;
278             break;
279           case  0:
280             if (k== 0)
281            {
282              sum[c]++;
283            }
284             else  if(k== 2)
285            {
286              sum[c]=sum[c]+sum[ 2]+ 1;
287              k=c;
288              sum[ 2]= 0;
289            }
290             else  if(k== 1)
291            {
292              sum[c]++;
293              k=c;
294              sum[ 2]= 0;
295            }
296             break;
297           case  1:
298             if (k== 1)
299            {
300              sum[c]++;
301            }
302             else  if(k== 2)
303            {
304              sum[c]=sum[c]+sum[ 2]+ 1;
305              k=c;
306              sum[ 2]= 0;
307            }
308             else  if(k== 0)
309            {
310              sum[c]++;
311              k=c;
312              sum[ 2]= 0;
313            }
314             break;
315        }
316      }
317    }
318     return sum[ 0];
319  }

 

 

 

转载于:https://www.cnblogs.com/tuanzang/archive/2013/02/27/2935861.html

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

吴昊品游戏核心算法 Round 10 —— 吴昊教你下围棋(利用递归来解决吃子的问题)... 的相关文章

  • 用python画星空源代码

    from turtle import from random import random randint screen Screen width height 800 600 screen setup width height screen
  • 每天都在谈SOA和微服务,但你真的理解什么是服务吗?

    近几年来 我一直从事着和面向服务相关的底层软件研发工作 逐渐的形成了一些自己的看法 其中我觉得比较重要的看法就是服务需要一个更准确细致的定义 简单来说 服务的本质就是行为 业务活动 的抽象 为了更好的阐述新服务的概念 并方便与传统的SOA中
  • 【c语言】Hanoi塔问题

    一块板上有三根针 A B C A 针上套有 64 个大小不等的圆盘 大的在下 小的在上 如图 5 4 所示 要把这 64 个圆盘从 A 针移动 C 针上 每次只能移动一个圆盘 移动可以借 助 B 针进行 但在任何时候 任何针上的圆盘都必须保
  • 本周总结——勇敢尝试和体验

    人间烟火 生活趣事 快开学了 这一周都在写项目 键盘前一段时间坏掉了 当时买了保险 3年之内只换不修的 挺奇葩的 寄过去13天都没搭理我 也没说给换货 前几天忍不住打电话问了问 下午就发货了 昨天下午就领到了 看来有些东西还是需要主动问一问
  • 搞懂后序遍历!只需要这一篇

    讲讲对于后序遍历的理解 并通过题目加深理解 文章目录 核心 基础实现方式 104 二叉树的最大深度 111 二叉树的最小深度 222 完全二叉树的节点个数 110 平衡二叉树 101 对称二叉树 总结 核心 后序遍历的顺序为左右中 在一棵二
  • 在Ubuntu上安装Android-SDK的方法

    一 安装和配置Ubuntu系统 1 安装Ubuntu Desktop 14 04 x86 64 2 启用root账户 Ubuntu 14 04默认是不允许root账户登录的 在登录窗口只能看到普通用户和访客登录 在shell中运行以下命令即
  • 优化游标性能

    最好的改进光标性能的技术就是 能避免时就避免使用游标 摘自 Transact SQL权威指南 Ken Henderson 著 最好的改进光标性能的技术就是 能避免时就避免使用游标 SQL Server是关系数据库 其处理数据集比处理单行好得
  • ROS学习笔记(7):Navigation 导航

    目录 8 Navigation 8 1 Navigation工作框架 8 2 move base 8 3 Costmap 8 4 map server 8 5 AMCL 定位 8 Navigation Navigation是机器人最基本的功
  • 小程序显示富文本内容(wxparse)

    1 引入wxParse 下载地址https github com icindy wxParse 2 全局配置 3 获取富文本内容的js 加入如下内容
  • 在电力系统无功不足的情况下,为什么不宜采用调整变压器分头的办法来提高电压?

    在电力系统无功不足的情况下 为什么不宜采用调整变压器分头的办法来提高电压 答 当某一地区的电压由于变压器分头的改变而升高的时候 该地区所需的无功功率也增大了 这就可能扩大系统的无功缺额 从而导致整个系统的电压水平更加下降 从全局来看 这样做
  • Redis VS Memcached压力测试报告

    一 测试背景与目标 了解Redis和memcached在高并发条件下的响应时间 吞吐量情况 以及对于服务器的压力情况 包括CPU IO 网络 考察目前的memcached存储timeline的方式的在高并发条件下的响应时间 吞吐量 负载情况
  • flink大数据处理流式计算详解

    flink大数据处理 文章目录 flink大数据处理 二 WebUI可视化界面 测试用 三 Flink部署 3 1 JobManager 3 2 TaskManager 3 3 并行度的调整配置 3 4 区分 TaskSolt和parall
  • 7、MySQL默认值(DEFAULT)

    默认值 Default 的完整称呼是 默认值约束 Default Constraint 用来指定某列的默认值 在表中插入一条新记录时 如果没有为某个字段赋值 系统就会自动为这个字段插入默认值 例如 员工信息表中 部门位置在北京的较多 那么部
  • ASPX页面传参中文乱码处理

    前端 function var msg 这是一段中文参数 window location href New aspx name escape msg 后台 string msg Server UrlDecode Request msg To
  • 【前端】批量导入和导出Excel数据

    1 准备 excel导入功能需要使用npm包xlsx 所以需要安装xlsx插件 读取和写入都依赖她 npm i xlsx 0 17 0 vue element admin模板提供了一个导入excel数据的文件 我们只需用即可 代码地址 ht
  • TypeError: ‘(slice(None, None, None), slice(None, None, None))‘ is an invalid key

    这种错误很常见 主要可能是我们操作的 df 是一个dataframe 应该正确的运用索引 loc或者iloc 例如 我遇到一次错误 factors data 其它因素 m n factors shape corrs np zeros n n
  • 深度系统linux deepin如何按装,安装深度Deepin 15.11操作系统的方法

    你可以使用VirtualBox 6虚拟机安装深度Deepin 15 11操作系统 也可以使用硬盘 光盘 USB等方式安装Deepin 15 11 电脑为huawei matebook 14 在配置VirtualBox 6后进行安装Deepi
  • 组件间样式覆盖问题--CSS Modules

    1 组件间样式覆盖问题 问题 CityList 组件的样式 会影响 Map 组件的样式 原因 在配置路由时 CityList 和 Map 组件都被导入到项目中 那么组件的样式也就被导入到项目中了 如果组件之间样式名称相同 那么一个组件中的样
  • 【Android】实现两个界面切换跳转(一个Activity,两个XML之间的来回切换)

    在安卓中最常见的就是按下按钮后跳转到另一个界面 关于界面的跳转有两种方法 方法1 两个Activity 两个XML文件之间使用Intent显示实现页面的跳转 详情可见 https blog csdn net yao yaoya articl
  • 接口自动化测试框架

    本文介绍一个接口自动化测试框架 Python unittest requests 实现结果 读取Excel接口测试用例并执行 输出测试报告 框架脑图 如图 各个模块及作用如上 处理数据库 db funcs用来处理数据库 实现数据库数据的读取

随机推荐

  • js中中括号,大括号使用详解

    http blog sina com cn s blog 5cd7f5b401019rsd html 一 大括号 表示定义一个对象 大部分情况下要有成对的属性和值 或是函数 如 var LangShen Name Langshen AGE
  • vue使用import()提示语法错误

    一 使用import 引入 组件 二 编译时提示语法检测错误 三 解决方法 第一种方式 直接安装 D YLKJPro CMWEB 03Implement CustomMapWeb gt npm install D babel plugin
  • 小白学协程笔记2-c语言实现协程-2021-2-10

    文章目录 前言 一 c语言中协程切换方式 二 使用setjmp 和 longjmp实现协程切换 1 setjmp和longjmp函数简介 2 协程实现 三 使用switch case实现协程切换 1 switch case小技巧 2 协程实
  • SQL题目练习---三表联查

    一 数据库中有三张如下所示的表 学生表 教师表 成绩表 查出橘右京老师的学生所有分数 按照成绩倒序排列 分析 1 本质是一个三表联查问题 SQL语句为 select from A inner join 表B on 表A 列1 表B 列2 i
  • 【小程序】封装弹出框+选择器组件:选择器选择

    效果 用的库 usingComponents van popup vant weapp popup index van cell vant weapp cell index van cell group vant weapp cell gr
  • 算法训练营第六天(7.17)

    目录 unordered map LeeCode242 Valid Anagram 梦的开始 LeeCode1 Two Sum unordered set LeeCode349 Intersection of Two Arrays LeeC
  • $state, $stateParams 传递参数?

    附图 state方法 go reload get state属性 current params state事件 stateChangeError stateChangeStart stateChangeSuccess stateNotFou
  • App\led\led.h(6): warning: #1295-D: Deprecated declaration LED_Init - give arg types

    如图所示操作即可 如图所示操作即可 如图所示操作即可
  • 【机器学习】十大算法之一 “朴素贝叶斯”

    作者主页 爱笑的男孩 的博客 CSDN博客 深度学习 活动 python领域博主爱笑的男孩 擅长深度学习 活动 python 等方面的知识 爱笑的男孩 关注算法 python 计算机视觉 图像处理 深度学习 pytorch 神经网络 ope
  • Ubuntu openKylin 安装open VMware tool 工具

    修改source添加 cat etc apt sources list deb http archive build openkylin top openkylin yangtze main cross pty deb http archi
  • Oracle19c配置OGG进行单用户数据同步测试

    目录 19c单实例配置GoldenGate 并进行用户数据同步测试 一 数据库操作 1 开启数据库附加日志 2 开启数据库归档模式 3 开启goldengate同步 4 创建goldengate管理用户 5 集成捕获所需权限授权 6 创建测
  • java判断指定路径文件夹是否存在,若不存在则创建新的文件夹,存在则删除

    isFile 判断是否 是文件 也许可能是文件或者目录 exists 判断是否存在 可能不存在 两个不一样的概念 isDirectory 是检查一个对象是否是文件夹 返回值是boolean类型的 如果是则返回true 否则返回false 调
  • DGA域名可以是色情网站域名

    恶意域名指传播蠕虫 病毒和特洛伊木马或是进行诈骗 色情内容传播等不法行为的网站域名 恶意域名指传播蠕虫 病毒和特洛伊木马或是进行诈骗 色情内容传播等不法行为的网站域名 本文面临能够的挑战 就是恶意网站经营者所使用的各种技术 近年来 FFSN
  • git lfs原理和使用

    如果我们用git管理的项目中出现了一些大文件 同时若其数量比较多 而且更新又比较频繁 那么当首次clone该项目时 就会不可避免地将这些大文件的当前版本和历史所有版本的文件都下载下来 虽然你很可能用不到这些历史文件 但是却不得不为它们所占用
  • 一般数据库服务器物理机配置,ironic部署物理机

    原标题 ironic部署物理机 ironic是openstack的帐篷项目之一 主要用来部署和管理裸机 提供统一接口 方便nova同时管理裸机和虚机 ironic的概念架构图如图1所示 本文以tecs3 0为例 介绍ironic部署裸机的流
  • border之border-style用法

    border style border style 属性用于设置元素所有边框的样式 或者单独地为各边设置边框样式 border style兼容性很好 基本所有浏览器都兼容 border style拥有一下属性值 值 描述 none 定义无边
  • 【RuoYi-Vue-Plus】问题笔记 02 - Knife4j

    文章目录 前言 问题一 文档页面空白 问题二 文档参数无法显示 问题原因 解决方案 前言 今天遇到一个很 sao 不 得 常 一 见 匹 的问题 所以必须要把这部血泪史记录一下 注 因为是开发中的项目 所以适当打码 不影响问题描述 首先描述
  • STM32入门——uKeil5 MDK 的使用(基于固件库)

    文章目录 1 Keil uVision5 MDK 是什么 2 建立一个标准库函数工程 2 1 前期准备 2 2 建立工程 2 3 建立组文件夹 2 4 添加文件 2 4 配置 魔术棒 选项卡 2 5 建立 main 函数 1 Keil uV
  • scala 学习笔记

    Scala Scala 和 java 关系 语言特点 Scala是一门以Java虚拟机 JVM 为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言 静态语言需要提前编译的如 Java c c 等 动态语言如 js Sc
  • 吴昊品游戏核心算法 Round 10 —— 吴昊教你下围棋(利用递归来解决吃子的问题)...

    如图所示 此即为日本动漫棋魂中的千年佐为 也就是SAI 众所周知 围棋的规则相比于中国象棋 国际象棋等等都简单许多 真是因为更简单的规则 才诞生 了更复杂的逻辑 目前的围棋AI还很不行 最NB的应该是日本人做出的后又经过众多中国的围棋爱好者