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 编辑 ]








