C语言五子棋代码
不知道做了多久了,断断续续写了快2星期了吧,今天终于下狠心把这个终结了。还是有很多bug (越界的时候会出错,有时候玩家赢了也没反应)
不过实在没耐性改了,写了这么久,也拿出来晾凉了。。。
pcthink函数可以自己改写,调整电脑下棋的智商。
不过写的很乱,注释没耐性写,估计大家也很难看懂,就娱乐一下,有兴趣的帮忙改下吧。毕竟bug 太多了;还有就是这个是在vc下做的 在TC下不行。。
准确的说是用2维数组建立一个棋盘,然后存到文件中,在执行操作后记录到文件中,清屏,然后再输出新的棋盘数据
整个思路大概就是这样
程序代码:
/*五子棋游戏*/ #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #define N 20 /*建立棋盘*/ creat(char g[N][N]) { FILE *fp; int i,j; fp=fopen ("game.txt","w"); for (i=0;i<N;i++) for (j=0;j<N;j++) { if (j==(N-1)) g[i][j]='|'; else if (i==(N-1)) g[i][j]='-'; else g[i][j]=' '; } g[0][0]=1; for (i=0;i<N;i++) fwrite (g+i,sizeof (char),N,fp); fclose (fp); return 1; } /*输出棋盘*/ print (char g[N][N]) { int i,j; FILE *fp; fp=fopen ("game.txt","rt"); for (i=0;i<N;i++) { fread (g+i,sizeof (char),N,fp); } for (i=0;i<N;i++) { for (j=0;j<N;j++) { putchar (g[i][j]); } printf ("\n"); } fclose (fp); return 1; } /*获取棋盘数据*/ getg(char g[N][N]) { FILE *fp; int i; fp=fopen ("game.txt","rt"); for (i=0;i<N;i++) fread (g+i,sizeof (char),N,fp); fclose (fp); } /*保存棋盘数据*/ save (char g[N][N]) { FILE *fp; int i; fp=fopen ("game.txt","wt"); for (i=0;i<N;i++) fwrite (g+i,sizeof (char),N,fp); fclose (fp); return (1); } /*左移光标*/ left (char g[N][N]) { int i,j; getg (g); for (i=0;i<N;i++) { for (j=0;j<N;j++) if (g[i][j]==1) break; if (g[i][j]==1) break; } g[i][j]=' '; while (g[i][--j]!=' '); g[i][j]=1; save (g); return 1; } /*右移光标*/ right(char g[N][N]) { int i,j; getg (g); for (i=0;i<N;i++) { for (j=0;j<N;j++) if (g[i][j]==1) break; if (g[i][j]==1) break; } g[i][j]=' '; while (g[i][++j]!=' '); g[i][j]=1; save (g); return 1; } /*上移光标*/ up(char g[N][N]) { int i,j; getg (g); for (i=0;i<N;i++) { for (j=0;j<N;j++) if (g[i][j]==1) break; if (g[i][j]==1) break; } g[i][j]=' '; for (i=i-1;i<N;i--) if (g[i][j]==' ') break; g[i][j]=1; save (g); return 1; } /*下移光标*/ down (char g[N][N]) { int i,j,flag; flag=0; getg (g); for (i=0;i<N;i++) { for (j=0;j<N;j++) if (g[i][j]==1) {flag=1;break;} if (flag==1) break; } g[i][j]=' '; for (i=i+1;i<N;i++) if (g[i][j]==' ') break; g[i][j]=1; save (g); return 1; } /*确认下子*/ go (char g[N][N]) { int i,j; getg (g); for (i=0;i<N;i++) { for (j=0;j<N;j++) if (g[i][j]==1) break; if (g[i][j]==1) break; } g[i][j]='x'; for (i=i+1;i<N;i++) if (g[i][j]==' ') break; g[i][j]=1; save (g); return 1; } /*刷新棋盘数据*/ renew (char g[N][N]) { getg (g); system("cls"); print (g); } /*电脑下棋*/ pcthink (char g[N][N]) { int i,j,n,t,x,y,x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,x7,y7,x8,y8,flag=0; int f[2]; getg(g); for (i=0;i<N;i++) for (j=0;j<N;j++) { n=0; x1=i; y1=j; if (g[x1][y1]=='o'||g[x1][y1]=='x') while (g[x1][y1]==g[++x1][++y1]) { n++; } if (g[x1][y1]==' '||g[x1][y1]==1) if (n>t) { t=n; x=i; y=j; flag=1; } n=0; x2=i;y2=j; if (g[x2][y2]=='o'||g[x2][y2]=='x') while (g[x2][y2]==g[++x2][y2]) { n++; } if (g[x2][y2]==' '||g[x2][y2]==1) if (n>t) { t=n; x=i; y=j; flag=2; } n=0; x3=i; y3=j; if (g[x3][y3]=='o'||g[x3][y3]=='x') while (g[x3][y3]==g[x3][++y3]) { n++; } if (g[x3][y3]==' '||g[x3][y3]==1) if (n>t) { t=n; x=i;y=j; flag=3; } n=0; x4=i; y4=j; if (g[x4][y4]=='x'||g[x4][y4]=='o') while (g[x4][y4]==g[++x4][--y4]) { n++; // if (y4<=1) break; } if (g[x4][y4]==' '||g[x4][y4]==1) if (n>t) { t=n; x=i; y=j; flag=4; } n=0; x5=i; y5=j; if (g[x5][y5]=='o'||g[x5][y5]=='x') while (g[x5][y5]==g[--x5][y5]) { n++; } if (g[x5][y5]==' '||g[x5][y5]==1) if (n>t) { t=n; x=i; y=j; flag=5; } n=0; x6=i; y6=j; if (g[x6][y6]=='o'||g[x6][y6]=='x') while (g[x6][y6]==g[x6][--y6]) { n++; } if (g[x6][y6]==' '||g[x6][y6]==1) if (n>t) { t=n; x=i; y=j; flag=6; } n=0; x7=i; y7=j; if (g[x7][y7]=='o'||g[x7][y7]=='x') while (g[x7][y7]==g[--x1][--y1]) { n++; } if (g[x7][y7]==' '||g[x7][y7]==1) if (n>t) { t=n; x=i; y=j; flag=7; } n=0; x8=i; y8=j; if (g[x8][y8]=='o'||g[x8][y8]=='x') while (g[x8][y8]==g[--x8][++y8]) { n++; } if (g[x8][y8]==' '||g[x8][y8]==1) if (n>t) { t=n; x=i; y=j; flag=8; } } switch (flag) { case 1:{while (g[++x][++y]!=' '&&g[x][y]!=1);if (g[x][y]==1){g[x][y]='o';while (g[++x][++y]!=' ');g[x][y]=1;}else g[x][y]='o';break;} case 2:{while (g[++x][y]!=' '&&g[x][y]!=1);if (g[x][y]==1){g[x][y]='o';while (g[++x][y]!=' ');g[x][y]=1;}else g[x][y]='o';break;} case 3:{while (g[x][++y]!=' '&&g[x][y]!=1);if (g[x][y]==1){g[x][y]='o';while (g[x][++y]!=' ');g[x][y]=1;}else g[x][y]='o';break;} case 4:{while (g[++x][--y]!=' '&&g[x][y]!=1);if (g[x][y]==1){g[x][y]='o';while (g[++x][--y]!=' ');g[x][y]=1;}else g[x][y]='o';break;} case 5:{while (g[--x][y]!=' '&&g[x][y]!=1);if (g[x][y]==1){g[x][y]='o';while (g[--x][y]!=' ');g[x][y]=1;}else g[x][y]='o';break;} case 6:{while (g[x][--y]!=' '&&g[x][y]!=1);if (g[x][y]==1){g[x][y]='o';while (g[x][--y]!=' ');g[x][y]=1;}else g[x][y]='o';break;} case 7:{while (g[--x][--y]!=' '&&g[x][y]!=1);if (g[x][y]==1){g[x][y]='o';while (g[--x][--y]!=' ');g[x][y]=1;}else g[x][y]='o';break;} case 8:{while (g[--x][++y]!=' '&&g[x][y]!=1);if (g[x][y]==1){g[x][y]='o';while (g[--x][++y]!=' ');g[x][y]=1;}else g[x][y]='o';break;} /* case 1:while (g[++x][++y]!=' ');g[x][y]='o';break; case 2:while (g[++x][y]!=' ');g[x][y]='o';break; case 3:while (g[x][++y]!=' ');g[x][y]='o';break; case 4:while (g[++x][--y]!=' ');g[x][y]='o';break; case 5:while (g[--x][y]!=' ');g[x][y]='o';break; case 6:while (g[x][--y]!=' ');g[x][y]='o';break; case 7:while (g[--x][--y]!=' ');g[x][y]='o';break; case 8:while (g[--x][++y]!=' ');g[x][y]='o';break; */ } save (g); renew (g); return ; } //判断胜利方和胜利 judge(char g[N][N]) { int i,j,n,t,x,y,x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,x7,y7,x8,y8,flag; int f[2]; getg(g); for (i=0;i<N;i++) { for (j=0;j<N;j++) { if (g[i][j]=='o') flag=1; if (g[i][j]=='x') flag=0; n=0; x1=i; y1=j; if (g[x1][y1]=='o'||g[x1][y1]=='x') while (g[x1][y1]==g[++x1][++y1]) { n++; } if (g[x1][y1]==' '||g[x1][y1]==1) if (n>t) { t=n; x=i; y=j; } n=0; x2=i; y2=j; if (g[x2][y2]=='o'||g[x2][y2]=='x') while (g[x2][y2]==g[++x2][y2]) { n++; } if (g[x2][y2]==' '||g[x2][y2]==1) if (n>t) { t=n; x=i; y=j; } n=0; x3=i; y3=j; if (g[x3][y3]=='o'||g[x3][y3]=='x') while (g[x3][y3]==g[x3][++y3]) { n++; } if (g[x3][y3]==' '||g[x3][y3]==1) if (n>t) { t=n; x=i;y=j; } n=0; x4=i; y4=j; if (g[x4][y4]=='x'||g[x4][y4]=='o') while (g[x4][y4]==g[++x4][--y4]) { n++; // if (y4<=1) break; } if (g[x4][y4]==' '||g[x4][y4]==1) if (n>t) { t=n; x=i; y=j; } n=0; x5=i; y5=j; if (g[x5][y5]=='o'||g[x5][y5]=='x') while (g[x5][y5]==g[--x5][y5]) { n++; } if (g[x5][y5]==' '||g[x5][y5]==1) if (n>t) { t=n; x=i; y=j; } n=0; x6=i; y6=j; if (g[x6][y6]=='o'||g[x6][y6]=='x') while (g[x6][y6]==g[x6][--y6]) { n++; } if (g[x6][y6]==' '||g[x6][y6]==1) if (n>t) { t=n; x=i; y=j; } n=0; x7=i; y7=j; if (g[x7][y7]=='o'||g[x7][y7]=='x') while (g[x7][y7]==g[--x1][--y1]) { n++; } if (g[x7][y7]==' '||g[x7][y7]==1) if (n>t) { t=n; x=i; y=j; } n=0; x8=i; y8=j; if (g[x8][y8]=='o'||g[x8][y8]=='x') while (g[x8][y8]==g[--x8][++y8]) { n++; } if (g[x8][y8]==' '||g[x8][y8]==1) if (n>t) { t=n; x=i; y=j; } if (t>=4) break; } if (t>=4) break;} f[0]=t; f[1]=flag; return (f); } /*移动光标方向选择*/ chos(char g[N][N]) { int flag; char ch; flag=0; switch (ch=getch()) { case 'w':up (g);break; case 'd':right (g);break; case 'a':left (g);break; case 's':down (g);break; case 13:go (g);flag=1;break; } renew (g); return (flag); } main() { char g[N][N]; int *f; creat (g); print (g); while (1) { if (chos(g)==1) pcthink (g); f=judge(g); if (f[0]>=4) { if (f[1]==1) { printf ("you lose "); break; } if (f[1]==0) printf ("you win!"); break; } } getch(); return 1; }
[ 本帖最后由 B_Y 于 2010-3-11 11:45 编辑 ]