当前位置: 首页 > news >正文

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

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

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

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

界面设计:有主屏幕棋板和功能按钮,另设下拉菜单
游戏功能设计:
一,界面设计,启动页面和游戏页面,更新屏幕显示
         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 ()

相关文章:

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

围棋打谱应用软件设计制作 五子棋游戏是大家耳熟能详的游戏&#xff0c;深受大众喜爱。可见其在智能游戏中的地位。我在本站发了好几篇文章介绍编制方法和算法。而类似的围棋游戏则是智能游戏的顶级存在。今在此基础上编制一款围棋打谱软件。当然这是简单的游戏程序&#xff0…...

论文笔记-WSDM2025-ColdLLM

论文笔记-WSDM2025-Large Language Model Simulator for Cold-Start Recommendation ColdLLM&#xff1a;用于冷启动推荐的大语言模型模拟器摘要1.引言2.前言3.方法3.1整体框架3.1.1行为模拟3.1.2嵌入优化 3.2耦合漏斗ColdLLM3.2.1过滤模拟3.2.2精炼模拟 3.3模拟器训练3.3.1LLM…...

线代[8]|北大丘维声教授《怎样学习线性代数?》(红色字体为博主注释)

文章目录 说明一、线性代数的内容简介二、学习线性代数的用处三、线性代数的特点四、学习线性代数的方法五、更新时间记录 说明 文章中红色字体为博主敲录完丘教授这篇文章后所加&#xff0c;刷到这篇文章的读者在首次阅读应当跳过红色字体&#xff0c;先通读一读文章全文&…...

使用 C++ 和 gRPC 的常见陷阱及解决方案

文章目录 1. 环境配置的陷阱1.1 依赖版本冲突或混淆1.2 gRPC 工具缺失 2. 编译和链接的陷阱2.1 运行时库不匹配&#xff08;/MT vs /MD&#xff09;2.2 未解析的外部符号 3. Protobuf 文件生成的陷阱3.1 工具版本不匹配3.2 生成文件运行时库不一致 4. 运行时的陷阱4.1 缺少 DLL…...

《深度学习实战》第2集:卷积神经网络(CNN)与图像分类

《深度学习实战》第2集&#xff1a;卷积神经网络&#xff08;CNN&#xff09;与图像分类 引言 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是深度学习在计算机视觉领域的核心工具。从早期的 LeNet 到现代的 ResNet 和 Vision Transformer&#xf…...

AD(Altium Designer)器件封装——立创商城导出原理图和PCB完成器件封装操作指南

目录 1、立创商城下载原理图和PCB图 1.1 打开立创商城 1.2 寻找所需器件 1.3 确定所需芯片 1.4 打开原理图和PCB图 1.5 导出原理图 1.6 确定导出为AD文件 1.7 下载成功 1.8 导出PCB 1.9 确定导出为AD文件 1.10 原理图PCB下载成功 2、原理图和PCB图预处理 2.1 复制…...

DeepSeek掘金——调用DeepSeek API接口 实现智能数据挖掘与分析

调用DeepSeek API接口:实现智能数据挖掘与分析 在当今数据驱动的时代,企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台,提供了强大的API接口,帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用D…...

LangChain系列:精通LangChain的合并文档链

LangChain的合并链旨在解决语言模型处理长文本时的上下文限制问题&#xff0c;包含Stuff、MapReduce、Refine和Rerank四种策略。Stuff链通过简单拼接文档块实现快速处理&#xff0c;适用于短文本但受限于模型token容量&#xff1b;MapReduce链采用分治思想&#xff0c;先独立处…...

rtcwake - Linux下定时唤醒计算机

rtcwake 是一个用于通过实时时钟&#xff08;RTC&#xff09;唤醒计算机的工具。它常用于在 Linux 系统中设置计算机在指定时间自动唤醒或关闭。以下是对命令 rtcwake -m off -s ${sleep_time} 的详细解析&#xff1a; 命令解析 bash复制 rtcwake -m off -s ${sleep_time} 1…...

MATLAB在投资组合优化中的应用:从基础理论到实践

引言 投资组合优化是现代金融理论中的核心问题之一&#xff0c;旨在通过合理配置资产&#xff0c;实现风险与收益的最佳平衡。MATLAB凭借其强大的数学计算能力和丰富的金融工具箱&#xff0c;成为投资组合优化的理想工具。本文将详细介绍如何使用MATLAB进行投资组合优化&#…...

什么是“可迭代”

在 Python 中&#xff0c;“可迭代”&#xff08;Iterable&#xff09;是一个非常重要的概念&#xff0c;它指的是任何可以被逐个访问其元素的对象。换句话说&#xff0c;如果一个对象支持迭代操作&#xff08;比如可以通过 for 循环逐个访问其元素&#xff09;&#xff0c;那么…...

Python天梯赛10分题-念数字、求整数段和、比较大小、计算阶乘和

007-念数字 输入一个整数&#xff0c;输出每个数字对应的拼音。当整数为负数时&#xff0c;先输出fu字。十个数字对应的拼音如下&#xff1a; 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu输入格式&#xff1a; 输入在一行中给出一个整数&#xff0c;如&…...

C#初级教程(6)——函数:从基础到实践

一、函数的核心价值&#xff1a;简化与复用代码 以游戏开发项目为例&#xff0c;在游戏中&#xff0c;角色的移动、攻击等行为并非只在单一场景中出现。设想一下&#xff0c;若每次需要角色执行这些行为时&#xff0c;都要重新编写对应的代码&#xff0c;那将是何等繁琐且易错的…...

【Bluedroid】AVRCP 连接源码分析(一)

一、AVRCP协议简介 AVRCP(Audio/Video Remote Control Profile)是蓝牙协议栈中的一个重要部分,它定义了蓝牙设备之间的音视频传输控制的流程和特点。AVRCP使得用户可以通过一个蓝牙设备(如手机)远程控制另一个蓝牙设备(如蓝牙耳机或音箱)上的音视频播放,如播放、暂停、…...

编程考古-忘掉它,Delphi 8 for the Microsoft .NET Framework

忘掉它吧&#xff0c;作一篇记录&#xff01; 【圣何塞&#xff0c;加利福尼亚 – 2003年11月3日】在今日的Borland开发者大会上&#xff0c;Borland正式推出了Delphi 8 for Microsoft .NET Framework。这款新版本旨在为Delphi开发者提供一个无缝迁移路径&#xff0c;将现有的…...

Linux-Ansible基础模块

文章目录 模块Command模块Shell模块Script模块 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Linux专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年02月22日19点21分 模块 Command模块 Command模块实践 ansible 192.168.1.100 -m com…...

正则表达式–断言

原文地址&#xff1a;正则表达式–断言 – 无敌牛 欢迎参观我的个人博客&#xff1a;正则表达式特殊字符 – 无敌牛 断言assertions 1、(?...)&#xff1a;正向预查&#xff08;positive lookahead&#xff09;&#xff0c;表示某个字符串后面应该跟着什么。但这个字符串本身…...

Swiper插件的运用和学习

Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 Swiper 是目前最流行的免费开源轮播组件之一&#xff0c;它功能强大、高度可定制且兼容性好&#xff0c;支持移动端手势操作和丰富的交互动画。 下载Swiper压缩包 轮播图演示页面。可以看见各种不同切换效果的轮播图 然后解压…...

标准I/O与文件I/O

一、概念 标准IO&#xff1a;标准IO是指程序与标准输入&#xff08;stdin&#xff09;、标准输出&#xff08;stdout&#xff09;和标准错误&#xff08;stderr&#xff09;之间的输入输出操作。通常用于与用户交互或输出调试信息。文件IO&#xff1a;文件IO是指程序与文件系统…...

JavaScript函数-函数的参数

在JavaScript编程语言中&#xff0c;函数是组织代码和实现复杂逻辑的基本单元。而函数参数则是这些功能的重要组成部分&#xff0c;它们允许我们将数据传递给函数&#xff0c;从而使得函数更加通用和灵活。本文将深入探讨JavaScript函数参数的各种特性及其最佳实践。 参数基础…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...