最近写了一个五子棋的小游戏,是帮别人写的,算法什么的也没有优化,就是简单的实现了一个“双人模式”,水平很菜,见笑了:
源码:
#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();
}