五子棋游戏程序设计制作
大家都玩过手机的小游戏吧。我是编程爱好者,喜欢动脑筋研究一些算法,编程做出小游戏程序,很有趣很有成就感。在学习VB6编程时就编制过钻石棋和伤脑筋十二块那样的游戏,都是标准Windows图形界面的。现在有空闲时就玩手机上编译手机游戏。
值此壬寅金虎新春之时,花了3天时间编制了这款五子棋游戏。因时间仓促只写了双人对奕的版本,以后有时间再编写人机对战的AI版本。游戏程序是用简单的C语言编制的,是安卓手机版图形界面的,全是用编译器绘图方法绘制的。算法很简单,棋盘是15乘以15点位,棋子编码就225个,每个棋子点位距40个屏幕基准点,(40,40,600,600)矩形区是棋子选取的触控区,将X,Y换算成棋子编码,画棋盘显示下子情况就棋子编码转换成X,Y坐标画出棋子。走子记录还没来得及写,以后有时间就补写。此程序现在就只有基本使用功能,主要就展示界面设计。今将此程序呈现给大家,望各位同好批评指正。
MySpringC是一个简化的C语言编译器。主要用于科学计算、个人娱乐和个性化的设备控制等场合。当前运行在Android平台上,是Android平台的一款应用。MySpringC可以书写简单的C语言程序,编写完成后可以编译、运行并获得结果。还可以做出安卓手机桌面app应用。
MySpringC支持的C与普通的C非常类似,程序从main开始,支持全局变量和局部变量,支持各种数据类型和常用的控制流。MySpringC它没有复杂、庞大的编程环境,只要你了解一点C或java,只需要一部手机,在家里、在公共汽车上任何方便的时候,就可以编写满足自己特定需求的小程序。
v.2.7是目前的完善版本。下面的游戏代码就是用它在安卓手机上编写的,可制作成安卓手机桌面app应用程序。此样例可复制黏贴到编译器直接使用,亦可用 VB ,VC, java 改写。
以下是源码:
// 最简单的 C 语言编程
// myspringc v2.7 可编译安卓本机 app 应用
// 此样例可复制黏贴到 myspringc 编译
// 此文档可用 VB,VC , java 改写
//**********************************
//****** 五子棋 Gobang *********
//**********************************
Canvas cs; //画布
string sBarDes[10];
int nBarId[10];
string sMenu[50];
int nMenu[50];
float src[4]; //ClearDraw (cls) clear screen
int size[2]; //load picture size
string s1,s2,s3,s4,s5,s6;
string s,ss,ss1,ss2,ss3;
int dx,dy; //draw X, Y
FileInput filebox; //file Input box
string fname; //filename
int i,j,t,k; //t = times
int pn[225]; // pieces 0=" " , 1=black , 2=white
int n; // 225 棋子 编码号
int px,py; // piece x,y
int context; //canvasProc 触控
int obj;
int id;
int event;
int dn; //下子计数
int isDo; //游戏操作控制 1=可下子,0=不可下
int kn;
string report;
int B,W; //detect win Black White
//**********
main(){
setDisplay(1);
cs.SetBackground(200,200,200);
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]=" ";
nBarId[5]=105;
setToolBarHeight(6);
setButtonTextSize(13);
setToolBarBackgroundColor(255,220,220,220);
setButtonColor(255,0,0,240);
setButtonTextColor(255,255,255,0);
setToolBar(100,myToolBarProc,sBarDes,nBarId,6);
setTitle("五子棋 (双人对奕) V.1.0.5 ");
//**********
cs.SetProc (context, mycanvasProc);
for (i=1;i<226;i++){ pn[i]=0; } //init pn
isDo=1; //游戏操作控制
s6="黑棋选子"; //init
px=320 ; py=320 ; //标记
board (); //绘出棋板
//draw title****
ss3="五子棋 (双人对奕)";
cs.SetTextSize (60);
cs.SetTextStyle (1);
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor(255,180,90,40);
cs.DrawText (ss3,104,504);
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.Update();
while (){}
}//main ()
mycanvasProc (int context,int obj,int id,int event,float x,float y){
kn=kn+1; //延时
if ((kn-kn/2*2)==0){ }else{ return; }
board (); //redraw board
//** get chess piece position X Y
if (x>40&&x<610&&y>40&&y<610){
px=(int)(x/40)*40; //取整数
py=(int)(y/40)*40;
s=intToString (px);
s1= "px = "+s;
s=intToString (py);
s2= "py = "+s;
dx=px/40; dy=py/40;
s=intToString (dx);
s3= "dx = "+s;
s=intToString (dy);
s4= "dy = "+s;
n=(dy-1)*15+dx; //pn number
s5="选定落子位 >> "+intToString (n);
cs.SetFillMode (0);//0不填色,1填色
cs.SetColor (255,250,0,0); //chess flag选子标记
cs.DrawRect (px-20,py-20,px+20,py+20);
}
//选子后落子缓冲按钮
if (isDo==1){ //可下子
if (x>100&&x<300&&y>900&&y<960){
pn[n]=1;
s6="白棋选子"; } //黑已下
if (x>400&&x<600&&y>900&&y<960){
pn[n]=2;
s6="黑棋选子"; } //白棋下
} //isDo==1
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor (255,230,230,230); //clear n
cs.DrawRect (530,770,600,810);
// cs.SetColor(255,255,0,0);
// cs.SetTextSize (24);
//cs.DrawText (s1,50,700); //测试
//cs.DrawText (s2,50,740);
//cs.DrawText (s3,200,700);
//cs.DrawText (s4,200,740);
cs.SetColor(255,0,0,180);
cs.SetTextSize (30);
cs.DrawText (s5,330,800);
cs.Update ();
}//mycanvasProc
board (){
// draw board grids 棋盘方格
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor (255,250,250,250); //backcolor
cs.DrawRect (0,0,720,850);
cs.SetColor (255,110,110,110); //pad
cs.DrawRect (10,10,637,638);
cs.SetColor (255,220,150,50); //pad
cs.DrawRect (8,8,632,632);
cs.SetColor (255,250,180,100); //pad
cs.DrawRect (20,20,620,620);
cs.SetFillMode (0);//0不填色,1填色
for (i=1;i<15;i++){ //draw grids
for (j=1;j<15;j++){
cs.SetColor (255,150,150,150); //grid color
cs.DrawRect(i*40-1,j*40-1,i*40+39,j*40+39);
cs.SetColor (255,250,250,250); //grid color
cs.DrawRect(i*40,j*40,i*40+40,j*40+40);
} }
cs.SetColor (255,0,0,0); // rectangle line
cs.DrawRect (21,21,620,620);
cs.DrawRect (20,20,620,620);
//draw flag points
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor (255,240,240,240); //pieces
cs.DrawCircle(160,160,5);
cs.DrawCircle(480,160,5);
cs.DrawCircle(160,480,5);
cs.DrawCircle(480,480,5);
cs.DrawCircle(320,320,5);
//draw button 绘制按钮
cs.SetColor (255,20,20,20);
cs.DrawRect (100,900,301,960);
cs.DrawRect (400,900,601,960);
cs.SetColor (255,250,0,0);
for (i=1;i<60;i++){
cs.SetColor (255,250-i*4,200-i*3,250-i*4);
cs.DrawLine (101,900+i,300,900+i);
cs.DrawLine (401,900+i,600,900+i);
}
cs.SetColor (255,250,250,250);
cs.DrawCircle (140,930,16);
cs.DrawCircle (440,930,16);
cs.SetColor (255,0,0,0);
cs.DrawCircle (140,930,15);
cs.SetColor(255,255,250,0);
cs.SetTextStyle (1);
cs.SetTextSize (32);
cs.DrawText ("黑子下",175,940);
cs.DrawText ("白子下",475,940);
//print title
cs.SetTextSize (80);
cs.SetTextStyle (1);
cs.SetColor (255,100,100,100);
cs.DrawText ("五子棋",50,770);
cs.DrawText ("Gobang",50,870);
cs.SetColor (255,220,220,220);
cs.DrawText ("五子棋",52,772);
cs.DrawText ("Gobang",52,872);
for (i=1;i<226;i++){
//draw chess pieces 画出已下黑白子
dx=(i-(i/15*15))*40;
dy=(i/15)*40+40;
if (dx==0){ dx=15*40; dy=dy-40; }
if (pn[i]==2){ //white
cs.SetColor (255,180,80,40); //piecesW
cs.DrawCircle(dx+2,dy+2,15);
cs.SetColor (255,220,220,220); //pieceW
cs.DrawCircle(dx,dy,15);
cs.SetColor (255,250,250,250); //pieceW
cs.DrawCircle(dx-5,dy-5,2); }
if (pn[i]==1){ //black
cs.SetColor (255,220,100,40); //piecesB
cs.DrawCircle(dx+1,dy+1,15);
cs.SetColor (255,0,0,0); //pieceB
cs.DrawCircle(dx,dy,15);
cs.SetColor (255,200,200,200); //pieceB
cs.DrawCircle(dx-5,dy-5,2); }
// s=intToString(i); //test...pnumber
// cs.SetTextSize (16);
//cs.SetColor (255,0,0,0);
//cs.DrawText (s,dx,dy);
} //draw chess pieces
cs.SetColor (255,240,0,0); //刚落子标记
cs.DrawCircle(px,py,5);
//提示选子
cs.SetTextSize (42);
cs.SetColor(255,255,120,250);
cs.DrawRect (390,670,600,740);
cs.SetColor(255,255,250,0);
cs.DrawText (s6,410,720);
cs.Update ();
detect ();
}//board ()
detect (){
//detect Black chess 判胜 ******
for (j=1;j<16;j++){
for (i=1;i<16;i++){
B=(i-1)*15+j ; //pn number
//********
if (pn[B]==1){
for (k=1;k<5;k++){
k=B;
if ( pn[k+1]==1&&pn[k+2]==1&&pn[k+3]==1&&pn[k+4]==1){ goto showwin ; } //右
if ( pn[k+15]==1&&pn[k+30]==1&&pn[k+45]==1&&pn[k+60]==1){ goto showwin ; } //下
if ( pn[k+16]==1&&pn[k+32]==1&&pn[k+48]==1&&pn[k+64]==1){ goto showwin ; } //右斜
if ( pn[k+14]==1&&pn[k+28]==1&&pn[k+42]==1&&pn[k+56]==1){ goto showwin ; } //斜左
} //next k
}
//*******
} } //next i, j
//detect White chess 判胜 ******
for (j=1;j<16;j++){
for (i=1;i<16;i++){
W=(i-1)*15+j ; //pn number
//********
if (pn[W]==2){
for (k=1;k<5;k++){
k=W;
if ( pn[k+1]==2&&pn[k+2]==2&&pn[k+3]==2&&pn[k+4]==2){ goto showwin ; } //右
if ( pn[k+15]==2&&pn[k+30]==2&&pn[k+45]==2&&pn[k+60]==2){ goto showwin ; } //下
if ( pn[k+16]==2&&pn[k+32]==2&&pn[k+48]==2&&pn[k+64]==2){ goto showwin ; } //右斜
if ( pn[k+14]==2&&pn[k+28]==2&&pn[k+42]==2&&pn[k+56]==2){ goto showwin ; } //斜左
} //next k
}
//*******
} } //next i, j
//*****************************
return;
//show win flag
showwin: // show win and put win flag
cs.SetTextSize (60);
if (pn[k]==1) ss="黑棋胜!!";
if (pn[k]==2) ss="白棋胜!!";
cs.SetTextStyle (1);
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor(255,180,90,40);
cs.DrawText (ss,204,504);
cs.SetColor(255,255,0,0);
cs.DrawText (ss,200,500);
cs.SetFillMode (0);//0不填色,1填色
cs.SetColor(255,250,250,0);
cs.DrawText (ss,200,500);
isDo=0;
}//detect ()
test (){ //测试,算法检测
for (i=1;i<226;i++){
n=i;
//dx=(n-(int)(n/15*15))*40;
//dy=((int)(n/15))*40+40;
dx=(n-(n/15*15))*40;
dy=(n/15)*40+40;
if (dx==0){ dx=15*40; dy=dy-40; }
print "chess num = ",n;
print " dx = ",dx;
print " dy = ",dy; }
}//test ()
myToolBarProc(int nBtn,int nContext){
if(nBtn==100){//开始游戏
for (i=1;i<226;i++){ pn[i]=0; }
setDisplay (1);
dn=0; //计数清零
isDo=1;
px=320 ; py=320 ;
board (); }
if(nBtn==101){//悔棋,可选子连续清除
if (isDo==1) pn[n]=0;
board (); }
if(nBtn==102){//查看走步
setDisplay (0);
print report;
}
if(nBtn==103){//显示图板
setDisplay (1);
}
if(nBtn==104){//退出程序
clearOutput();
cs.ClearDraw (0,src);
setDisplay (0);
exit (0); }
if(nBtn==105){//test 测试
//test ();
setDisplay (0); //关闭图板,查看测试
}
}//myToolBar ()
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 ();
//setDisplay (1);
// print "Load a picture";
// print fname;
}
}//loadpic ()
//**** End ********