围棋打谱应用软件设计制作

发布于:2025-02-23 ⋅ 阅读:(17) ⋅ 点赞:(0)

围棋打谱应用软件设计制作

五子棋游戏是大家耳熟能详的游戏,深受大众喜爱。可见其在智能游戏中的地位。我在本站发了好几篇文章介绍编制方法和算法。而类似的围棋游戏则是智能游戏的顶级存在。今在此基础上编制一款围棋打谱软件。当然这是简单的游戏程序,但也具备双人对战功能。

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

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

其他有:
          undo (  ) {  //悔棋功能
           cut_piece (  )  {  //提子吃子
           showtime (  )  {  //显示使用时间
           black_do (  )  {  //黑棋下子
           white_do (  )  {  //白棋下子
   
还有二个较难实现的功能:  (暂未完成编写)
 AI下子算法和胜负判定计算,亦即计子或计目,此可引申计算棋盘的”势”。
 AI 的计算有:开局定式和中盘战术战略,以及收官阶段。

MySpringC是一种简单的C语言编译器,它能读取手机中各种传感器的数值,控制各种多媒体设备,从而实现让普通用户用C语言控制手机,编写出意想不到的适合自己使用的应用程序。v.2.7是目前的完善版本。遗憾的是该编译器是简单的,有些高级的东西就难以用它来实现。
下面的游戏代码就是用它在安卓手机上编写的,可制作成安卓手机桌面app应用程序。此样例可复制黏贴到编译器直接使用,亦可用 VB6 ,C++ ,  java  改写。

 

 

 

 

 

 

以下是源码:
//  最简单的 C 语言编程
//  myspringc  v2.7  可编译安卓本机 app 应用
//  此样例可复制黏贴到 myspringc  编译
//  此文档可用 VB,VC  ,  java 改写

//**************************************
//  《围棋》  打谱软件
// 双人对弈   人机对战                 
// 编制人:张纯叔    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;
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 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 hwdo ;    //黑白下子限定 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$;
 //************************

main(){
setDisplay(1);
  //cs.SetBackground(240,240,240);
  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,240,240,240);
   setButtonColor(255,240,240,240);
   setButtonTextColor(255,0,0,200);
   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]="test";
   nMenu[7]=207;
   sMenu[8]="退出";
   nMenu[8]=208;
   setMenu(200,myMenuProc,sMenu,nMenu,9);

   setTitle("围棋打谱软件 ver.1.1.6   ");
//*************************
  cs.SetProc (context, mycanvasProc);
      mode=0 ;  
      s7="游戏模式:双人对奕"; 
      wn=0 ;   //测试演示
      gn=0;    //round number
      hwdo=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,100,500);
         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){
            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){
            cal_force () ;      }   //计算势和判胜负

   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,220,220,220);  //擦除
       cs.DrawRect (480,825,630,860); //更新s3 s8
    cs.SetColor(255,0,0,180);
     cs.SetTextSize (24);
   cs.DrawText (s5,328,850); //提示选定棋子
   cs.DrawText (s8,560,850); //选定棋子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) ;     }  

//** 按数据演示
    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  ";

 //** 文件数据读取
    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) ;     }  }

//** 按数据演示
    fusum=dLen*2;   //dLen=20
    replay ();    //打谱
}//show_p1 ()

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

     if (fusum==0) return;
          // setDisplay (0);
      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 (){
//** 计算势,以势预判赢面,也可判胜负
  print "calculate Black & White force ..." ;
        //** 暂未完成此编写
}//cal_force ()

testAIq (){
  //** AI智能下子算法求解方案:
  //** 用于检测AI智能下子算法 testAIq ()
  //**围棋AI选子设计较难,理论上有许多专业术语,如开局定式,中盘战术,收官阶段。下子的术语有:小飞大飞尖立关跳断挖拆扳喷碰托压冲一间二间...不一而足。
 //** 人机对战AI选子,加权计算
  // for (i=1;i<=361;i++) { jqn[i]=0 ;    }      //scan init

 //** n 黑当前下子点位
    if (n==73&&pn[74]==0) sn=74 ;  
return;

   //遍历加权
  for (i=1;i<=19;i++){    //遍历scan 
  for (j=1;j<=19;j++){    
           k=(i-1)*19+j ;    //pn(n) number
            //scan 左右上下 
            //** 暂未完成编写
        }    }    //test scan i , j   pn(361) 棋盘点位

//******************************
//** 测试:显示加权计分情况,最高分白下子
   if (isDo==0) return ;
     cs.SetTextSize (16);
     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;      //定位
     dy=(i/19)*34+34;
       if (dx==0){ dx=19*34;    dy=dy-34;   }
               cs.DrawText (s,dx,dy) ;  //draw jqn(i)
          }     }
 
//** 计算最高分
      jqf=0 ;
 for (i=1;i<=361;i++){  
       k= jqn[i] ;
       if ( k>jqf) { jqf=k ;  jqfn=i ;   }
                 }   //计算最高分
 
       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,250,0);  
      cs.DrawCircle (dx,dy,5);  //标记下子点
         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 (hwdo==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;   
          hwdo=hwdo+1;
          if (hwdo>2) hwdo=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 (hwdo==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;    
          hwdo=hwdo+1;
          if (hwdo>2) hwdo=1;
          print dn," ",cordp,"    " , ss,row ;  //打印记录
            ss2=cordp;  
          dwn[dn]=n ;    //print play number
          fudat[dn]=n;    fusum=dn;  //复盘数据   
        board () ;
               }
 }//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,255,250,0);
      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);  //势click
         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);       }
  if (pn[i]==3){  // 提子
       cs.SetColor (255,250,220,220);  //mark
       cs.DrawCircle(dx, dy, 11);   }
                    }     //** draw chess pieces
    cs.SetColor (255,250,0,0);  //刚落子标记
       cs.DrawCircle(px,py,4);

 //** 提示选子
     cs.SetTextSize (34);
     cs.SetColor(155,255,200,250);
     cs.DrawRect (390,700,590,750);  //clean*
         cs.SetColor(255,0,0,250);  
    cs.DrawText (s6,415,735);    //提示选子
//** 打印游戏模式 s7
    cs.SetColor(55,240,240,240);
        cs.DrawRect (10,700,320,750);   //clean*
    if (mode==0) cs.SetColor(255,0,200,200);
    if (mode==1) 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 (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,0,180,180);  
     cs.SetTextStyle (0);
     cs.SetTextSize (24);
     ss=" 编制人:张纯叔   micelu@126.com " ;
         cs.DrawText (ss, 20, 1000);
          cs.DrawLine (10,970,710,970);
  cs.Update ();
//** 显示用时
    cs.SetTextStyle (0);
     cs.SetTextSize (26);
     cs.SetColor(255,0,200,200);
     cs.DrawText (ts,20,800);  //show start time
   // cs.DrawText (ts1,20,820);  //show end time
     showtime ( );   //显示用时
}//board ()

judge_winner (){
//*********************************
//detect Black White chess 判胜 
//*********************************
 //** 计算胜负:黑子计数贴 3又3/4 子,
 //** 计子大于等于185子即可判黑棋胜,少则白棋胜。
 //** 我国是计子,日韩是计目
     //**  计数方法待设计 >>>

return;
 //** show win flag  判胜负
showwin:    
       cs.SetTextStyle (0);
        cs.SetTextSize (16);
    if (pn[k]==1) {  //sum>=185子
        ss="黑棋胜  !";   print ss; 
        cs.SetColor(255,255,250,250);
        cs.DrawText (ss,655,(dn+2)*16);     }
     if (pn[k]==2) {   //sum>=177子
        ss="白棋胜  !";   print ss; 
        cs.SetColor(255,255,250,250);
        cs.DrawText (ss,655,(dn+2)*16);     }
     isDo=0;      //结束标志
}//judge_winner ()
 
gamestart (){
    setDisplay (1);  
 fname="/storage/emulated/0/go03.jpg";
 // cs.DrawBitmap(fname,0,0);  //加底图,启动页面
    cs.SetColor (255,255,255,255);  //清除记录
         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;    //计数清零
        hwdo=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=" ";
        board ();      //绘出棋板
  }//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,230,200);
        cs.DrawRect (390,760,590,810);   //clean**
    cs.SetColor(255,0,90,0);
         cs.DrawText (s3,413,798);
    cs.SetColor(255,255,0,0);
         cs.DrawText (s3,410,795);
    cs.SetFillMode (0);//0不填色,1填色
    cs.SetColor(255,250,250,0);
         cs.DrawText (s3,410,795);
     cs.SetFillMode (1);//0不填色,1填色
    cs.Update ();
 }//showtime ()

cut_piece (){      //** 提子,可选子连续清除
      if (isDo==1) {      //提子
            pn[n]=3 ;   
            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) hwdo=1 ; 
           if (dn-dn/2*2 != 0) hwdo=2 ;
                if (hwdo<1) hwdo=1 ;        
            board ();        }
 }//undo ()

replay (){    //复盘
      setDisplay (1);
      print "fusum= " ,fusum;
  //** 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 (200);     //延迟显示
               } //draw replay chess pieces         
  
        cs.SetTextStyle (0);
        cs.SetTextSize (30);
        cs.SetColor(255,0,80,180);     
        ss="💌🔊 打谱复盘演示完成";   //show status
        cs.DrawText (ss, 20, 840);  
        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){   //查看记录
         setDisplay (0);    
                }  
    if(nMen==206){  //显示棋板
         setDisplay (1);    
                }
    if(nMen==207){  //test
          setDisplay (0);    
              test1 ();    
            // board ();
                }
    if (nMen==208){  //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 ()