前几天在本站发布了《围棋打谱应用软件设计制作》文,今补充些重要的功能。

 

data_collect (){
//** test 导出数据 play data in format 
//** 输入定式样例,根据盘面,取得数据    }



 

 

cal_force (){
//** 计算势,以势预判赢面,也可判胜负
//** 黑棋白棋势分析,中盘评势可判胜负   
//** 白棋势分析,中盘战略战术可分析下子      }

 

 

 

 


计算胜负写了二个函数,因 cal_piece (  )  也可作棋势的分析。
cal_piece (){
//** 计算黑白子,判胜负,2025-02-25 完成     }
judge_winner (){
 //** 计算胜负:黑子计数贴 3又3/4 子,
 //** 计算黑子和白子 cal_piece ( ),
 //** 黑psh=185子胜,白psw=177子胜    
 //** 计子大于等于185子即可判黑棋胜,少则白棋胜。
 //** 我国是计子,日韩是计目
 //** 计数方法设计 >>> 2025-02-25 完成       }

 

 

 

关于AI 人机对战:
选子设计较难,理论上有许多专业术语,如开局定式,中盘战术,收官阶段。下子的术语有:小飞大飞尖立关跳断挖拆扳喷碰托压冲一间二+间...不一而足。
程序AI白棋要下子不难,开局阶段可走定式,定式很多,要训练AI就要喂招。这样就要设计自学习模板。怎样训练,就是给程序打谱,让程序自己记录和整理数据,用强大的数据流来计算势,以势大来定AI下子。中盘战术战略和收官阶段的方法也是这样。
 此课题太大,我只能搞个大概,示例一番。搞多搞大就成了阿尔法狗了。
 三个示例:
       cal_force ( ) 计算双方的势
       getdata ( )  取得数据
       data_collect ( ) 测试数据采集,数据流文件


游戏设计有几个要素: 
一是界面设计,也就是画出棋盘,更新棋盘;
二是黑白双方如何下子,即时棋盘显示;
三是程序要有提子功能和悔棋功能;
四是游戏过程记录,便于棋后打谱和复盘;
五是游戏模式设置,双人对弈和人机模式;
六是加游戏数据导入导出功能,用于打谱;
这六条是游戏的基本功能,其他功能可自行添加。

界面设计:有主屏幕棋板和功能按钮,另设下拉菜单

游戏功能设计:
一,界面设计,启动页面和游戏页面,更新屏幕显示
         board (  )  { ......}
二,演示打谱,依据样例数据打谱演示
        show_p1 ( ) {......}    show_p2 (  )  { ......}
三,复盘功能,整局棋数据复盘,可采集游戏数据,导出数据
         replay (  )  {......}
四,数据采集,游戏数据格式化,导出。可保存为 .txt  文件,
         (文件保存和读取部分暂未写)
          getdata (  )  {......}

其他功能有:
          undo (  ) {  //悔棋功能
           cut_piece (  )  {  //提子吃子
           showtime (  )  {  //显示使用时间
           black_do (  )  {  //黑棋下子
           white_do (  )  {  //白棋下子
   
下面的游戏代码就是用它在安卓手机上编写的,可制作成安卓手机桌面app应用程序。遗憾的是该编译器是简单的,有些高级的东西就难以用它来实现。用此编译器难以写出AI的大项目。我仅能搞个简单的,提供一些设计思路。欣慰的是此设计能双人对弈,能打谱演示,这是我的初衷。

 

 

 

 

以下是设计的完整源码:
//  最简单的 C 语言编程
//  myspringc  v2.7  可编译安卓本机 app 应用
//  此样例可复制黏贴到 myspringc  编译
//  此文档可用 VB6,VC  ,  java 改写
//** 此设计完成了围棋软件应用的基本功能,可以双人对弈。
//**************************************
//  《围棋》  打谱软件  v 1.2.0
//   双人对弈   人机对战                 
//   编制人:张纯叔    micelu@126.com
//   myspringc  v2.7   编译                       
//**************************************
Canvas cs;    //画布
string sBarDes[10];    //按钮
int nBarId[10];
string sMenu[50];       //菜单
int nMenu[50];
float src[4];  //ClearDraw (cls) clear screen
  FileInput filebox;   //file Input box加底图
  int size[2];    //load picture size
  string fname;  //filename
string s0,s1,s2,s3,s4,s5,s6,s7,s8 ;     //显示
string s,ss,ss1,ss2,ss3,ss4,ss8 ;
string abc$ ;
int i,j,t,a;           //t = times
 int pn[365];    //pn ( 0=" " , 1=black , 2=white )
int n;                // 361 棋子编码号
int dx,dy;         //draw X, Y
int px,py;        // piece x,y 选子
int sx, sy;        //数据转换坐标
int context;    // canvasProc 触控
int obj;
int id;
int event;
int dn,dn1 ;        //下子计数
 int isDo;      //游戏操作控制 1=可下子,0=不可下
int B,W,k;   //detect win Black White
string cordp,cordp1;   //record pn & "K10"
int cord;        //record switch
int mode;      //0=人人,1=人机
 int bwdo ;    //黑白下子限定 1=黑,2=白
int wn;    
int sn,dLen ;       
 int dwn[365];    //记录
int col,row ;
int cn,kn,nn ;      //show record num
int gn ;    //game round number
 int fudat[361];      //复盘数据
 int fusum;    //复盘记录总数
 int sd;         //复盘
  int jqn[361];      //计权数据
 int jqf,jqfn ;        //计权分,优选点位码
 string data[18];  //棋谱数据,每段20个数据
 string d$,ds ;           //数据文件读写
 int datn[360];     //打开文件,引入数据流号
 double dd ;    //数据交换:string>double>int
   int bnn, wnn ;    //黑白方 提子计数
 int tim[3];   //get Time & show finished time
 int thh,tmm,tss;
 int oldhh,oldmm,oldss;
 int newhh,newmm,newss;
 int mms;               //show using time
 string hhts,mmts,ssts;
 string ts,ts1,ts2, ts$;
 int psh, psw ;    //计势,计子,计目
 //************************

main(){
setDisplay(1);
  cs.SetBackground(250,250,250);
  cs.Active();
   sBarDes[0]="开始游戏";
   nBarId[0]=100;
   sBarDes[1]="选择模式";
   nBarId[1]=101;
   sBarDes[2]="黑棋下子";
   nBarId[2]=102;
   sBarDes[3]="白棋下子";
   nBarId[3]=103;
   sBarDes[4]="退出程序";
   nBarId[4]=104;
   sBarDes[5]="👀v";
   nBarId[5]=105;
   setToolBarHeight(6);
   setButtonTextSize(13);
   setToolBarBackgroundColor(255,250,250,250);
   setButtonColor(255,250,250,250);
   setButtonTextColor(255,220,120,0);
   setToolBar(100,myToolBarProc,sBarDes,nBarId,6);

   sMenu[0]="开始游戏";
   nMenu[0]=200;
   sMenu[1]="选择模式 ( 双人 , 人机 )";
   nMenu[1]=201;
   sMenu[2]="悔棋";
   nMenu[2]=202;
   sMenu[3]="复盘";
   nMenu[3]=203;
   sMenu[4]="文件数据演示";
   nMenu[4]=204;
   sMenu[5]="查看记录和显示棋板";
   nMenu[5]=205;
   sMenu[6]="测试 > 数据采集";
   nMenu[6]=206;
   sMenu[7]="势分析预判胜负";
   nMenu[7]=207;
   sMenu[8]="计子 > 判胜负";
   nMenu[8]=208;
   sMenu[9]="退出";
   nMenu[9]=209;
   setMenu(200,myMenuProc,sMenu,nMenu,10);

   setTitle("围棋打谱软件 ver.1.2.0   ");
//*************************
  cs.SetProc (context, mycanvasProc);
      mode=0 ;  
      s7="游戏模式:双人对奕"; 
      wn=0 ;   //测试演示
      gn=0;    //round number
      bwdo=1 ;   //首子黑棋 
      gamestart ();    //游戏初始界面
//** print title ****
        ss3="围棋  (打谱演示版)";
    cs.SetTextSize (60);
    cs.SetTextStyle (1);
    cs.SetFillMode (1);//0不填色,1填色
    cs.SetColor(255,160,60,40);
         cs.DrawText (ss3,105,505);
    cs.SetColor(255,0,250,0);
         cs.DrawText (ss3,100,500);
    cs.SetFillMode (0);//0不填色,1填色
    cs.SetColor(255,250,250,0);
         cs.DrawText (ss3,101,501);
    cs.Update();  
while (){}
  }//main ()

mycanvasProc (int context,int obj,int id,int event,float x,float y){          
      if (isDo==0) return ;   //结束标志   
    kn=kn+1;     //延时,  减少闪屏
    if ((kn-kn/2*2)==0){ kn=0; }else{  return;  }  
       board ();   //redraw board

  //** get chess piece position X , Y 
   if (x>25&&x<680&&y>25&&y<680){
      px=(int)(x/34)*34;    //棋盘区棋位取整数
      py=(int)(y/34)*34;
           dx=px/34;  
           dy=py/34;
  cs.SetFillMode (0);//0不填色,1填色
  cs.SetColor (255,250,0,0);  //chess flag选子标记
       cs.DrawRect (px-18,py-18,px+18,py+18);        }    

  //** 演示和复盘按钮
  //** show_p1 ()
  //** 羋昱廷九段(黑)对 辜梓豪九段(白)局
    if (x>40&&x<180&&y>900&&y<960){
        if (mode==0) show_p2 () ;  }    //演示算法测试
    if (x>210&&x<350&&y>900&&y<960){
            ss8="💌🔊 复盘完成 " ;
            replay () ;    }    //复盘
     if (x>380&&x<520&&y>900&&y<960){
            cut_piece () ;      }   //提子(吃子)
     if (x>540&&x<680&&y>900&&y<960){
            getdata () ;      }   //导出数据
     if (x>10&&x<100&&y>970&&y<1015){
            judge_winner () ;      }   //判胜负

   cs.SetFillMode (1);//0不填色,1填色
       n=(dy-1)*19+dx;  //提示选定棋子pn number     
       if (n>361) return ;     //选子越界
       s8=intToString (n);
       row=19-(n/19) ;
       col=(n-(n/19*19)) ;
       if (col==0){ col=19 ;    row=row+1 ;   }
       swapabc () ;   //col n to abc return ss
       s=ss+" "+intToString (row) ;
   s5="选定落子位 >>   "+s;
   if (x<20||x>670||y<20||y>670) s5="  ";  //棋盘位越界
       cs.SetColor (255,250,250,250);  //擦除
       cs.DrawRect (480,755,630,790); //更新s3 s8
    cs.SetColor(255,250,150,100);
     cs.SetTextSize (24);
   cs.DrawText (s5,328,780); //提示选定棋子
   cs.DrawText (s8,560,780); //选定棋子n
    cs.Update ();
}//mycanvasProc 

show_p2 (){
//** 设计和测试打谱
      gamestart () ;   //renew game board
      s7="游戏模式:打谱演示"; 
      for (i=0;i<=361; i++){ fudat[i]=0;  }  //init (n)
//** 引入数据文件,文件头为 00n 数据序01n >18n
//** 平衡策略和局部定式例,布局例计69子
    data[0]="01n 073 061 320 288 290 282 283 264 302 244 318 169 131 167 251 309 310 308 291 279 ";
    data[1]="02n 044 099 023 041 047 175 129 054 053 034 072 035 033 074 093 075 037 036 082 120 ";
     data[2]="03n 249 193 325 306 326 268 289 307 269 329 330 324 267 344 022 021 051 018 146 122 ";
      data[3]="000 184 300 319 297 187 188 168 206 149 ";

 // ** 文件数据读取
    for (t=0; t<3; t++) {
          dLen=len (data[t])/4-1;   //取得数据个数
          print "dLen = ",dLen ;
   for (i=1; i<=dLen ; i++) {
          d$=subString (data[t], i*4, 4);
          dd=stringToDouble (d$);
          fudat[i+t*20]=(int)(dd) ;     }  }

          t=3 ;   
         dLen=len (data[t])/4-1;   //取得数据个数
    for (i=1; i<=dLen ; i++) {
          d$=subString (data[t], i*4, 4);
          dd=stringToDouble (d$);
          fudat[i+t*20]=(int)(dd) ;     }  

//** 按数据演示
    ss8="💌🔊 平衡策略和局部定式例 ";   
    fusum=t*20+dLen ;   //dLen=20加尾数
    replay ();    //打谱
}//show_p2 ()

show_p1 (){
//** 设计和测试打谱
       gamestart () ;   //renew game board
       s7="游戏模式:打谱演示"; 
     for (i=0;i<=361; i++){ fudat[i]=0;  }  //init (n)
//** 引入数据文件,文件头为 00n 数据序01n >18n
//** 此数据为第4届《围棋王中王》争霸賽 第二轮
//** 羋昱廷九段(黑)对 辜梓豪九段(白)局
      data[0]="01n 074 042 308  301 079 270 269 250 288 251 310 175 062 043 063 045 136 155 137 053  ";
      data[1]="02n  321 302 320 300 319 299 318 317 054 072 112 187 193 173 211 289 307 135 116 230  ";
 
 //** 文件数据读取,t=data fusum/20 
    for (t=0; t<2; t++) {
          dLen=len (data[t])/4-1;   //取得数据个数
          print "dLen = ",dLen ;
   for (i=1; i<=dLen ; i++) {
          d$=subString (data[t], i*4, 4);
          dd=stringToDouble (d$);
          fudat[i+t*20]=(int)(dd) ;     }  }

//** 按数据演示
  ss8="💌🔊 打谱羋昱廷 VS 辜梓豪";   //show status
    fusum=dLen*2;   //dLen=20加尾数
    replay ();    //打谱
}//show_p1 ()

data_collect (){
//** test 导出数据 play data in format 
//** 输入定式样例,根据盘面,取得数据
    getdata () ;  //get >> 数据 ds串,  数据个数 fusum 

 //** 数据四角镜像翻转采集,
 //** 水平上向下翻转
    for (i=1; i<=fusum ; i++) {
        s=subString (ds, i*4, 4 ) ;
        dd=stringToDouble (s) ;
             sn=(int) dd ;
        sx=sn-(sn/19*19) ;
        sy=sn/19+1 ;
         if (sx==0) {sx=19;   sy=sy-1;   }
            fudat[fusum+i]=(19-sy)*19+sx ;
             }
            fusum=fusum+i-1 ;
  //** 垂直右向左翻转  
      for (i=1; i<=fusum ; i++) {
             sn=fudat[i] ;
        sx=sn-(sn/19*19) ;
        sy=sn/19 ;
         if (sx==0) {sx=19;   sy=sy-1;   }
            fudat[fusum+i]=sy*19+(19-sx+1) ;
             }
            fusum=fusum+i-1 ;    

//** 按数据演示
    ss8="💌🔊 测试数据采集";   //show status
   // fusum=dLen*2;   //dLen=20加尾数
    replay ();    //打谱
}//data_collect ()

getdata (){
 //** 取得复盘数据整理导出
 //** 因编译器软件限制,故分段处理
 //    ds字串长度 fusum=20 (20*4byte)
 //** 用其他编译器可编译长字串,一次性编译数据
 //** 点击[开始游戏] gamestart () ; 即可取数据
 int ts;   //数据段数,20个为一段

    if (fusum==0) return;
        clearOutput ();
    print "** test 导出数据 play data in format ";
    print "fusum = ", fusum;
           ts=fusum/20;    //分段
     for (t=0; t<ts; t++) {
         ds="xxn";   //init head of document
     for (i=1; i<=20; i++) {
            n=fudat[t*20+i];
             if (n<10) d$="00"+intToString (n);
             if (n>9&&n<100) d$="0"+intToString (n);
             if (n>99) d$=intToString (n) ;
             ds=ds+" "+d$ ;               }  
                 print "  " ;  
                 print ds ;       }  //** print data

     if (fusum>ts*20){
         dLen=fusum-ts*20 ;   //取得剩余数据个数
         ds="xxn";   //init head of document
    for (i=1; i<=dLen ; i++) {
            n=fudat[ts*20+i];
             if (n<10) d$="00"+intToString (n);
             if (n>9&&n<100) d$="0"+intToString (n);
             if (n>99) d$=intToString (n) ;
             ds=ds+" "+d$ ;     }
                  print "  " ;
                  print ds ;   }  //** print data

      setDisplay (0);
 }//getdata ()

cal_force (){
//** 计算势,以势预判赢面,也可判胜负
//** 黑棋白棋势分析,中盘评势可判胜负   
//** 白棋势分析,中盘战略战术可分析下子  
//** 暂未完成此编写,2025-02-23 补充完成
      if (fusum<3) return ;
          clearOutput ();
          cs.SetFillMode (1);//0不填色,1填色
          psh=0 ;   psw=0 ;    //init
      for (i=1; i<=fusum; i++) {
              kn= fudat[i] ;
          if (i-i/2*2==0) pn[kn]=2 ;
          if (i-i/2*2 !=0) pn[kn]=1 ;
                }    //数据类型转换 

  for (j=2;j<=18;j++){  //遍历scan   
  for (i=2;i<=18;i++){    
             kn=(j-1)*19+i ;    //pn(n) number
  //** scan black & calculate force ****
        if (pn[kn]==1) {
               psh=psh+1 ;
          dx=(kn-(kn/19*19))*34;      //定位
          dy=(kn/19)*34+34;
          if (dx==0){ dx=19*34;    dy=dy-34;   }

               if (pn[kn+1]==0) {
               psh=psh+1 ;
          cs.SetColor (255,250,0,0);  
          cs.DrawCircle (dx+30,dy,2);  }//标记点
 
               if (pn[kn-1]==0) {
               psh=psh+1 ;
          cs.SetColor (255,250,0,0);  
          cs.DrawCircle (dx-30,dy,2);  }//标记点
 
               if (pn[kn+19]==0) {
               psh=psh+1 ;
          cs.SetColor (255,250,0,0);  
          cs.DrawCircle (dx,dy+30,2);  }//标记点
 
               if (pn[kn-19]==0) {
               psh=psh+1 ;   
           cs.SetColor (255,250,0,0);  
           cs.DrawCircle (dx,dy-30,2);  }//标记点
               }  //scan black

  //** scan white & calculate force ****
        if (pn[kn]==2) {
               psw=psw+1 ;
          dx=(kn-(kn/19*19))*34;      //定位
          dy=(kn/19)*34+34;
          if (dx==0){ dx=19*34;    dy=dy-34;   }

               if (pn[kn+1]==0) {
               psw=psw+1 ;
          cs.SetColor (255,0,0,250);  
          cs.DrawCircle (dx+30,dy,2);  }//标记点
 
               if (pn[kn-1]==0) {
               psw=psw+1 ;
          cs.SetColor (255,0,0,250);  
          cs.DrawCircle (dx-30,dy,2);  }//标记点
 
               if (pn[kn+19]==0) {
               psw=psw+1 ;
          cs.SetColor (255,0,0,250);  
          cs.DrawCircle (dx,dy+30,2);  }//标记点
 
               if (pn[kn-19]==0) {
               psw=psw+1 ;   
           cs.SetColor (255,0,0,250);  
           cs.DrawCircle (dx,dy-30,2);  }//标记点
               }  //scan white
        cs.Update ();
         }    }   //scan  black & white

       print "黑子 psh = ",psh ;
       print "白子 psw = ",psw ;
         cs.SetTextSize (30);
         cs.SetTextStyle (0);
         cs.SetColor (255,220,100,0);  
            s="黑子 = "+intToString (psh);
         cs.DrawText (s,270,330) ;  
            s="白子 = "+intToString (psw);
         cs.DrawText (s,270,370) ;  
         cs.Update ();
     if (fusum>100) judge_winner () ;  //预判胜负
     //** 若中盘胜,可判胜负
       // isDo=1 ;  
 }//cal_force ()

 testAIq (){
  //** AI智能下子算法求解方案:
  //** 用于检测AI智能下子算法 testAIq ()
  //** 围棋AI 选子设计较难,理论上有许多专业术语,如开局定式,中盘战术,收官阶段。下子的术语有:小飞大飞尖立关跳断挖拆扳喷碰托压冲一间二+间...不一而足。
 //** 程序AI白棋要下子不难,开局阶段可走定式,定式很多,要训练AI就要喂招。这样就要设计自学习模板。怎样训练,就是给程序打谱,让程序自己记录和整理数据,用强大的数据流来计算势,以势大来定AI下子。中盘战术战略和收官阶段的方法也是这样。
 //** 此课题太大,我只能搞个大概,示例一番。搞多搞大就成了阿尔法狗了。
 //** 三个示例:
 //**  cal_force ( ) 计算双方的势
 //**  getdata ( )  取得数据
 //**  data_collect ( ) 测试数据采集,数据流文件

 //** 人机对战AI选子,加权计算,开个头,搞个示例
    for (i=1;i<=361;i++) { jqn[i]=0 ;    }   //scan init

 //** dn下子序,pn (n) 黑当前下子点位,sn白下子
 //** 首子右上星,以示对对手的尊重
 //** 黑首子 右上右下 星或小飞,白左上左下
     if (dn==1){   //首子白应星或小飞
         if (pn[73]==1||pn[54]==1||pn[74]==1) {
         sn=61 ;   goto AI_do ;       }   }
 //** 二手白应星或小飞,黑左下白则右,右下白则左
    if (dn==3){ 
         if (pn[301]==1||pn[302]==1||pn[320]==1) {
         sn=308 ;     goto AI_do ;    }
         if (pn[288]==1||pn[289]==1||pn[308]==1) {
         sn=301 ;      goto AI_do ;   }   }
 //** 黑星定式,白应小飞
       if (pn[73]==1){    
            if (pn[74]==0) { sn=74 ;  goto AI_do ;  }
            if (pn[55]==0) { sn=55 ;  goto AI_do ;  }   }
       if (pn[301]==1){    
            if (pn[302]==0) { sn=302 ;  goto AI_do ;  }
            if (pn[320]==0) { sn=320 ;  goto AI_do ;  }   }
       if (pn[289]==1){    
            if (pn[288]==0) { sn=288 ;  goto AI_do ;  }
            if (pn[308]==0) { sn=308 ;  goto AI_do ;  }   }
       if (pn[61]==1){    
            if (pn[60]==0) { sn=60 ;  goto AI_do ;  }
            if (pn[80]==0) { sn=80 ;  goto AI_do ;  }   }

  // return;
//**************
 //** 遍历加权 scan black & white
 //黑白子>>左右上下四方位>> 加权计分
 //** scan black & white calculate force ****
      for (j=2;j<=18;j++){  //遍历scan   
      for (i=2;i<=18;i++){    
             k=(j-1)*19+i ;    //pn(n) number
     if (pn[k]==1) { 
        if (pn[k-1]==0) jqn[k-1]=jqn[k-1]+10 ;  
        if (pn[k+1]==0) jqn[k+1]= jqn[k+1]+10 ;
        if (pn[k-19]==0) jqn[k-19]= jqn[k-19]+10 ;
        if (pn[k+19]==0) jqn[k+19]= jqn[k+19]+10 ;   }
            //   }    }   //scan  black & white
     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-19]==0) jqn[k-19]= jqn[k-19]+20 ;
        if (pn[k+19]==0) jqn[k+19]= jqn[k+19]+20 ;   }
               }    }   //scan  black & white

 //** scan 一间夹 ****
      for (j=3;j<=17;j++){  //遍历scan   
      for (i=3;i<=17;i++){    
             k=(j-1)*19+i ;    //pn(k) 
     if (pn[k]==1) {    //一间夹
        if (pn[k-2]==0) jqn[k-2]=jqn[k-2]+20 ;  
        if (pn[k+2]==0) jqn[k+2]= jqn[k+2]+30 ;
        if (pn[k-38]==0) jqn[k-38]= jqn[k-38]+20 ;
        if (pn[k+38]==0) jqn[k+38]= jqn[k+38]+30 ;   }
              // }    }   //scan  black & white
      if (pn[k]==2) {    //一间夹
        if (pn[k-2]==0) jqn[k-2]=jqn[k-2]+50 ;  
        if (pn[k+2]==0) jqn[k+2]= jqn[k+2]+60 ;
        if (pn[k-38]==0) jqn[k-38]= jqn[k-38]+50 ;
        if (pn[k+38]==0) jqn[k+38]= jqn[k+38]+60 ;   }
               }    }   //scan  black & white

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

swapabc (){
    abc$="sABCDEFGHJKLMNOPQRST" ;
    ss=subString (abc$,col,1) ;   //return ss="A..T"
}//swapabc ()

black_do (){    //黑棋下子
     if (bwdo==2) return ;  //轮流下子限定
         pn[n]=1;    
          s6="⚪ 棋下子 ";   
        row=19-(n/19) ;
        col=(n-(n/19*19)) ;
      if (col==0){ col=19 ;    row=row+1 ;   }
        swapabc () ;   //return ss
        cordp=" B "+intToString (n);    //走子记录
        cordp1=" B "+ss+intToString (row) ;
     if (cordp != ss2) {    //不重复记录
           dn=dn+1;       //print dn;   
          bwdo=bwdo+1;    //b&w 轮流下子
          if (bwdo>2) bwdo=1;
          print dn," ",cordp,"    " , ss,row ;  //打印记录
             ss2=cordp; 
           dwn[dn]=n ;    //print play number
           fudat[dn]=n;    fusum=dn;  //复盘数据                           
         board ();    
               }
         testAIq ();     //test AI 计权白子点位下子 **
          
    if (mode==1) {     //人机模式下子
            white_do () ;      }    // AI Do  白下子
}//black_do ()

white_do (){    //白棋下子
       if (bwdo==1) return ;  //轮流下子限定
       pn[n]=2;
          s6="⚫ 棋下子 ";        
       row=19-(n/19) ;
       col=(n-(n/19*19)) ;
       if (col==0){ col=19 ;    row=row+1 ;   }
       swapabc () ;   //转换return ss
       cordp=" w "+intToString (n);     //走子记录
       cordp1=" w "+ss+intToString (row) ;
     if (cordp != ss2) { 
          dn=dn+1;    
          bwdo=bwdo+1;      //b&w 轮流下子
          if (bwdo>2) bwdo=1;
          print dn," ",cordp,"    " , ss,row ;  //打印记录
            ss2=cordp;  
          dwn[dn]=n ;    //print play number
          fudat[dn]=n;    fusum=dn;  //复盘数据   
        board () ;
               }
         testAIq ();     //test AI 计权白子点位下子 **

 }//white_do ()

board (){
//** 打印棋盘,更新棋盘
     if (isDo==0) return ;   //结束标志   
 fname="/storage/emulated/0/go03.jpg";
  //cs.DrawBitmap(fname,0,0);  //加底图,启动页面
 //** 若 gamestart 加底图透明棋盘不画back pad
 //** draw board grids 棋盘方格
    cs.SetFillMode (1);//0不填色,1填色
   cs.SetColor (255,220,200,150);  //棋板底色
         cs.DrawRect (0,0,682,683);  //透明棋盘不设底色
    cs.SetFillMode (0);//0不填色,1填色
     for (i=1;i<19;i++){       //draw grids
        for (j=1;j<19;j++){    
    cs.SetColor (255,150,150,50);  //grid color
        cs.DrawRect(i*34-1,j*34-1,i*34+33,j*34+33);  
    cs.SetColor (255,250,250,250);  //grid color
        cs.DrawRect(i*34,j*34,i*34+34,j*34+34);  
                 }  }
    cs.SetColor (255,250,250,250);  //rectangle line
       cs.DrawRect (0,0,684,683);   //画框线
    cs.SetColor (255,0,0,0);  //rectangle line
       cs.DrawRect (0,0,683,684);   //画框线

 //** draw flag points
       cs.SetFillMode (1);//0不填色,1填色
       cs.SetColor (255,100,100,100);  
       cs.DrawCircle(136,136,4);     //九点星元
       cs.DrawCircle(544,136,4);
       cs.DrawCircle(136,544,4);
       cs.DrawCircle(544,544,4);
       cs.DrawCircle(340,340,4);    //中心点
       cs.DrawCircle(136,340,4);
       cs.DrawCircle(544,340,4);
       cs.DrawCircle(340,136,4);
       cs.DrawCircle(340,544,4);    
 //** 绘出棋盘坐标编码
       cs.SetColor (255,0,0,100);  
       cs.SetTextStyle (1);
       cs.SetTextSize (14);
 //string abc$ ;
     abc$="sABCDEFGHJKLMNOPQRST" ;
       a=0 ;      //set print tab
   for (i=1;i<=19;i++){    
           ss1=intToString (i) ;
        if (i>9) a=4 ;       //tab for print number
           cs.DrawText (ss1,10-a,685-i*34) ;  
           ss=subString (abc$,i,1) ;
           cs.DrawText (ss,i*34-5,675) ;    }

 //** draw button 绘制按钮
  cs.SetColor (105,200,200,200);  
     cs.DrawRect (40,900,181,961);
     cs.DrawRect (210,900,351,961);
     cs.DrawRect (380,900,521,961);
     cs.DrawRect (550,900,670,961);
  cs.SetColor (255,250,0,0);  
      for (i=1;i<60;i++){    //按钮渐变色
  cs.SetColor (255,240-i*4,240-i*3,250-i*4);  
      cs.DrawLine (41,900+i,180,900+i);  
      cs.DrawLine (211,900+i,350,900+i);  
      cs.DrawLine (381,900+i,520,900+i);  
            }    
      cs.SetColor(255,250,180,100);
      cs.SetTextStyle (1);
      cs.SetTextSize (32);
      cs.DrawText ("演  示",72,940);
      cs.DrawText ("复  盘",242,940);
      cs.DrawText ("提  子",412,940);
       cs.SetTextSize (24);
     cs.DrawText ("导出数据",563,940);
         cs.SetColor (155,240,250,250);  
         cs.DrawRect (10,970,110,1015);

 //** draw chess pieces 画出已下黑白子
   for (i=1;i<=361;i++){    
       dx=(i-(i/19*19))*34;
       dy=(i/19)*34+34;
       if (dx==0){ dx=19*34;    dy=dy-34;   }
  
 if ( pn[i]==2){  //white
    cs.SetColor (255,140,80,40);      //piecesW
       cs.DrawCircle(dx+2,dy+2,16);
    cs.SetColor (255,220,220,220);  //pieceW
       cs.DrawCircle(dx,dy,16);
    cs.SetColor (255,250,250,250);  //pieceW
       cs.DrawCircle(dx-6,dy-6,2);   }
 if (pn[i]==1){  //black
    cs.SetColor (255,220,100,40);  //piecesB
       cs.DrawCircle(dx+1,dy+1,16);
    cs.SetColor (255,0,0,0);              //pieceB
       cs.DrawCircle(dx,dy,16);
    cs.SetColor (255,200,200,200);  //pieceB
       cs.DrawCircle(dx-6,dy-6,2);       }
                    }     //** draw chess pieces
    cs.SetColor (255,250,0,0);  //刚落子标记
       cs.DrawCircle(px,py,4);

 //** 提示选子
     cs.SetTextSize (34);
     cs.SetColor(255,240,240,240);
     cs.DrawRect (390,700,590,750);  //clean*
         cs.SetColor(255,250,150,0);  
    cs.DrawText (s6,415,735);    //提示选子
//** 打印游戏模式 s7
     cs.SetTextStyle (0);
     if (mode==0) s7="游戏模式:双人对弈 ";   
     if (mode==1) s7="游戏模式:人机模式 ";  
     cs.SetColor(255,250,250,250);
         cs.DrawRect (10,700,320,750);   //clean*
     cs.SetColor(255,250,150,0);
         cs.DrawText (s7,20,735);      //game mode

         //cs.SetTextStyle (0);
         cs.SetTextSize (12);
     cs.SetColor(255,0,0,0);      //显示记录
    cs.DrawText (cordp1,682,dn*14);  //record _G8
 
  //** draw pieces number 画出下子序号*****
          cs.SetTextStyle (0);  //1 粗体
      for (i=1;i<=dn;i++){    
       cn=i ;
       s=intToString(cn) ;
            kn=dwn[i] ;    
       dx=(kn-(kn/19*19))*34;
       dy=(kn/19)*34+34;
       if (dx==0){ dx=19*34;    dy=dy-34;   }
            a=0;     
       if (i>9&&i<100) a=4;  //二位数 10 > 99
       if (i>99) a=8;    //三位数  100 >
          cs.SetTextSize (14);
          cs.SetColor (255,0,250,0);  
       if (i-i/2*2==0) cs.SetColor (255,0,0,0);  
          cs.DrawText (s,dx-5-a,dy+5);
                }   
 //** print version
   cs.SetColor (255,250,200,0);  
     cs.SetTextStyle (0);
     cs.SetTextSize (24);
     ss=" 编制人:张纯叔   micelu@126.com " ;
         cs.DrawText (ss, 20, 1000);
         cs.DrawLine (10,970,710,970);
  cs.Update ();
//** 显示用时
     showtime ( );   //显示用时
}//board ()

cal_piece (){
//** 计算黑白子,判胜负,2025-02-25 完成
       if (fusum<40) return ;
          clearOutput ();
          cs.SetFillMode (1);//0不填色,1填色
         psh=0 ;   psw=0 ;    //init
      for (i=1; i<=fusum; i++) {  //数据类型转换
              kn= fudat[i] ;
          if (i-i/2*2==0) pn[kn]=2 ;
          if (i-i/2*2 !=0) pn[kn]=1 ;
                       }    //数据类型转换 
  //** fudat(361)   n1 >> n361  下子点位
  //** pn(361)  >>  0=空, 1=黑,  2=白
 int hw ;   //B & w  

 //** 遍历 scan black & white **********
    for (j=1;j<=19;j++){    
          nn=0 ;  hw=0 ;    
    for (i=1;i<=19;i++){    
          kn=(j-1)*19+i ;    //kn=1 >> 361
        if (pn[kn]==0)  nn=nn+1;    
        if (pn[kn]==1) {   
               psh=psh+nn+1 ; 
               hw=1;    nn=0;       }
         if (pn[kn]==2) {
               psw=psw+nn+1 ;   
               hw=2 ;    nn=0;        }              
         //if (pn[kn]==0) {  //空位标记 test**
            //   if (hw==1) cs.SetColor (255,250,0,0);  
           //    if (hw==2) cs.SetColor (255,0,0,250);        
            //     dx=i*34-34 ;
           // cs.DrawCircle (dx+30,j*34,2);  }  //标记               
               } //next i   scan
    //** 反向计算右边黑白子
           nn=0 ;
    for (t=1; t<=18; t++){    
          kn=(j-1)*19+20-t;   
        if (pn[kn]==0)  nn=nn+1;    
        if (pn[kn]==1) { psh=psh+nn ;  t=18 ;  }
        if (pn[kn]==2) { psw=psw+nn ;  t=18 ;  }   }
                 }  //next j   scan

  //** print result *******
       print "黑子 psh = ",psh ;
       print "白子 psw = ",psw ;
         cs.SetTextSize (30);
         cs.SetTextStyle (0);
         cs.SetColor (255,250,100,0);  
            s="黑子 = "+intToString (psh);
            cs.DrawText (s,270,330) ;  //draw jqn(i)
            s="白子 = "+intToString (psw);
            cs.DrawText (s,270,370) ;  //draw jqn(i)
        cs.Update ();
        judge_winner () ;   //判胜负
   //** show status  
        cs.SetFillMode (1);//0不填色,1填色
        cs.SetColor(255,250,250,250);
        cs.DrawRect (10,832,400,865);   //clean*
        cs.SetTextStyle (0);
        cs.SetTextSize (30);
        cs.SetColor(255,0,80,180);     
        ss="💌🔊 游戏结束,胜负已判定 ";  
        cs.DrawText (ss, 20, 860);  
        cs.Update ();  
 }//cal_piece ()

judge_winner (){
 //** 计算胜负:黑子计数贴 3又3/4 子,
 //** 计算黑子和白子 cal_piece ( ),
 //** 黑psh=185子胜,白psw=177子胜    
 //** 计子大于等于185子即可判黑棋胜,少则白棋胜。
 //** 我国是计子,日韩是计目
 //** 计数方法待设计 >>> 2025-02-25
        if (psh - psw >=7) ss3="黑棋胜  !"; 
        if (psh - psw<7) ss3="白棋胜  !"; 

 //** show win flag  判胜负
        cs.SetTextStyle (0);
        cs.SetTextSize (14);
        cs.SetColor(255,255,0,0);
        cs.DrawText (ss3,682,(fusum+2)*14);   
//** print flag  胜负 ****
    cs.SetTextSize (60);
    cs.SetTextStyle (1);
    cs.SetFillMode (1);//0不填色,1填色
    cs.SetColor(255,160,60,40);
         cs.DrawText (ss3,235,455);
    cs.SetColor(255,0,250,0);
         cs.DrawText (ss3,230,450);
    cs.SetFillMode (0);//0不填色,1填色
    cs.SetColor(255,250,240,0);
          cs.DrawText (ss3,231,451);
    cs.Update();  
     isDo=0;      //结束标志
}//judge_winner ()
 
gamestart (){
    setDisplay (1);  
 fname="/storage/emulated/0/go03.jpg";
  //cs.DrawBitmap(fname,0,0);  //加底图,启动页面
    cs.SetColor (255,250,250,250);  //清除记录
         cs.DrawRect (680,0,720,1010);
         cs.DrawRect (0,680,680,880);   //clean screen
         cord=1 ;    //记录开关 on
    for (i=1;i<=361; i++){ pn[i]=0;  }   //init pn (n)下子位
    for (i=0;i<=361; i++){ dwn[i]=0;  }  //init dwn (n)记录
        isDo=1;     //游戏操作控制
        s6="⚫ 棋下子 ";     //init
        dn=0;  wn=0 ;   n=0 ;   nn=0;    //计数清零
        bwdo=1 ;   //首子黑棋 
        bnn=0;  wnn=0;       //提子数 init
        px=-1;  py=-1;          //位提示红点init
        gn=gn+1;      //盘数game round + 1
        clearOutput();     //清除记录
 //** 显示开始时间
   getTime (tim);      //取得系统时间
       oldhh=tim[0];
       oldmm=tim[1];
       oldss=tim[2];
   hhts=intToString (tim[0]);
   mmts=intToString (tim[1]);
   ssts=intToString (tim[2]);
   if (oldhh<10)hhts="0"+hhts;   //格式化显示
   if (oldmm<10)mmts="0"+mmts;
   if (oldss<10)ssts="0"+ssts;
       ss2=hhts+" : "+mmts+" : "+ssts;
   ts="开始 >  "+ss2;   //show start time
       ts1=" ";                  //end time
       board ();      //绘出棋板
//** 显示开始时间
    cs.SetTextStyle (0);
    cs.SetTextSize (26);
    cs.SetColor(255,250,250,250);
          cs.DrawRect (10,750,245,785);   //clean*
     cs.SetColor(255,250,150,0);
     cs.DrawText (ts,20,775);  //show start time
     cs.Update ();
 }//gamestart ()

showtime (){  
  //** 计算和显示使用时间
      getTime (tim);
      newhh=tim[0];
      newmm=tim[1];
      newss=tim[2];
      hhts=intToString (tim[0]);
      mmts=intToString (tim[1]);
      ssts=intToString (tim[2]);
      if (newhh<10)hhts="0"+hhts;
      if (newmm<10)mmts="0"+mmts;
      if (newss<10)ssts="0"+ssts;
 mms=((newhh-oldhh)*3600)+
        ((newmm-oldmm)*60)+((newss-oldss));    
    if (mms<0) mms=mms+864000;
        thh=mms/3600;
        tmm=(mms-thh*2600)/60;
        tss=mms-thh*3600-tmm*60;
ss1=intToString (tmm)+" 分  "+intToString (tss)+" 秒";
 ss2=hhts+" : "+mmts+" : "+ssts;
      ts1= "结束 >  "+ss2;      //输出
  //cs.DrawText (ts1,20,824);  //show end time

      s0=intToString (thh);
      s1=intToString (tmm) ;
      s2=intToString (tss) ;
      if (tmm<10) s1="0"+s1;
      if (tss<10)  s2="0"+s2;
         s3=s1+" : "+s2 ;
         s3=s0+"0 : "+s3 ;
  //** show using time 立体字显示
     cs.SetTextSize (32);
     cs.SetTextStyle (1);
     cs.SetFillMode (1);//0不填色,1填色
    cs.SetColor(255,250,250,250);
        cs.DrawRect (20,785,220,825);   //clean**
    cs.SetColor(255,0,90,0);
         cs.DrawText (s3,43,818);
    cs.SetColor(255,255,120,0);
         cs.DrawText (s3,40,815);
    cs.SetFillMode (0);//0不填色,1填色
    cs.SetColor(255,250,250,0);
          cs.DrawText (s3,40,815);
     cs.SetFillMode (1);//0不填色,1填色
    cs.Update ();
 }//showtime ()

cut_piece (){      //** 提子,可选子连续清除
      if (isDo==1) {      //提子
            pn[n]=0 ;   
            board ();        }
     print "n = ", n ;    //test
 
    for (i=1;i<=fusum;i++){    //提子计数
           nn = fudat[i] ;
        if (nn == n ) {
             fudat[i]=470+bnn+wnn ;  //画已提子
             kn=nn ;
        if (i-i/2*2==0) bnn=bnn+1;        //黑提子数
        if (i-i/2*2==1) wnn=wnn+1;   }  //白提子数
             }
        print "kn = ", kn ;    //test
        print "bnn = ", bnn ;   
        print "wnn = ", wnn ;    
 }//cut_picec ()

undo(){      //** 悔棋,可选子连续清除
     if (isDo==1) {  
            pn[n]=0 ;   
            dn=dn-1 ;
                if (dn<1) dn=1 ;
           if (dn-dn/2*2==0) bwdo=1 ; 
           if (dn-dn/2*2 != 0) bwdo=2 ;
                if (bwdo<1) bwdo=1 ;        
            board ();        }
 }//undo ()

replay (){    //复盘
      setDisplay (1);
     // mode=2;    //打谱复盘
      print "fusum= " ,fusum;
   s7="游戏模式:打谱演示 ";  
   cs.SetTextStyle (0);
   cs.SetTextSize (34);   
   cs.SetColor(255,250,250,250);
         cs.DrawRect (10,700,320,750);   //clean*
    cs.SetColor(255,250,150,0);
         cs.DrawText (s7,20,735);      //game mode

  //** redraw chess piece 画出复盘黑子白子
  for (i=1;i<=fusum;i++){    
       kn=fudat[i] ;     //取得数据
       sd=i-i/2*2 ;       //mod   0=白棋, 1=黑棋
       dx=(kn-(kn/19*19))*34 ;
       dy=(kn/19)*34+34;
       if (dx==0){ dx=19*34;    dy=dy-34;   }
 if ( sd==0){  //** draw white
       ss=intToString (kn);
       cordp=" w "+ss;
         row=19-(kn/19) ;
         col=(kn-(kn/19*19)) ;
         swapabc () ;
         print i,"  ",cordp,"     " , ss,row ;  //打印记录
         ss4=" w "+ss+intToString (row) ;
    cs.SetColor (255,140,80,40);  //pieceW
       cs.DrawCircle(dx+2,dy+2,16);
    cs.SetColor (255,220,220,220);  //pieceW
       cs.DrawCircle(dx,dy,16);
    cs.SetColor (255,250,250,250);  //pieceW
       cs.DrawCircle(dx-6,dy-6,2);   }
 if ( sd==1){  //** draw black
       ss=intToString (kn);
       cordp=" B "+ss;
         row=19-(kn/19) ;
         col=(kn-(kn/19*19)) ;
         swapabc () ;
         print i,"  ",cordp,"     " , ss,row ;  //打印记录
        ss4=" B "+ss+intToString (row) ;
    cs.SetColor (255,220,100,40);  //pieceB
       cs.DrawCircle(dx+1,dy+1,16);
    cs.SetColor (255,0,0,0);  //pieceB
       cs.DrawCircle(dx,dy,16);
    cs.SetColor (255,200,200,200);  //pieceB
       cs.DrawCircle(dx-6,dy-6,2);       }
    
    if (i==fusum){
    cs.SetColor (255,250,0,250);    //标志最末点
       cs.DrawCircle(dx,dy,5);      
              }  //=fusum number       
 
  //** 标记序号
       cs.SetFillMode (1);//0不填色,1填色
       cs.SetTextStyle (0);
       cs.SetTextSize (14);   
       s=intToString (i);       //标记序号
          a=0;     //set tab
       if (i>9&&i<100) a=4;  //二位数 10 > 99
       if (i>99) a=8;               //三位数  100 >
         cs.SetColor (255,0,250,250);  
       if (i-i/2*2==0) cs.SetColor (255,0,0,0);  
         cs.DrawText (s,dx-4-a,dy+5);

  //** 界面显示记录
        cs.SetTextSize (12);
     cs.SetColor(255,200,50,0);
    cs.DrawText (ss4,682,i*14);      //界面显示记录
      cs.Update ();    
      //  sleep (1000);     //延迟显示
               } //draw replay chess pieces         
  
 //** show status
       cs.SetFillMode (1);//0不填色,1填色
        cs.SetColor(255,250,250,250);
        cs.DrawRect (10,832,400,865);   //clean*
         cs.SetTextStyle (0);
        cs.SetTextSize (30);
        cs.SetColor(255,0,80,180);     
       // ss8="💌🔊 打谱复盘演示完成";   //show status
        cs.DrawText (ss8, 20, 860);  
        cs.Update ();  
     showtime ();   
     isDo=0 ;      //结束标志   
 }//replay ()

myToolBarProc(int nBtn,int nContext)
{
      if(nBtn==100){//开始游戏
           gamestart ();    
                 }
      if(nBtn==101){//选择模式
            mode=mode+1;    //0=人人, 1= 人机
           if (mode>1) mode=0 ;  
           if (mode==0) s7="游戏模式:双人对弈 ";   
           if (mode==1) s7="游戏模式:人机模式 ";  
               gamestart ();   
                   }
      if(nBtn==102){//黑棋下子
          if ( pn[n]==0) black_do() ;    
                    }
      if(nBtn==103){//白棋下子,双人对弈模式
          if (mode==0&&pn[n]==0) white_do () ;    
                     }
      if(nBtn==104){//退出程序
          clearOutput();
          cs.ClearDraw (0,src);
          setDisplay (0);
          exit (0);    
                   }
     if(nBtn==105){//查看记录
           cord=cord+1;
           if (cord>1) cord=0 ;
           if (cord==0) setDisplay (0);    //查看记录
           if (cord==1) setDisplay (1);    //显示棋板
                  }
}//myToolBar ()

myMenuProc(int nMen,int nContext)
{
   if(nMen==200){   //开始游戏
          gamestart ();  } 
   if(nMen==201){   //选择模式
            mode=mode+1;    //0=人人, 1= 人机
         if (mode>1) mode=0 ;  
         if (mode==0) s7="游戏模式:双人对弈 ";   
         if (mode==1) s7="游戏模式:人机模式 ";  
            gamestart ();   
                   }          
    if(nMen==202){  //悔棋
          undo ();   
                }
    if (nMen==203){  //复盘
           replay ();
                }
    if (nMen==204){  //演示设置
           show_p1 ();
                 }
    if(nMen==205){   //查看记录
        cord=cord+1;
           if (cord>1) cord=0 ;
           if (cord==0) setDisplay (0);    //查看记录
           if (cord==1) setDisplay (1);    //显示棋板
                }  
    if(nMen==206){  //测试训练和数据采集
           data_collect ( );    
                }
    if(nMen==207){  //计势和预判胜负
              cal_force ();    
                  }
     if(nMen==208){  //计子 > 判胜负
             cal_piece ();    
                  }
     if (nMen==209){  //Exit 
          clearOutput();
          cs.ClearDraw (0,src);
          setDisplay (0);
          exit (0);
            }
  }//myMenu()

loadpic (){  //可用于装载预设棋盘底图
//use filebox open a file and load a picture
         filebox.SetTitle("装载图片(*.bmp;*.jpg;*.png)");
         filebox.SetFilter(".bmp;.jpg;.png");
         filebox.Show();
         if(filebox.GetCount()==1){
            fname=filebox.GetFileName(0);
            if(getPicSize(fname,size)<0){
               return;           }
          cs.ClearDraw (0,src);
          cs.DrawBitmap(fname,0,2);
          cs.Update ();
              }
}//loadpic ()

//****  End  ********

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐