c编写五子棋游戏代码.docx
- 文档编号:9790777
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:15
- 大小:16.50KB
c编写五子棋游戏代码.docx
《c编写五子棋游戏代码.docx》由会员分享,可在线阅读,更多相关《c编写五子棋游戏代码.docx(15页珍藏版)》请在冰豆网上搜索。
c编写五子棋游戏代码
#defineN15
#defineB7
#defineSTOP-10000
#defineOK1
#defineNO0
#defineUP328
#defineDOWN336
#defineLEFT331
#defineRIGHT333
/*定义了两个数,n为棋盘的大小。
b为背景颜色的数值*/
inta[N+1][N+1];
intzx,zy;
intwrite=1,biaoji=0;
structzn{
longsum;
inty;
intx;
}w[N+1][N+1],max,max1;
voidcbar(inti,intx,inty,intr);
voidmap(inta[][]);
intgetkey();
intkey();
voidzuobiao(intx,inty,inti);
inttu(inta[][],intwrite);
intwtu(inta[][],intwrite);
intzhineng(inta[][]);
intzh5(inty,intx,inta[][]);
longzzh5(intb[][],inti);
main()
{
inti,j;
intgdriver=DETECT;
intgmode;
initgraph(&gdriver,&gmode,"");
zx=(N+1)/2;
zy=(N+1)/2;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
a[i][j]=0;
map(a);
i=1;
while(i)
{
intk,n;
k=wtu(a,write);
if(k==STOP)gotoend;
map(a);
n=zhineng(a);
if(n==STOP)gotoend;
map(a);
}
end:
;
}
/*实现对局的程序,计算全部N*N个格中,最应该填的格子*/
intzhineng(inta[N+1][N+1])
{
inti,j;
intk;
max.sum=-1;
for(i=0;i<=N;i++)
for(j=0;j<+N;j++)
{
w[i][j].sum=0;
w[i][j].x=i;
w[i][j].y=j;
}
for(i=1;i<=N-4;i++)
for(j=1;j<=N-4;j++)
{
k=zh5(i,j,a);
if(k==STOP)return(STOP);
}
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
if(max.sum { max.sum=w[i][j].sum; max.y=i; max.x=j; } elseif(max.sum==w[i][j].sum) { if(((max.y-zy)*(max.y-zy)+(max.x-zx)*(max.x-zx))>((i-zy)*(i-zy)+(j-zx)*(j-zx))) max.sum=w[i][j].sum; max.y=i; max.x=j; } } if(a[max.y][max.x]==0) { a[max.y][max.x]=-1; zy=max.y; zx=max.x; } } /*转换成5*5的数组,计算出在二十五个格子中,最应该填的格*/ intzh5(inty,intx,inta[N+1][N+1]) { inti,j; intb[6][6]; longc[13]; longd[6][6]; longtemp; for(i=y;i<=y+4;i++) for(j=x;j<=x+4;j++) b[i+1-y][j+1-x]=a[i][j]; c[1]=b[1][1]+b[1][2]+b[1][3]+b[1][4]+b[1][5]; c[2]=b[2][1]+b[2][2]+b[2][3]+b[2][4]+b[2][5]; c[3]=b[3][1]+b[3][2]+b[3][3]+b[3][4]+b[3][5]; c[4]=b[4][1]+b[4][2]+b[4][3]+b[4][4]+b[4][5]; c[5]=b[5][1]+b[5][2]+b[5][3]+b[5][4]+b[5][5]; c[6]=b[1][1]+b[2][1]+b[3][1]+b[4][1]+b[5][1]; c[7]=b[1][2]+b[2][2]+b[3][2]+b[4][2]+b[5][2]; c[8]=b[1][3]+b[2][3]+b[3][3]+b[4][3]+b[5][3]; c[9]=b[1][4]+b[2][4]+b[3][4]+b[4][4]+b[5][4]; c[10]=b[1][5]+b[2][5]+b[3][5]+b[4][5]+b[5][5]; c[11]=b[1][1]+b[2][2]+b[3][3]+b[4][4]+b[5][5]; c[12]=b[1][5]+b[2][4]+b[3][3]+b[4][2]+b[5][1]; for(i=1;i<=12;i++) { switch(c[i]) { case5: biaoji=1;return(STOP); case-5: biaoji=-1;return(STOP); case-4: c[i]=100000;break; case4: c[i]=100000;break; case-3: c[i]=150;break; case3: c[i]=150;break; case-2: c[i]=120;break; case2: c[i]=100;break; case-1: c[i]=1;break; case1: c[i]=1;break; default: c[i]=0; } } for(i=1;i<=12;i++) { if(c[i]==150) c[i]+=zzh5(b,i); } for(i=1;i<=5;i++) for(j=1;j<=5;j++) d[i][j]=0; for(i=1;i<=5;i++) for(j=1;j<=5;j++) { if(i==j)d[i][j]+=c[11]; if((i+j)==6)d[i][j]+=c[12]; d[i][j]+=c[i]+c[j+5]; } for(i=1;i<=5;i++) for(j=1;j<=5;j++) { if(b[i][j]! =0) d[i][j]=-2; } max1.sum=-1; max1.y=0; max1.x=0; for(i=1;i<=5;i++) for(j=1;j<=5;j++) { if(max1.sum { max1.sum=d[i][j]; max1.y=i; max1.x=j; w[i+y-1][j+x-1].sum+=max1.sum; } elseif(max1.sum==d[i][j]) { if(((i+y-1-zy)*(i+y-1-zy)+(j+x-1-zx)*(j+x-1-zx))>((max1.y+y-1-zy)*(max1.y+y-1-zy)+(max1.x+x-1-zx)*(max1.x+x-1-zx))) { max1.sum=d[i][j]; max1.y=i; max1.x=j; } } } } longzzh5(intb[6][6],intn) { inti,j,k,l,m; switch(n) { case1: i=b[1][1];j=b[1][2];k=b[1][3];l=b[1][4];m=b[1][5];break;case2: i=b[2][1];j=b[2][2];k=b[2][3];l=b[2][4];m=b[2][5];break; case3: i=b[3][1];j=b[3][2];k=b[3][3];l=b[3][4];m=b[3][5];break;case4: i=b[4][1];j=b[4][2];k=b[4][3];l=b[4][4];m=b[4][5];break;case5: i=b[5][1];j=b[5][2];k=b[5][3];l=b[5][4];m=b[5][5];break;case6: i=b[1][1];j=b[2][1];k=b[3][1];l=b[4][1];m=b[5][1];break;case7: i=b[1][2];j=b[2][2];k=b[3][2];l=b[4][2];m=b[5][2];break;case8: i=b[1][3];j=b[2][3];k=b[3][3];l=b[4][3];m=b[5][3];break;case9: i=b[1][4];j=b[2][4];k=b[3][4];l=b[4][4];m=b[5][4];break;case10: i=b[1][5];j=b[2][5];k=b[3][5];l=b[4][5];m=b[5][5];break;case11: i=b[1][1];j=b[2][2];k=b[3][3];l=b[4][4];m=b[5][5];break;case12: i=b[1][5];j=b[2][4];k=b[3][3];l=b[4][2];m=b[5][1];break;} if((i==0&&j==1&&k==1&&l==1&&m==0)) return(900); if((i==0&&j==-1&&k==-1&&l==-1&&m==0)) return(1000); if((i==0&&j==0&&k==1&&l==1&&m==1)||(i==1&&j==1&&k==1&&l==0&&m==0))return(20); if((i==0&&j==0&&k==-1&&l==-1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==0&&m==0)) return(20); if((i==-1&&j==1&&k==1&&l==1&&m==1)||(i==1&&j==-1&&k==1&&l==1&&m==1)||(i==1&&j==1&&k==-1&&l==1&&m==1)||(i==1&&j==1&&k==1&&l==-1&&m==1)||(i==1&&j==1&&k==1&&l==1&&m==-1)) return(-60); if((i==1&&j==-1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==-1&&m==1)) return(-60); } /*循环执行坐标的选择,直到按回车,空格或ESC键*/ intwtu(inta[N+1][N+1],intwrite) { inti=1; map(a); zuobiao(zx,zy,1); while(i) { intk; k=tu(a,write); if(k==OK)i=0; if(k==STOP)return(STOP); } } /*从键盘获得输入的值*/ intgetkey() { intkey,lo,hi; key=bioskey(0); lo=key&0x00ff; hi=(key&0xff00)>>8; return((lo==0)? hi+256: lo); } /*对获得的值进行判断*/ /*对应的码值分别如下*/ /*上: 328下: 336左: 331右: /*回车: 13ESC键: 27*/ intkey() { intk; k=getkey(); switch(k) { case27: return(STOP); case13: case'': return(OK); case328: return(UP); case336: return(DOWN); case331: return(LEFT);333*/ case333: return(RIGHT); default: return(NO); } } /*用来显示坐标的位置*/ voidzuobiao(intx,inty,inti) { intr; if(i! =0) { setcolor(GREEN); for(r=1;r<=5;r++) circle(75+25*x,25+25*y,r); } else { if(a[zy][zx]==1) { setcolor(8); for(r=1;r<=5;r++) circle(75+25*x,25+25*y,r); } elseif(a[zy][zx]==-1) { setcolor(WHITE); for(r=1;r<=5;r++) circle(75+25*x,25+25*y,r); } else { setcolor(B); for(r=1;r<=5;r++) circle(75+25*x,25+25*y,r); setcolor(RED);line(75+25*zx-5,25+25*zy,75+25*x+5,25+25*zy);line(75+25*zx,25+25*zy-5,75+25*zx,25+25*zy+5); } } } /*从键盘获得的值进行判断,反映在显示的图上*/ inttu(inta[N+1][N+1],intwrite) { intk; re: k=key(); if(k==OK) { if(a[zy][zx]==0) { a[zy][zx]=write; } else gotore; } if(k==STOP)return(STOP); if(k==NO)gotore; if(k==UP) { inti,j; if(zy==1)j=zy; elsej=zy-1; zuobiao(zx,zy,0); zuobiao(zx,j,1); zy=j; gotore; } if(k==DOWN) { inti,j; if(zy==N)j=zy; elsej=zy+1; zuobiao(zx,zy,0); zuobiao(zx,j,1); zy=j; gotore; } if(k==LEFT) { inti,j; if(zx==1)i=zx; elsei=zx-1; zuobiao(zx,zy,0); zuobiao(i,zy,1); zx=i; gotore; } if(k==RIGHT) { inti,j; if(zx==N)i=zx; elsei=zx+1; zuobiao(zx,zy,0); zuobiao(i,zy,1); zx=i; gotore; } } /*根据数组中(存储棋子位置)各位置的数,画实心圆(画出棋子)*/voidcbar(inti,intx,inty,intr) { if(i! =0) { if(i==1) setcolor(8); elseif(i==-1) setcolor(WHITE); for(i=1;i<=r;i++) { circle(x,y,i); } } } /*画出棋盘,和各个棋子*/ voidmap(inta[N+1][N+1]) { inti,j; cleardevice(); setbkcolor(B); setcolor(RED); for(i=0;i { line(100,50+25*i,75+N*25,50+25*i); line(100+25*i,50,100+25*i,25+N*25); } for(i=1;i<=N;i++) for(j=1;j<=N;j++) cbar(a[i][j],75+25*j,25+25*i,10); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编写 五子棋 游戏 代码