五子棋C语言实现源码

最近写了一个五子棋的小游戏,是帮别人写的,算法什么的也没有优化,就是简单的实现了一个“双人模式”,水平很菜,见笑了:

源码:

#include<stdio.h>
char a[18][42]; //由+,-,| 符号组成
FILE *fp;
// PrintWelcomeInfo函数,用来打印欢迎信息
void PrintWelcomeInfo()
{
printf("================================================================================\n");
printf(" 五子棋小游戏 \n");
printf("游戏帮助:\n");
printf("1.游戏为两个玩家分别执子2.黑方先行3.当游戏结束后可以选择查看每一步\n");
printf("================================================================================\n");
}
//初始化棋盘的分布
void InitializeGame(char b[18][42])
{
int i,j;
for(i=0;i<18;i++)
{
for(j=0;j<42;j++)
{
if(i%2==0&&j%3==0)
{
b[i][j]='+';
}
else if(i%2!=0&&j%3==0)
{
b[i][j]='|';
}
else if(i%2==0&&j%3!=0)
{
b[i][j]='-';
}
else
{
b[i][j]=' ';
}
}
}
}
//绘制棋盘的分布,由+ - |组成的一个9*10的棋盘
void PrintGame(char b[18][42])
{
int i,j;
int y[9]={9,8,7,6,5,4,3,2,1};
for(i=0;i<18;i++)
{
printf("\t\t");
for(j=0;j<42;j++)
{
printf("%c",b[i][j]);
if(j==41&&i%2==0)
{
printf("%d\n",y[i/2]);
}
if(j==41&&i%2!=0)
{
printf("\n");
}

}
}
printf("\t\t");
printf("a b c d e f g h i j k l m n \n");//不要改,可能会导致打印的棋盘无法对齐
}
//判断输赢,每次输入信息后就判断当前是不是有一个玩家成五子
char PrintGameOverInfo()
{
int i,j;
for(i=0;i<18;i++)
{
for(j=0;j<42;j++)
{
if((a[i][j]=='b'&&a[i][j+3]=='b'&&a[i][j+6]=='b'&&a[i][j+9]=='b'&&a[i][j+12]=='b')||(a[i][j]=='b'&&a[i+2][j]=='b'&&a[i+4][j]=='b'&&a[i+6][j]=='b'&&a[i+8][j]=='b')||(a[i][j]=='b'&&a[i+2][j+3]=='b'&&a[i+4][j+6]=='b'&&a[i+6][j+9]=='b'&&a[i+8][j+12]=='b')||(a[i][j]=='b'&&a[i+2][j-3]=='b'&&a[i+4][j-6]=='b'&&a[i+6][j-9]=='b'&&a[i+8][j-12]=='b'))
{
return 'b';
}
if((a[i][j]=='w'&&a[i][j+3]=='w'&&a[i][j+6]=='w'&&a[i][j+9]=='w'&&a[i][j+12]=='w')||(a[i][j]=='w'&&a[i+2][j]=='w'&&a[i+4][j]=='w'&&a[i+4][j]=='w'&&a[i+6][j]=='w')||(a[i][j]=='w'&&a[i+2][j+3]=='w'&&a[i+4][j+6]=='w'&&a[i+6][j+9]=='w'&&a[i+8][j+12]=='w')||(a[i][j]=='w'&&a[i+2][j-3]=='w'&&a[i+4][j-6]=='w'&&a[i+6][j-9]=='w'&&a[i+8][j-12]=='w'))
{
return 'w';
}
}
}
}
//从文件qipu.txt读取保存的每一步的信息
void QiPu()
{
char t;
char buffer[100];
fp=fopen("qipu.txt","r");
printf("正在读取棋谱...\n");
while( fgets(buffer,20,fp)!=NULL)
{
printf("%s\n",buffer);
printf("显示下一步?<Y/N>:");
printf("\n");
scanf("%c",&t);
if(t=='N')
{
break;
}
}
}
//playGame的游戏的核心函数,用来控制用户的输入以及保存棋谱到qipu.txt
void playGame()
{
int x,y;
char x1,y1; //x1:黑子的x坐标,y1:黑子的y坐标
char x2,y2; ////x2:白子的x坐标,y2:白子的y坐标
while(1)
{

repeat_b: printf("请黑方参考棋盘坐标输入棋子的位置,示例:a,1\n:");
scanf("%c,%c",&x1,&y1);
fflush(stdin); //C语言清空输入缓冲区函数
printf("黑子位置(%c,%c)\n",x1,y1);
switch(x1)
{
case 'a': y=0;break;
case 'b': y=3;break;
case 'c': y=6;break;
case 'd': y=9;break;
case 'e': y=12;break;
case 'f': y=15;break;
case 'g': y=18;break;
case 'h': y=21;break;
case 'i': y=24;break;
case 'j': y=27;break;
case 'k': y=30;break;
case 'l': y=33;break;
case 'm': y=36;break;
case 'n': y=39;break;
default: printf("无法处理的错误");
}
switch(y1)
{
case '9': x=0;break;
case '8': x=2;break;
case '7': x=4;break;
case '6': x=6;break;
case '5': x=8;break;
case '4': x=10;break;
case '3': x=12;break;
case '2': x=14;break;
case '1': x=16;break;
default: printf("无法处理的错误");
}
if(a[x][y]=='+')
{
a[x][y]='b';//将该位置棋子置为B标记
PrintGame(a);
//将棋子每一步保存在文件中
fp=fopen("qipu.txt","a");
fprintf(fp,"黑子行%c,%c\n",x1,y1);
fclose(fp);


if(PrintGameOverInfo()=='b')//调用判断当前有没有黑子成五子,有就返回字符‘b’
{
char T;
printf("黑子胜!");
printf("是否查看棋谱?(Y/N):");
scanf("%c",&T);
fflush(stdin); //C语言清空输入缓冲区函数
if(T=='Y'||T=='y')
{
QiPu();
}
break; //注意这是针对while(1)这个死循环的break,也就是有人赢了的话就退出while
}//if(PrintGameOverInfo()=='b')
}//if(a[x][y]=='+')
else
{
printf("错误,请重新输入\n");
goto repeat_b;//这相当于一个标志, 如果用户输入的棋子坐标不对,就无条件转跳到最上面那个“repeat_b:”标记
}
repeat_w: printf("请白方参考棋盘坐标输入棋子的位置,示例:b,1\n:");
scanf("%c,%c",&x2,&y2);
fflush(stdin); //C语言清空输入缓冲区函数
printf("白子位置(%c,%c)\n",x2,y2);
switch(x2)
{
case 'a': y=0;break;
case 'b': y=3;break;
case 'c': y=6;break;
case 'd': y=9;break;
case 'e': y=12;break;
case 'f': y=15;break;
case 'g': y=18;break;
case 'h': y=21;break;
case 'i': y=24;break;
case 'j': y=27;break;
case 'k': y=30;break;
case 'l': y=33;break;
case 'm': y=36;break;
case 'n': y=39;break;
default: printf("无法处理的错误");
}
switch(y2)
{
case '9': x=0;break;
case '8': x=2;break;
case '7': x=4;break;
case '6': x=6;break;
case '5': x=8;break;
case '4': x=10;break;
case '3': x=12;break;
case '2': x=14;break;
case '1': x=16;break;
default: printf("无法处理的错误");
}
if(a[x][y]=='+')
{
a[x][y]='w';//将该位置棋子置为w标志
fp=fopen("qipu.txt","a");
fprintf(fp,"白子行%c,%c\n",x2,y2);

fclose(fp);

PrintGame(a);
if(PrintGameOverInfo()=='w')
{
char T;
printf("白子胜");
printf("是否查看棋谱?(Y/N)");
scanf("%c",&T);
if(T=='Y'||T=='y')
{
QiPu();
}
break;
}
}
else
{
printf("该位置已经存在棋子,请重新输入\n");
goto repeat_w;
}

}
printf("游戏结束!\n");

}
int main()
{
PrintWelcomeInfo();
InitializeGame(a);
PrintGame(a);
playGame();
}



posted @ 2011-12-25 21:16  Lamboy  阅读(2191)  评论(0编辑  收藏  举报