五子棋AI智能算法的测试方法

news2024/10/5 14:26:51

先前发了几篇五子棋游戏程序设计的博文,设计了游戏程序,也设计了AI智能奕棋的算法,运行程序检测算法的可行性,完成人机模式游戏功能的设置。本文重点介绍测试方法。

对于人机对战的电脑智能应子算法,参阅很多五子棋书籍棋谱和五子棋竞赛的对抗棋谱。我感到白棋的后手防御算法很难取胜,棋界有黑棋高手先手必胜一说。算法么想了很多,既然是人工智能下棋就得按人的思路来算计。棋书阐述有许多思路和棋局解说。如活四冲四,嵌五,活三嵌四,活二嵌二。这些是高级棋手的总结。我就按此思路用加权计权方法来表现此类各种情况。


我对算法的思路是:黑棋的进攻点就是白棋的防守点,反之,白棋的进攻点就是黑棋的防守点。我采用一次遍历棋盘各点位的方法,凡有黑子和白子就判断其四周的空白点,即可下子位,评估棋势加权计分。棋势就是单子、活二嵌二、活三嵌三嵌四、活四冲四嵌五。各个棋势的交点就叠加计分,高分点就是双方博弈的必争点。算法的要点是:独子成二是起点,连二到连三是重点,关键的要点是三连子到四连五连。这这三点就分出权重的棋势。活三02220两边的点位是,先手是绝杀点,后手是防守逢三必堵。眠三122200棋势,空位下子成冲四,这是抢先手来改势扩势来进攻。若抓到冲四加活三叠加进攻点,权分叠加计权,就能绝杀对方。我的算法思路就这样。算法想白棋后手取胜,就在白棋的棋势上加小分,这样利于白棋在同等情况下能争得先手,反战进攻取胜。想法很简单,写算法也不难,而对于棋势的加权分的估量较难。

图例: 49a6b140fb38479cbcd3fc24ca2dbe25.png 

人机模式例:人执黑,AI 执白,无禁手则黑棋可胜,有禁手就AI胜。

五子棋博弈要算杀,算杀就是计算必杀之局。必杀局有双活三,双冲四,冲四加活三,嵌五加活三,嵌五加冲四,这些必杀局就是必胜法宝。此算法的要点就是如何加权必杀局棋势的加权分。文后附源码中的testAIq( ),算法至要可见一斑,自己体会一下。
算杀的最高境界是做杀,预判算出必杀点提前几子做出必杀局。此谓奕道高手中的高手,乃高高手也。此种算法也就是编程界的高手,是谓大咖也。我望之有些高仰,自感境界还没到。叠加计权计分有趋向于此类。还要努力,锲而不舍,持之以恒。

f00ac99c862c46d3863fd8d6bf7655ed.png

7fdf5be62c86445b8909389eb3f6a702.png 

另外在设计上加了算法的测试方法。用来检测和改进算法。


测试算法的方法:
一是:程序运行时在黑白落子周边的空位(即可下子位)显示加权计算的分值,查看加权计分情况。最高分点位画出黄色标记点,即AI选取的下子位。
在双人模式时可以直观的看到AI加权计算的分值,以及选取下子位的过程。
在人机模式时由玩家人下黑子检测白棋的防守和进攻情况 。依据此优化和改进算法。

二是:设置自动演示功能autotest(),不需手动模拟对奕过程,连续点击《演示》按钮逐步显示黑白双方由机器选位下子过程。这就是对战演示功能。
增加26个开局定式对战演示。用以观察加权计分的设置情况,以此来测试和改进算法。也可以每步根据AI计权黄点黑白双方落子位来下子,这样可慢慢地观察加权计分情况。当然在演示功能时可介入手动操作下子,这是方法的灵活应用。

五子棋程序设置双人对奕,人机模式,对战演示三种模式。设置悔棋,记录功能,有禁手设置。另有复盘功能设置。

 AI智能奕棋的算法testAIq( ),主要是检测算法,测试算法的可行性。程序设置的对战演示就是为了测试算法,此为研究五子棋算法提供一些参考。


此算法加权偏重于白棋,主要是研究如何对付”黑先必胜”。研究白棋抢先手,拦堵黑棋,反转取胜。

839e9a2b807d4a42b6ef6e009b6e9661.png

b339e4283417487299f2ba8bd03dc89d.png 

21132f27ae964e15af94811fe91ea638.png 

d5929d16d09443998949ddde61e10d60.png 

00bd8a18d44d468ab8873cc353b95e36.png  

测试了好几个局的例子,白棋的攻防还是可以的。然而如
(例11 例12 例13例15 例16等),
黑棋还是蛮厉害的,如白棋挡不住,就还是黑棋胜。

 

c064b918e2a645a182a248aa86cf057d.png

3624af1d48514b398f2890a646de7df5.png 

129252172f274630bdef4b22982dcce8.png  

例4花月局,例7金星局,例8松月局
白棋防守封堵都很漂亮,抢先手反攻取胜,可供参考研究。

 

19fb3c937ba94ee8907f8c040b806f56.png 

例24斜月局,黑棋进攻力度不够,黑21手F8和23手J12失误而失先手,白棋反败为胜。

 

我测试了26定式局和人机对战的好多局,本文仅例出了一部分。感兴趣的朋友可自己来玩下。此游戏程序可成为喜欢五子棋游戏的练手程序。

连续点击《演示》按钮逐步演示对战:

autotest (){
  //用于检测AI智能下子算法 testAIq ()
  //黑白棋用同一个算法下子很难区分算法的优劣,
  //要设计二种算法分别以黑棋VS白棋才能显示出
  //算法的优劣。下面代码只可检测算法的可行性。
      s7="游戏模式:对战演示"; 
  if (isDo==0||dn>75) {
          ss9="( 演示 ) ";   print ss9; 
          cs.DrawText (ss9,655,(dn+2)*16);        
          isDo=0 ;  return ;    }  //结束标志,测试75子   
   if (mode==1) return ; //双人模式可演示
   if (dn==0) {   //设定首子黑先天元位
         n=113;  wn=0 ;  black_do () ;   }
  //注:对战演示模式可按选定的开局定式演示
 
      wn=wn+1 ;
         testAIq () ;    //智能计权取得下子点位
      if (wn>1) wn=0 ;    //轮流下子
      if (wn==1) white_do () ;  //白棋下子
      if (wn==0) black_do () ;  //黑棋下子         
         detect () ;     //判胜负
 }//autotest ()


//AI智能下子算法求解方案:
//(一) 四连情况,黑棋下子,黑冲四嵌五,白必应子,若白无活四 022220 冲四 122220 022221 和嵌五 22022 22202 20222 则必应,有则先着取胜  

//* (二) 三连情况,黑棋下子,黑成活三嵌四,若白无活三 02220 嵌四 2022 2202 则必应, 有则先着下子成活四     

//(三) 二连情况,黑棋下子,
 //有活二01100嵌三01010,010010基本都是这样, 二连应子:抢先手原则,白棋先找自己的活二嵌三 ,先下子成活三嵌四      

//(四) 开局应首子,定标黑子 pn113,白应首子, 大多棋谱是 应上(直指) pn98,上右(斜指) pn99,暂定此应起首三子:按棋谱开局法

//*黑白双方博弈,加权计分,黑攻方进攻点就是白守方防守点。叠加加权计分,乃此算法要点。计分累加标记此点,取最高分作为进攻点和防守点。


//下面的 testAIq () 是测试算法。   

testAIq (){
 //人机对战AI选子,加权计算
   for (i=1;i<=225;i++) {
         jqn[i]=0 ;    }      //scan init
   //遍历加权
  for (i=1;i<=15;i++){    //遍历scan B & W 子
  for (j=1;j<=15;j++){    
           k=(i-1)*15+j ;    //pn(n) number
  //独子 左右上下 二对角 八方
      if (pn[k]==2){
        if (pn[k-1]==0) jqn[k-1]= jqn[k-1]+20 ;
        if (pn[k+1]==0) jqn[k+1]= jqn[k+1]+20 ;
        if (pn[k-15]==0) jqn[k-15]= jqn[k-15]+20 ;
        if (pn[k+15]==0) jqn[k+15]= jqn[k+15]+20 ;
        if (pn[k-14]==0) jqn[k-14]= jqn[k-14]+20 ;
        if (pn[k+14]==0) jqn[k+14]= jqn[k+14]+20 ;
        if (pn[k-16]==0)  jqn[k-16]= jqn[k-16]+20 ;
        if (pn[k+16]==0) jqn[k+16]= jqn[k+16]+20 ;
                }//pn

 //二连  002200  为成活三冲四进攻点
    if (j>1&&j<13){
    if (pn[k]==2&&pn[k+1]==2){  //左右
       if (pn[k-1]==0) jqn[k-1]= jqn[k-1]+200 ;   
       if (pn[k-1]==0&&pn[k-2]==0) { jqn[k-2]= jqn[k-2]+310 ;   jqn[k-1]= jqn[k-1]+310 ;  }
       if (pn[k+2]==0) jqn[k+2]= jqn[k+2]+200 ;
       if (pn[k+2]==0&&pn[k+3]==0) { jqn[k+3]= jqn[k+3]+310 ;   jqn[k+2]= jqn[k+2]+310 ;  }
            }     }

    if (i>1&&i<13){
    if (pn[k]==2&&pn[k+15]==2){  //上下  
        if (pn[k-15]==0)  jqn[k-15]= jqn[k-15]+200 ;
        if (pn[k-15]==0&&pn[k-30]==0) { jqn[k-30]= jqn[k-30]+310 ;   jqn[k-15]= jqn[k-15]+310 ;  }
        if (pn[k+30]==0) jqn[k+30]= jqn[k+30]+200 ; 
        if (pn[k+30]==0&&pn[k+45]==0) { jqn[k+45]= jqn[k+45]+310 ; jqn[k+30]= jqn[k+30]+310 ;  }
              }     }

   if (i>1&&i<13&&j>3&&j<15){
   if (pn[k]==2&&pn[k+14]==2){  //左对角
        if (pn[k-14]==0) jqn[k-14]= jqn[k-14]+200 ;
        if (pn[k-14]==0&&pn[k-28]==0) { jqn[k-28]= jqn[k-28]+310 ;  jqn[k-14]= jqn[k-14]+310 ;  }
        if (pn[k+28]==0) jqn[k+28]= jqn[k+28]+200 ; 
        if (pn[k+28]==0&&pn[k+42]==0) { jqn[k+42]= jqn[k+42]+310 ;   jqn[k+28]= jqn[k+28]+310 ;  }
            }   }

  if (i>1&&i<13&&j>1&&j<13){
  if (pn[k]==2&&pn[k+16]==2){   //右对角
       if (pn[k-16]==0) jqn[k-16]= jqn[k-16]+200 ;
       if (pn[k-16]==0&&pn[k-32]==0) { jqn[k-32]= jqn[k-32]+310 ;  jqn[k-16]= jqn[k-16]+310 ;  }
       if (pn[k+32]==0) jqn[k+32]= jqn[k+32]+200 ; 
       if (pn[k+32]==0&&pn[k+48]==0) { jqn[k+48]= jqn[k+48]+310 ;  jqn[k+32]= jqn[k+32]+310 ;  }
             }       }

//二连  020020
  if (j>1&&j<13){
  if (pn[k]==2&&pn[k+3]==2){  //左右
       if (pn[k-1]==0&&pn[k+1]==0)  jqn[k+1]= jqn[k+1]+510 ;
       if (pn[k+4]==0&&pn[k+2]==0)  jqn[k+2]= jqn[k+2]+510 ;       }  }

  if (i>1&&i<13){
  if (pn[k]==2&&pn[k+45]==2){  //上下
       if (pn[k-15]==0&&pn[k+15]==0)  jqn[k+15]= jqn[k+15]+510 ;
       if (pn[k+60]==0&&pn[k+30]==0)  jqn[k+30]= jqn[k+30]+510 ;     }  }

if (i>1&&i<13&&j>3&&j<15){
   if (pn[k]==2&&pn[k+42]==2){  //左对角
       if (pn[k-14]==0&&pn[k+14]==0)  jqn[k+14]= jqn[k+14]+510 ;
       if (pn[k+56]==0&&pn[k+28]==0)  jqn[k+28]= jqn[k+28]+510 ;     }  }

 if (i>1&&i<13&&j>1&&j<13){
 if (pn[k]==2&&pn[k+48]==2){   //右对角
       if (pn[k-16]==0&&pn[k+16]==0)  jqn[k+16]= jqn[k     +16]+510 ;
       if (pn[k+64]==0&&pn[k+32]==0) jqn[k+32]= jqn[k+32]+510 ;    }  }

//嵌三   02020    为成活三冲四进攻点
  if (j>1&&j<13){
if (pn[k]==2&&pn[k+1]==0&&pn[k+2]==2){  //左右
          jqn[k+1]= jqn[k+1]+510 ;   
      if (pn[k-1]==0)  jqn[k-1]= jqn[k-1]+310 ; 
      if (pn[k+3]==0)  jqn[k+3]= jqn[k+3]+310 ; } }

  if (i>1&&i<13){
if (pn[k]==2&&pn[k+15]==0&&pn[k+30]==2){  //上下
          jqn[k+15]= jqn[k+15]+510 ;   
      if (pn[k-15]==0)  jqn[k-15]= jqn[k-15]+310 ; 
      if (pn[k+45]==0)  jqn[k+45]= jqn[k+45]+310 ; } }

  if (i>1&&i<13&&j>3&&j<15){
if (pn[k]==2&&pn[k+14]==0&&pn[k+28]==2){//左对角
          jqn[k+14]= jqn[k+14]+510 ;   
      if (pn[k-14]==0)  jqn[k-14]= jqn[k-14]+310 ; 
      if (pn[k+42]==0)  jqn[k+42]= jqn[k+42]+310 ; } }

  if (i>1&&i<13&&j>1&&j<13){
if (pn[k]==2&&pn[k+16]==0&&pn[k+32]==2){//右对角
          jqn[k+16]= jqn[k+16]+510 ;   
      if (pn[k-16]==0)  jqn[k-16]= jqn[k-16]+310 ; 
      if (pn[k+48]==0)  jqn[k+48]= jqn[k+48]+310 ; } }

//三连,眠三抢冲四  12220  02221 逢三必堵
  if (j>1&&j<13){
  if (pn[k]==2&&pn[k+1]==2&&pn[k+2]==2){  //左右
  //三连成嵌五  +550 叠加分进攻点
     if (pn[k-1]==0)  jqn[k-1]= jqn[k-1]+310 ;   
     if (pn[k-1]==0&&pn[k-2]==0) jqn[k-1]= jqn[k-1]+410 ;   //必杀点加权分
     if (pn[k-1]==0&&pn[k-2]==0)  jqn[k-2]= jqn[k-2]+550 ;   
     if (pn[k+3]==0)  jqn[k+3]= jqn[k+3]+310 ;   
     if (pn[k+3]==0&&pn[k+4]==0) jqn[k+3]= jqn[k+3]+410 ; 
     if (pn[k+3]==0&&pn[k+4]==0)   jqn[k+4]= jqn[k+4]+550 ;    }  }

 if (i>1&&i<13){
 if (pn[k]==2&&pn[k+15]==2&&pn[k+30]==2){  //上下
     //三连成嵌五  +550 叠加分进攻点
     if (pn[k-15]==0)  jqn[k-15]= jqn[k-15]+310 ;   
     if (pn[k-15]==0&&pn[k-30]==0) jqn[k-15]= jqn[k-15]+410 ; 
     if (pn[k-15]==0&&pn[k-30]==0)  jqn[k-30]= jqn[k-30]+550 ;   
     if (pn[k+45]==0) jqn[k+45]= jqn[k+45]+310 ;   
     if (pn[k+45]==0&&pn[k+60]==0) jqn[k+45]= jqn[k+45]+410 ; 
     if (pn[k+45]==0&&pn[k+60]==0) jqn[k+60]= jqn[k+60]+550 ;  }  }
  
  if (i>1&&i<13&&j>3&&j<15){
if (pn[k]==2&&pn[k+14]==2&&pn[k+28]==2){//左对角
     //三连成嵌五  +550 叠加分进攻点
    if (pn[k-14]==0)  jqn[k-14]= jqn[k-14]+310 ;   
     if (pn[k-14]==0&&pn[k-28]==0)  jqn[k-14]= jqn[k-14]+410 ;   
     if (pn[k-14]==0&&pn[k-28]==0)  jqn[k-28]= jqn[k-28]+550 ;  
     if (pn[k+42]==0) jqn[k+42]= jqn[k+42]+310 ;   
     if (pn[k+42]==0&&pn[k+56]==0) jqn[k+42]= jqn[k+42]+410 ; 
     if (pn[k+42]==0&&pn[k+56]==0)  jqn[k+56]= jqn[k+56]+550 ;   
         }  }

   if (i>1&&i<13&&j>1&&j<13){
 if (pn[k]==2&&pn[k+16]==2&&pn[k+32]==2){//右对角
     //三连成嵌五  +550 叠加分进攻点
     if (pn[k-16]==0)  jqn[k-16]= jqn[k-16]+310 ;   
     if (pn[k-16]==0&&pn[k-32]==0) jqn[k-16]= jqn[k-16]+410 ; 
     if (pn[k-16]==0&&pn[k-32]==0)  jqn[k-32]= jqn[k-32]+550 ;   
     if (pn[k+48]==0) jqn[k+48]= jqn[k+48]+310 ;   
     if (pn[k+48]==0&&pn[k+64]==0) jqn[k+48]= jqn[k+48]+410 ; 
     if (pn[k+48]==0&&pn[k+64]==0) jqn[k+64]= jqn[k+64]+550 ;  }  }

//三连,活三变活四,必杀  0022200  与上叠加     if(pn[k2]==0&&pn[k1]==0&&pn[k]==2&&pn[k+1]==2&&pn[k+2]==2&&pn[k+3]==0&&pn[k+4]==0){  //左右
     jqn[k-1]= jqn[k-1]+1350 ;  
     jqn[k+3]= jqn[k+3]+1350 ;   }

   if(pn[k-30]==0&&pn[k-15]==0&&pn[k]==2&&pn[k+15]==2&&pn[k+30]==2&&pn[k+45]==0&&pn[k+60]==0){  //上下
     jqn[k-15]= jqn[k-15]+1350 ;  
     jqn[k+45]= jqn[k+45]+1350 ;   }
  
    if(pn[k-28]==0&&pn[k-14]==0&&pn[k]==2&&pn[k+14]==2&&pn[k+28]==2&&pn[k+42]==0&&pn[k+56]==0){//左对角
      jqn[k-14]= jqn[k-14]+1350 ;  
      jqn[k+42]= jqn[k+42]+1350 ;   }

 if(pn[k-32]==0&&pn[k-16]==0&&pn[k]==2&&pn[k+16]==2&&pn[k+32]==2&&pn[k+48]==0&&pn[k+64]==0){//右对角
      jqn[k-16]= jqn[k-16]+1350 ;  
      jqn[k+48]= jqn[k+48]+1350 ;   }

//*********
//白子算杀,做杀,找活三嵌四交点 +250
//白棋进攻态势,与二连三连计分叠加抢先手

//嵌四类 做冲四 2022  2202   布杀点 +350
// 120220  122020 020221 022021
   if (j>1&&j<13){
 if(pn[k]==2&&pn[k+1]==0&&pn[k+2]==2&&pn[k+3]==2){  //左右
      if (pn[k-1]==0||pn[k+4]==0){ jqn[k+1]= jqn[k+1]+350 ;   }  }
 if(pn[k]==2&&pn[k+1]==2&&pn[k+2]==0&&pn[k+3]==2){  //左右
    if (pn[k-1]==0||pn[k+4]==0){ jqn[k+2]= jqn[k+2]+350 ;   }   }
           } //j<12

   if (i>1&&i<13){
 if(pn[k]==2&&pn[k+15]==0&&pn[k+30]==2&&pn[k+45]==2){  //上下
     if (pn[k-15]==0||pn[k+60]==0){  jqn[k+15]= jqn[k+15]+350 ;   }   }
 if(pn[k]==2&&pn[k+15]==2&&pn[k+30]==0&&pn[k+45]==2){  //上下
     if (pn[k-15]==0||pn[k+60]==0){  jqn[k+30]= jqn[k+30]+350 ;   }   }
           } 

      if(j>3&&i>1&&i<13){ //行2--12
 if(pn[k]==2&&pn[k+14]==0&&pn[k+28]==2&&pn[k+42]==2){  //斜左
     if (pn[k-14]==0||pn[k+56]==0){ jqn[k+14]= jqn[k+14]+350 ;   }  }
 if(pn[k]==2&&pn[k+14]==2&&pn[k+28]==0&&pn[k+42]==2){  //斜左
     if (pn[k-14]==0||pn[k+56]==0){jqn[k+28]= jqn[k+28]+350 ;   }  }
            } //j>4, i<12
         
        if (j>1&&j<13&&i<13){  //列2--12
 if(pn[k]==2&&pn[k+16]==0&&pn[k+32]==2&&pn[k+48]==2){  //右斜
         if (pn[k-16]==0||pn[k+64]==0){ jqn[k+16]= jqn[k+16]+350 ;   }  }
 if(pn[k]==2&&pn[k+16]==2&&pn[k+32]==0&&pn[k+48]==2){  //右斜
        if (pn[k-16]==0||pn[k+64]==0){  jqn[k+32]= jqn[k+32]+350 ;   }  }
            } //i<12&&j<12

//嵌四 020220  022020  必杀点+350  j<12  防越界
  if (j>1&&j<12){
   if(pn[k-1]==0&&pn[k]==2&&pn[k+1]==0&&pn[k+2]==2&&pn[k+3]==2&&pn[k+4]==0){  //左右
        jqn[k+1]= jqn[k+1]+1350 ;   }
   if(pn[k-1]==0&&pn[k]==2&&pn[k+1]==2&&pn[k+2]==0&&pn[k+3]==2&&pn[k+4]==0){  //左右
        jqn[k+2]= jqn[k+2]+1350 ;   }    }

    if (i>1&&i<12){
  if(pn[k-15]==0&&pn[k]==2&&pn[k+15]==0&&pn[k+30]==2&&pn[k+45]==2&&pn[k+60]==0){  //上下
        jqn[k+15]= jqn[k+15]+1350 ;   }
   if(pn[k-15]==0&&pn[k]==2&&pn[k+15]==2&&pn[k+30]==0&&pn[k+45]==2&&pn[k+60]==0){  //上下
        jqn[k+30]= jqn[k+30]+1350 ;   }    }

  if (j>3&&j<15&&i>1&&i<12){
  if(pn[k-14]==0&&pn[k]==2&&pn[k+14]==0&&pn[k+28]==2&&pn[k+42]==2&&pn[k+56]==0){  //斜左
        jqn[k+14]= jqn[k+14]+1350 ;   }
   if(pn[k-14]==0&&pn[k]==2&&pn[k+14]==2&&pn[k+28]==0&&pn[k+42]==2&&pn[k+56]==0){  //斜左
        jqn[k+28]= jqn[k+28]+1350 ;   }    }

        if (j>1&&j<12&&i>1&&i<12){
 if(pn[k-16]==0&&pn[k]==2&&pn[k+16]==0&&pn[k+32]==2&&pn[k+48]==2&&pn[k+64]==0){  //右斜
        jqn[k+16]= jqn[k+16]+1350 ;   }
   if(pn[k-16]==0&&pn[k]==2&&pn[k+16]==2&&pn[k+32]==0&&pn[k+48]==2&&pn[k+64]==0){  //右斜
        jqn[k+32]= jqn[k+32]+1350 ;   }    }

//活四冲四成五连 022220  122220  022221   
//此是必杀点  +1990  j<12  防越界

//必杀点黑子 +1200, 白子 +1990 先胜
    if (j>1&&j<12){
 if (pn[k]==2&&pn[k+1]==2&&pn[k+2]==2&&pn[k 
+3]==2){  //左右
    if (pn[k-1]==0)  jqn[k-1]= jqn[k-1]+1990 ;  
    if (pn[k+4]==0)  jqn[k+4]= jqn[k+4]+1990 ;   }  }

    if (i>1&&i<12){
 if(pn[k]==2&&pn[k+15]==2&&pn[k+30]==2&&pn[k+45]==2){  //上下
    if (pn[k-15]==0)  jqn[k-15]= jqn[k-15]+1990 ;  
    if (pn[k+60]==0) jqn[k+60]= jqn[k+60]+1990 ; }  }

     if (j>3&&i>1&&i<12){    if(pn[k]==2&&pn[k+14]==2&&pn[k+28]==2&&pn[k +42]==2){//左对角
      if (pn[k-14]==0) jqn[k-14]= jqn[k-14]+1990 ;  
      if (pn[k+56]==0)  jqn[k+56]= jqn[k+56]+1990 ;   }  }

     if (j>1&&j<12&&i>1&&i<12){
if(pn[k]==2&&pn[k+16]==2&&pn[k+32]==2&&pn[k+48]==2){//右对角  
    if (pn[k-16]==0)  jqn[k-16]= jqn[k-16]+1990 ;  
    if (pn[k+64]==0)  jqn[k+64]= jqn[k+64]+1990 ;   } }   
      
//嵌五,此是必杀点 20222  22022  22202 
      if (j<12){      // j<12  防越界
 if(pn[k]==2&&pn[k+1]==0&&pn[k+2]==2&&pn[k+3]==2&&pn[k+4]==2){  //左右 20222
      jqn[k+1]= jqn[k+1]+1990 ;    }
 if(pn[k]==2&&pn[k+1]==2&&pn[k+2]==0&&pn[k+3]==2&&pn[k+4]==2){  //左右 22022
      jqn[k+2]= jqn[k+2]+1990 ;    }
 if(pn[k]==2&&pn[k+1]==2&&pn[k+2]==2&&pn[k+3]==0&&pn[k+4]==2){  //左右 22202
      jqn[k+3]= jqn[k+3]+1990 ;    }     }  //j<12

      if (i<12){
 if(pn[k]==2&&pn[k+15]==0&&pn[k+30]==2&&pn[k+45]==2&&pn[k+60]==2){  //上下 20222
     jqn[k+15]= jqn[k+15]+1990 ;    }
 if(pn[k]==2&&pn[k+15]==2&&pn[k+30]==0&&pn[k+45]==2&&pn[k+60]==2){  //上下 22022
     jqn[k+30]= jqn[k+30]+1990 ;    }
 if(pn[k]==2&&pn[k+15]==2&&pn[k+30]==2&&pn[k+45]==0&&pn[k+60]==2){  //上下 22202
     jqn[k+45]= jqn[k+45]+1990 ;    }    }  //i<12

        if (j>4&&i<12){
 if(pn[k]==2&&pn[k+14]==0&&pn[k+28]==2&&pn[k+42]==2&&pn[k+56]==2){  //斜左 20222
     jqn[k+14]= jqn[k+14]+1990 ;    }
 if(pn[k]==2&&pn[k+14]==2&&pn[k+28]==0&&pn[k+42]==2&&pn[k+56]==2){  //斜左 22022
     jqn[k+28]= jqn[k+28]+1990 ;    }
 if(pn[k]==2&&pn[k+14]==2&&pn[k+28]==2&&pn[k+42]==0&&pn[k+56]==2){  //斜左 22202
     jqn[k+42]= jqn[k+42]+1990 ;    }    }

        if (j<12&&i<12){
 if(pn[k]==2&&pn[k+16]==0&&pn[k+32]==2&&pn[k+48]==2&&pn[k+64]==2){  //右斜 20222
     jqn[k+16]= jqn[k+16]+1990 ;    }
 if(pn[k]==2&&pn[k+16]==2&&pn[k+32]==0&&pn[k+48]==2&&pn[k+64]==2){  //右斜 22022
     jqn[k+32]= jqn[k+32]+1990 ;    }
 if(pn[k]==2&&pn[k+16]==2&&pn[k+32]==2&&pn[k+48]==0&&pn[k+64]==2){  //右斜 22202
     jqn[k+48]= jqn[k+48]+1990 ;    }    }

//****************************
//以下是黑棋估权计分
//黑棋进攻点亦即白棋防守点,白下子亦取高分位
  //独子 左右上下 二对角 八方
     if (pn[k]==1){
        if (pn[k-1]==0) jqn[k-1]= jqn[k-1]+20 ;
        if (pn[k+1]==0) jqn[k+1]= jqn[k+1]+20 ;
        if (pn[k-15]==0) jqn[k-15]= jqn[k-15]+30 ; //直指
        if (pn[k+15]==0) jqn[k+15]= jqn[k+15]+20 ;
        if (pn[k+14]==0) jqn[k+14]= jqn[k+14]+20 ;
        if (pn[k+16]==0) jqn[k+16]= jqn[k+16]+20 ;
        if (pn[k-14]==0) jqn[k-14]= jqn[k-14]+30 ; //斜指
        if (pn[k-16]==0)  jqn[k-16]= jqn[k-16]+20 ;
             }//pn

 //二连  001100  为成活三冲四进攻点
    if (j>1&&j<13){
    if (pn[k]==1&&pn[k+1]==1){  //左右
       if (pn[k-1]==0) jqn[k-1]= jqn[k-1]+100 ; 
       if (pn[k-1]==0&&pn[k-2]==0) { jqn[k-2]= jqn[k-2]+200 ;   jqn[k-1]= jqn[k-1]+300 ;  }
       if (pn[k+2]==0) jqn[k+2]= jqn[k+2]+100 ; 
       if (pn[k+2]==0&&pn[k+3]==0) { jqn[k+3]= jqn[k+3]+200 ;   jqn[k+2]= jqn[k+2]+300 ;  }
             } }

    if (i>1&&i<13){
    if (pn[k]==1&&pn[k+15]==1){  //上下
       if (pn[k-15]==0)  jqn[k-15]= jqn[k-15]+100 ;
       if (pn[k-15]==0&&pn[k-30]==0) { jqn[k-30]= jqn[k-30]+200 ;  jqn[k-15]= jqn[k-15]+300 ;  }
       if (pn[k+30]==0) jqn[k+30]= jqn[k+30]+100 ; 
       if (pn[k+30]==0&&pn[k+45]==0) { jqn[k+45]= jqn[k+45]+200 ;  jqn[k+30]= jqn[k+30]+300 ;  }
          } }

   if (i>1&&i<13&&j>3&&j<15){
   if (pn[k]==1&&pn[k+14]==1){  //左对角
       if (pn[k-14]==0) jqn[k-14]= jqn[k-14]+100 ;
       if (pn[k-14]==0&&pn[k-28]==0) { jqn[k-28]= jqn[k-28]+200 ;  jqn[k-14]= jqn[k-14]+300 ;  }
       if (pn[k+28]==0) jqn[k+28]= jqn[k+28]+100 ; 
       if (pn[k+28]==0&&pn[k+42]==0) { jqn[k+42]= jqn[k+42]+200 ;  jqn[k+28]= jqn[k+28]+300 ;  }
         } }

  if (i>1&&i<13&&j>1&&j<13){
  if (pn[k]==1&&pn[k+16]==1){   //右对角
       if (pn[k-16]==0) jqn[k-16]= jqn[k-16]+100 ;
       if (pn[k-16]==0&&pn[k-32]==0) { jqn[k-32]= jqn[k-32]+200 ;  jqn[k-16]= jqn[k-16]+300 ;  }
       if (pn[k+32]==0) jqn[k+32]= jqn[k+32]+100 ; 
       if (pn[k+32]==0&&pn[k+48]==0) { jqn[k+48]= jqn[k+48]+200 ;  jqn[k+32]= jqn[k+32]+300 ;  }
          } }

//连二  010010
    if (j>1&&j<13){
if (pn[k]==1&&pn[k+3]==1){  //左右
       if (pn[k-1]==0&&pn[k+1]==0)  jqn[k+1]= jqn[k+1]+200 ;
       if (pn[k+4]==0&&pn[k+2]==0)  jqn[k+2]= jqn[k+2]+200 ;       }  }

    if (i>1&&i<13){
if (pn[k]==1&&pn[k+45]==1){  //上下
       if (pn[k-15]==0&&pn[k+15]==0)  jqn[k+15]= jqn[k+15]+200 ;
       if (pn[k+60]==0&&pn[k+30]==0)  jqn[k+30]= jqn[k+30]+200 ;     }  }

   if (i>1&&i<13&&j>3&&j<15){
  if (pn[k]==1&&pn[k+42]==1){  //左对角
       if (pn[k-14]==0&&pn[k+14]==0)  jqn[k+14]= jqn[k+14]+200 ;
       if (pn[k+56]==0&&pn[k+28]==0)  jqn[k+28]= jqn[k+28]+200 ;     }  }

  if (i>1&&i<13&&j>1&&j<13){
 if (pn[k]==1&&pn[k+48]==1){   //右对角
       if (pn[k-16]==0&&pn[k+16]==0)  jqn[k+16]= jqn[k+16]+200 ;
       if (pn[k+64]==0&&pn[k+32]==0) jqn[k+32]= jqn[k+32]+200 ;    }  }

//嵌三   01010   可成双活三
   if (j>1&&j<13){
if (pn[k]==1&&pn[k+1]==0&&pn[k+2]==1){  //左右
          jqn[k+1]= jqn[k+1]+500 ;   
      if (pn[k-1]==0)  jqn[k-1]= jqn[k-1]+300 ; 
      if (pn[k+3]==0)  jqn[k+3]= jqn[k+3]+300 ; } }

  if (i>1&&i<13){
 if (pn[k]==1&&pn[k+15]==0&&pn[k+30]==1){  //上下
          jqn[k+15]= jqn[k+15]+500 ;   
      if (pn[k-15]==0)  jqn[k-15]= jqn[k-15]+300 ; 
      if (pn[k+30]==0)  jqn[k+30]= jqn[k+30]+300 ; } }

   if (i>1&&i<13&&j>3&&j<15){
if (pn[k]==1&&pn[k+14]==0&&pn[k+28]==1){//左对角
          jqn[k+14]= jqn[k+14]+500 ;   
      if (pn[k-14]==0)  jqn[k-14]= jqn[k-14]+300 ; 
      if (pn[k+28]==0)  jqn[k+28]= jqn[k+28]+300 ; } }

  if (i>1&&i<13&&j>1&&j<13){
 if (pn[k]==1&&pn[k+16]==0&&pn[k+32]==1){//右对角
          jqn[k+16]= jqn[k+16]+500 ;   
      if (pn[k-16]==0)  jqn[k-16]= jqn[k-16]+300 ; 
      if (pn[k+32]==0)  jqn[k+32]= jqn[k+32]+300 ; } }

//三连,眠三21110  01112 抢冲四 
   if (j>1&&j<13){
if (pn[k]==1&&pn[k+1]==1&&pn[k+2]==1){  //左右
    //三连成嵌五  +550 叠加分进攻点
     if (pn[k-1]==0)  jqn[k-1]= jqn[k-1]+300 ;   
     if (pn[k-1]==0&&pn[k-2]==0) jqn[k-1]= jqn[k-1]+400 ;   //必杀点加权分
     if (pn[k-1]==0&&pn[k-2]==0)  jqn[k-2]= jqn[k-2]+550 ;   
     if (pn[k+3]==0)  jqn[k+3]= jqn[k+3]+300 ;   
     if (pn[k+3]==0&&pn[k+4]==0) jqn[k+3]= jqn[k+3]+400 ; 
     if (pn[k+3]==0&&pn[k+4]==0)   jqn[k+4]= jqn[k+4]+550 ;    }  }

   if (i>1&&i<13){
if (pn[k]==1&&pn[k+15]==1&&pn[k+30]==1){  //上下
    //三连成嵌五  +550 叠加分进攻点
     if (pn[k-15]==0)  jqn[k-15]= jqn[k-15]+300 ;   
     if (pn[k-15]==0&&pn[k-30]==0) jqn[k-15]= jqn[k-15]+400 ; 
     if (pn[k-15]==0&&pn[k-30]==0)  jqn[k-30]= jqn[k-30]+550 ;   
   //  if (pn[k-15]==2&&pn[k+45]==0) jqn[k+45]= jqn[k+45]-200 ;   //眠三可不堵,???
     if (pn[k+45]==0) jqn[k+45]= jqn[k+45]+300 ;   
     if (pn[k+45]==0&&pn[k+60]==0) jqn[k+45]= jqn[k+45]+400 ; 
     if (pn[k+45]==0&&pn[k+60]==0) jqn[k+60]= jqn[k+60]+550 ;
             }  }

   if (i>1&&i<13&&j>3&&j<15){
if (pn[k]==1&&pn[k+14]==1&&pn[k+28]==1){//斜左
    //三连成嵌五  +550 叠加分进攻点
     if (pn[k-14]==0)  jqn[k-14]= jqn[k-14]+300 ;   
     if (pn[k-14]==0&&pn[k-28]==0) jqn[k-14]= jqn[k-14]+400 ; 
     if (pn[k-14]==0&&pn[k-28]==0)  jqn[k-28]= jqn[k-28]+550 ;   
     if (pn[k+42]==0) jqn[k+42]= jqn[k+42]+300 ;   
     if (pn[k+42]==0&&pn[k+56]==0) jqn[k+42]= jqn[k+42]+400 ; 
     if (pn[k+42]==0&&pn[k+56]==0) jqn[k+56]= jqn[k+56]+550 ;  }  }

  if (i>1&&i<13&&j>1&&j<13){
 if (pn[k]==1&&pn[k+16]==1&&pn[k+32]==1){//右斜
    //三连成嵌五  +550 叠加分进攻点
     if (pn[k-16]==0)  jqn[k-16]= jqn[k-16]+300 ;   
     if (pn[k-16]==0&&pn[k-32]==0) jqn[k-16]= jqn[k-16]+400 ; 
     if (pn[k-16]==0&&pn[k-32]==0)  jqn[k-32]= jqn[k-32]+550 ;   
     if (pn[k+48]==0) jqn[k+48]= jqn[k+48]+300 ;   
     if (pn[k+48]==0&&pn[k+64]==0) jqn[k+48]= jqn[k+48]+400 ; 
     if (pn[k+48]==0&&pn[k+64]==0) jqn[k+64]= jqn[k+64]+550 ;  }  }

//三连,活三变活四  01110  白方逢三必堵
    if(pn[k-2]==0&&pn[k-1]==0&&pn[k]==1&&pn[k+1]==1&&pn[k+2]==1&&pn[k+3]==0&&pn[k+4]==0){  //左右
     jqn[k-1]= jqn[k-1]+800 ;  
     jqn[k+3]= jqn[k+3]+800 ;   }

   if(pn[k-30]==0&&pn[k-15]==0&&pn[k]==1&&pn[k+15]==1&&pn[k+30]==1&&pn[k+45]==0&&pn[k+60]==0){  //上下
     jqn[k-15]= jqn[k-15]+800 ;  
     jqn[k+45]= jqn[k+45]+800 ;   }
  
    if(pn[k-28]==0&&pn[k-14]==0&&pn[k]==1&&pn[k+14]==1&&pn[k+28]==1&&pn[k+42]==0&&pn[k+56]==0){//左对角
      jqn[k-14]= jqn[k-14]+800 ;  
      jqn[k+42]= jqn[k+42]+800 ;   }

 if(pn[k-32]==0&&pn[k-16]==0&&pn[k]==1&&pn[k+16]==1&&pn[k+32]==1&&pn[k+48]==0&&pn[k+64]==0){//右对角
      jqn[k-16]= jqn[k-16]+800 ;  
      jqn[k+48]= jqn[k+48]+800 ;   }

//黑方的必杀点就是白方的防守要点
//嵌四 010110   011010   必杀点 +350
   if (j>1&&j<12){
 if(pn[k-1]==0&&pn[k]==1&&pn[k+1]==0&&pn[k+2]==1&&pn[k+3]==1&&pn[k+4]==0){  //左右
        jqn[k+1]= jqn[k+1]+350 ;   }
   if(pn[k-1]==0&&pn[k]==1&&pn[k+1]==1&&pn[k+2]==0&&pn[k+3]==1&&pn[k+4]==0){  //左右
        jqn[k+2]= jqn[k+2]+350 ;   }  }

    if (i>1&&i<12){
if(pn[k-15]==0&&pn[k]==1&&pn[k+15]==0&&pn[k+30]==1&&pn[k+45]==1&&pn[k+60]==0){  //上下
        jqn[k+15]= jqn[k+15]+350 ;   }
   if(pn[k-15]==0&&pn[k]==1&&pn[k+15]==1&&pn[k+30]==0&&pn[k+45]==1&&pn[k+60]==0){  //上下
        jqn[k+30]= jqn[k+30]+350 ;   }  }

   if (i>1&&i<12&&j>3&&j<15){
 if(pn[k-14]==0&&pn[k]==1&&pn[k+14]==0&&pn[k+28]==1&&pn[k+42]==1&&pn[k+56]==0){  //斜左
        jqn[k+14]= jqn[k+14]+350 ;   }
   if(pn[k-14]==0&&pn[k]==1&&pn[k+14]==1&&pn[k+28]==0&&pn[k+42]==1&&pn[k+56]==0){  //斜左
        jqn[k+28]= jqn[k+28]+350 ;   }  }

    if (i>1&&i<12&&j>1&&j<12){
if(pn[k-16]==0&&pn[k]==1&&pn[k+16]==0&&pn[k+32]==1&&pn[k+48]==1&&pn[k+64]==0){  //右斜
        jqn[k+16]= jqn[k+16]+350 ;   }
   if(pn[k-16]==0&&pn[k]==1&&pn[k+16]==1&&pn[k+32]==0&&pn[k+48]==1&&pn[k+64]==0){  //右斜
        jqn[k+32]= jqn[k+32]+350 ;   }  }

//活四冲四 此是必杀点 211110  011112   +1200
//黑有此白必堵,此是必杀点 如白无连五则必应 
    if (j>1&&j<12){      // j<12  防越界    if(pn[k]==1&&pn[k+1]==1&&pn[k+2]==1&&pn[k+3]==1){  //左右
    if (pn[k-1]==0)  jqn[k-1]= jqn[k-1]+1200 ;  
    if (pn[k+4]==0)  jqn[k+4]= jqn[k+4]+1200 ;   }  }

   if (i>1&&i<12){
 if(pn[k]==1&&pn[k+15]==1&&pn[k+30]==1&&pn[k+45]==1){  //上下
    if (pn[k-15]==0)  jqn[k-15]= jqn[k-15]+1200 ;  
    if (pn[k+60]==0)  jqn[k+60]= jqn[k+60]+1200 ;   }  }

  if (i>1&&i<12&&j>3&&j<15){  if(pn[k]==1&&pn[k+14]==1&&pn[k+28]==1&&pn[k+42]==1){//左对角
    if (pn[k-14]==0)  jqn[k-14]= jqn[k-14]+1200 ;  
    if (pn[k+56]==0)  jqn[k+56]= jqn[k+56]+1200 ;   }  }

   if (i>1&&i<12&&j>1&&j<12){
 if(pn[k]==1&&pn[k+16]==1&&pn[k+32]==1&&pn[k+48]==1){//右对角
     if (pn[k-16]==0)  jqn[k-16]= jqn[k-16]+1200 ;  
    if (pn[k+64]==0)  jqn[k+64]= jqn[k+64]+1200 ;   }  }
 
//嵌五 10111  11011  11101   +1200
//此是必杀点 如白无连五则必应 
 if(pn[k]==1&&pn[k+1]==0&&pn[k+2]==1&&pn[k+3]==1&&pn[k+4]==1){  //左右 10111
      jqn[k+1]= jqn[k+1]+1200 ;    }    if(pn[k]==1&&pn[k+1]==1&&pn[k+2]==0&&pn[k+3]==1&&pn[k+4]==1){  //左右 11011
      jqn[k+2]= jqn[k+2]+1200 ;    }
 if(pn[k]==1&&pn[k+1]==1&&pn[k+2]==1&&pn[k+3]==0&&pn[k+4]==1){  //左右 11101
      jqn[k+3]= jqn[k+3]+1200 ;    }

 if(pn[k]==1&&pn[k+15]==0&&pn[k+30]==1&&pn[k+45]==1&&pn[k+60]==1){  //上下 10111
     jqn[k+15]= jqn[k+15]+1200 ;    }
 if(pn[k]==1&&pn[k+15]==1&&pn[k+30]==0&&pn[k+45]==1&&pn[k+60]==1){  //上下 11011
     jqn[k+30]= jqn[k+30]+1200 ;    }
 if(pn[k]==1&&pn[k+15]==1&&pn[k+30]==1&&pn[k+45]==0&&pn[k+60]==1){  //上下 11101
     jqn[k+45]= jqn[k+45]+1200 ;    }    if(pn[k]==1&&pn[k+14]==0&&pn[k+28]==1&&pn[k+42]==1&&pn[k+56]==1){  //斜左 10111
     jqn[k+14]= jqn[k+14]+1200 ;    }    if(pn[k]==1&&pn[k+14]==1&&pn[k+28]==0&&pn[k+42]==1&&pn[k+56]==1){  //斜左 11011
     jqn[k+28]= jqn[k+28]+1200 ;    }
 if(pn[k]==1&&pn[k+14]==1&&pn[k+28]==1&&pn[k+42]==0&&pn[k+56]==1){  //斜左 11101
     jqn[k+42]= jqn[k+42]+1200 ;    }    if(pn[k]==1&&pn[k+16]==0&&pn[k+32]==1&&pn[k+48]==1&&pn[k+64]==1){  //右斜 10111
     jqn[k+16]= jqn[k+16]+1200 ;    }    if(pn[k]==1&&pn[k+16]==1&&pn[k+32]==0&&pn[k+48]==1&&pn[k+64]==1){  //右斜 11011
     jqn[k+32]= jqn[k+32]+1200 ;    }
 if(pn[k]==1&&pn[k+16]==1&&pn[k+32]==1&&pn[k+48]==0&&pn[k+64]==1){  //右斜 11101
     jqn[k+48]= jqn[k+48]+1200 ;    }

  }    }    //test i , j   pn(225) 棋盘点位

//******************************
//测试:显示加权计分情况,最高分白下子
   if (isDo==0) return ;
     cs.SetTextSize (14);
     cs.SetTextStyle (0);
     cs.SetColor (255,0,0,240) ;
       for (i=1;i<=225;i++){    //scan
           if (jqn[i] !=0) {
             //print i,"  qn= ",jqn[i] ;    //测试
             s=intToString ( jqn[i]) ;
     dx=(i-(i/15*15))*40;
     dy=(i/15)*40+40;
       if (dx==0){ dx=15*40;    dy=dy-40;   }
            cs.DrawText (s,dx,dy) ;    //标记分值
          }     }
 
//计算最高分
      jqf=0 ;
 for (i=1;i<=225;i++){  
       k= jqn[i] ;
       if ( k>jqf) { jqf=k ;  jqfn=i ;   }
             } //计算最高分 
       sn=jqfn ;     //计权最高分点位转坐标
 //   print " sn= ",jqfn ," jqf= ",jqf ;  //test
      dx=(sn-(sn/15*15))*40;
      dy=(sn/15)*40+40;
       if (dx==0) {dx=15*40;   dy=dy-40;   }
      cs.SetColor (255,250,250,0);  
      cs.DrawCircle (dx,dy,5);  //标记下子点!!重点
         cs.Update () ;   
         //sleep (500) ;   //test 查看
         n=sn ;      //下子点号sn转换为n,  draw board
         px=dx ;  py=dy ;    //board ()标记下子点
 //**** AI 走子 ********************** 
}//testAIq ()

 

//  1. 寒星局  2. 溪月局  3. 疏星局  

//  4. 花月局  5. 残月局  6. 雨月局
//  7. 金星局  8. 松月局  9. 丘月局
//10. 新月局  11. 瑞星局 12. 山月局   
//13. 游星局        **>  (1-13是直指式)
//14. 长星局  15. 峡月局  16. 恒星局  
//17. 水月局  18. 流星局  19. 云月局  
//20. 浦月局  21. 岚月局  22. 银月局
//23. 明星局  24. 斜月局  25. 名月局
//26. 彗星局        **>(14-26是斜指式)


    

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/695374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React项目请求接口跨域设置代理怎么设置

在src 目录下创建setupProxy.js const {createProxyMiddleware} require(http-proxy-middleware)module.exports function(app) {app.use(createProxyMiddleware(/api, { //api1是需要转发的请求(所有带有/api1前缀的请求都会转发给5000)target: http://172.20.17.199:808…

学习Kotlin~函数

有名函数 函数参数 不打算传入值参&#xff0c;可以预先给参数指定默认值 //如果不打算传入值参&#xff0c;可以预先给参数指定默认值private fun fix(name: String, age: Int 2) {println(name age);}//调用的时候fix("hhhh");fix("hasee", 30);有名的…

【Html】Html+Less实现一个简单的加载动画

效果 运行环境 系统&#xff1a;Win10系统 IDE&#xff1a;Visual Studio Code v1.79.2 VSCode插件&#xff1a;Easy LESS v2.0.0 index.html代码 <!DOCTYPE html> <html><head><title>加载动画</title><link rel"stylesheet" hr…

Android的Context详解 - 揭开Context的神秘面纱

这篇文章是基于我四年前的一篇文章进行更正和深入探究。背景是&#xff0c;2019年4月份我在找工作&#xff0c;看到一个问题&#xff0c;问this&#xff0c;getBaseContext()、getApplication()、getApplicationContext()的区别。当时我写了简单的demo验证&#xff0c;得出了跟…

看看螯合物前体多肽试剂DOTA-E[c(RGDfK)2]的全面解析吧!

【产品描述】 DOTA-E[c(RGDfK)2]螯合物前体多肽试剂&#xff0c;RGD肽指含有Arg-Gly-Asp三个氨基酸组成的序列多肽&#xff0c;可以提供大量的RGD直线肽&#xff0c;RGD环肽&#xff0c;RGD双环肽、RGD模拟肽等&#xff0c;也可以根据客户需求定制RGD肽。 DOTA-E [c (RGDfK) 2…

6.3 B树

多路平衡查找树 1.定义 B树的阶&#xff1a;B树中所有结点的孩子个数的最大值&#xff0c;表示成m m阶B树&#xff1a;空树或者满足如下特性的m叉树 特性&#xff1a; 1.树中每个结点最多子树 m 关键字m-1 2.根节点不是终端结点&#xff0c;至少有两棵子树 3.根结点除外&…

Java 遍历List的两种方式

可参考文章 Notepad编译并运行java代码_notepad怎么运行java代码_西晋的no1的博客-CSDN博客 中的第二种方法测试下述代码。 在java中&#xff0c;可以使用for循环和使用for-each循环两种方式遍历List。 1.使用for循环遍历List 2.使用for-each遍历List 注意&#xff1a;使用for-…

Java使用Maven工程操作OpenGL ES绘制三角形和圆形;绘制完成后操作键盘控制然图形移动

OpenGL ES 绘制三角形&#xff0c;操作键盘移动位置 PS&#xff1a;想快速看到效果的小伙伴&#xff0c;可以在引入依赖后&#xff0c;先跳到完整代码部分 第一步&#xff1a;依赖引入 <properties><lwjgl.version>3.2.3</lwjgl.version><joml.version&…

mysql 密码丢失的解决方案

问题描述 mysql 密码丢失的解决方案 解决方案&#xff1a; 停止服务; 重新启动服务&#xff1a;mysqld.exe --skip-grant-tables //启动服务器但是跳过权限; 当前启动的服务器没有权限概念&#xff1a;非常危险&#xff0c;任何客户端&#xff0c;不需要任何用户信息都可…

Pycharm连接远端Python环境操作Spark

文章目录 1. 创建工程&#xff0c;指定远端python解析器2. 添加远端python解析器3.配置完成4.本地文件自动同步远端5.删除远端python解析器(非必须操作&#xff0c;重新配置时参考该项)6. 文件模板配置 远程连接方案, 允许程序员连接远端测试环境, 确保环境的统一, 避免各种环境…

消息队列中间件(一)

场景 流量削峰 应用解耦 异步处理 分类 ActiveMQ 优&#xff1a;单机吞吐万级&#xff0c;时效性ms级&#xff0c;可用性高&#xff08;主从架构&#xff09;&#xff0c;可靠性高&#xff08;丢失率低&#xff09; 缺&#xff1a;官方维护少&#xff0c;高吞吐场景较少…

QT Creator上位机学习(二)基础控件及信号与槽

c# 系列文章目录 文章目录 布局控件信号与槽程序图标使用技巧 布局控件 美化界面的时候&#xff0c;经常需要进行一些控件的布局&#xff0c;这时需要使用一些容器类。 在快捷栏出&#xff0c;也有一些布局设计的选择 如上图&#xff0c;其中涉及到几种编辑状态&#xff1…

Math简单学习

1.绝对值 就变个符号 public static double abs(double a) {return (a < 0.0D) ? 0.0D - a : a; }public static float abs(float a) {return (a < 0.0F) ? 0.0F - a : a;}public static int abs(int a) {return (a < 0) ? -a : a;}IntrinsicCandidatepublic sta…

Redis【实战篇】---- 优惠卷秒杀

Redis【实战篇】---- 优惠卷秒杀 1. 全局唯一ID2. Redis实现全局唯一ID3. 添加优惠券4. 实现秒杀哦下单5. 库存超卖问题分析6. 乐观锁解决超卖问题7. 优惠券秒杀 ---- 一人一单8. 集群环境下的并发问题 1. 全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&…

封装websocket请求-----vue2

参考 (875条消息) 封装websocket请求-----vue项目实战&#xff08;完整版&#xff09;_vue websocket封装_winne雪的博客-CSDN博客https://blog.csdn.net/m0_38134431/article/details/105794108 一、在utils目录下创建websocket.js文件 import {Message} from element-ui /…

Mac 已经在.bash_profie中配置过sdk环境依然报zsh: command not found: adb

提示 前置条件 已经安装好Android studio 然后~/.bash_profile 或.bash_profile也已经配置sdk路径&#xff0c;打开第二个终端输入adb时提示zsh: command not found: adb 解决办法 打开终端输入下面命令 echo export ANDROID_HOME/Users/$USER/Library/Android/sdk >>…

近日,我处理了一个大文件导入 nginx HTTP/1.1“ 413 585的问题

今天&#xff0c;导入一个1万多条数据的excel文件&#xff0c;本地没有用到nginx&#xff0c;导入很顺畅 部署到了线上后&#xff0c;导入文件后后台并没有日志输出&#xff0c;说明没有进入后端 经过摸排&#xff0c;分析&#xff0c;最终发现&#xff0c;是nginx这关没过 …

智能相机的功能介绍

智能视觉检测相机主要是应用在工业检测领域图像分析识别、视觉检测判断。相机具有颜色有无判别、颜色面积计算、轮廓查找定位、物体特征灰度匹配、颜色或灰度浓淡检测、物体计数、尺寸测量、条码二维码识别读取、尺寸测量、机械收引导定位、字符识别等功能。相机带有HDMI高清视…

stm32使用clion移植canfestival(canopen)

官方网站 https://canfestival.org/index.html.en 非官方的下载地址 GitHub - ljessendk/CanFestival 每个版本的源码会有些差异&#xff0c;移植代码的时候最好把源码也一并移植 以下使用硬石h743开发板, 并使用TIM8作为FDCAN1的定时器 STM32CubeMax 设置APB1的频率为20…

vscode设置可以搜索包含node_modules中的文件

步骤3中删除掉node_modules&#xff0c;再搜索的时候&#xff0c;node_modules的匹配到代码也会展示出来了。 如果不想要被搜索文件包含node_modules,再添加上就可以。