围棋打谱应用软件设计制作
五子棋游戏是大家耳熟能详的游戏,深受大众喜爱。可见其在智能游戏中的地位。我在本站发了好几篇文章介绍编制方法和算法。而类似的围棋游戏则是智能游戏的顶级存在。今在此基础上编制一款围棋打谱软件。当然这是简单的游戏程序,但也具备双人对战功能。
游戏设计有几个要素:
一是界面设计,也就是画出棋盘,更新棋盘;
二是黑白双方如何下子,即时棋盘显示;
三是程序要有提子功能和悔棋功能;
四是游戏过程记录,便于棋后打谱和复盘;
五是游戏模式设置,双人对弈和人机模式;
六是加游戏数据导入导出功能,用于打谱;
这六条是游戏的基本功能,其他功能可自行添加。
界面设计:有主屏幕棋板和功能按钮,另设下拉菜单
游戏功能设计:
一,界面设计,启动页面和游戏页面,更新屏幕显示
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 ()