简单的双人五子棋,在终端运行,通过输入坐标选择落子的位置。
源代码:
#include <stdio.h>
#define MAX 100
#define X 15 //行数
#define Y 15 //列数
#define WIN 1 //胜利标志
#define FAIL 0
int flag = 0;
int count = 0; //棋子步数
char tmpch[MAX];
//打印棋盘
void Print(char a[][Y+2],int x,int y,char ch)
{
a[x][y] = ch; //子落下
int i,j;
printf("\t\t%3c",' ');
for(j = 0;j < Y+2;j++)
{
printf ("%3d",j);
}
printf ("\n");
for (i = 0;i < X+2;i++) //打印棋盘
{
printf("\t\t%3d",i);
for (j = 0;j < Y+2;j++)
{
printf ("%3c",a[i][j]);
}
printf ("%3d\n",i);
}
printf("\t\t%3c",' ');
for(j = 0;j < Y+2;j++)
{
printf ("%3d",j);
}
printf ("\n");
}
//初始化棋盘
void Start(char a[][Y+2])
{
int i,j;
for(i = 0;i < X+2;i++)
{
if(i == 0 || i == X+1)
{
for(j = 0;j < Y+2;j++)
{
a[i][j] = '#'; //打印边界
}
}
else
{
a[i][0] = '#'; //打印边界
a[i][Y+1] = '#';
for (j = 1;j < Y+1;j++)
{
a[i][j] = '*'; //打印空棋盘
}
}
}
Print(a,0,0,'#');
}
//落子
int Move(char a[][Y+2])
{
char ch;//判断谁的局
if (flag == 0)
{
ch = 'A';
}
else
{
ch = 'B';
}
system("clear");
Print(a,0,0,'#');
printf ("\t\t%c请选择要下的子:\n",ch);
int x,y;
printf ("\t\t请输入行坐标x(1~%d):",X);
scanf ("%d",&x);
printf ("\t\t请输入列坐标y(1~%d):",Y);
scanf ("%d",&y);
if ((x >= 1 && x <= X) && (y >= 1 && y <= Y))
{
if (a[x][y] != '*')
{
printf ("\t\t此处有子\n");
printf ("\t\t输入回车键。。。");
fgets(tmpch,MAX,stdin);
fgets(tmpch,MAX,stdin);
return -1;
}
if(flag == 0) //判断是哪一家下的
{
system("clear");
Print(a,x,y,'A'); //落子并打印
flag = 1;
}
else
{
system("clear"); //落子并打印
Print(a,x,y,'B');
flag = 0;
}
count++; //记录步数
printf ("\t\t落子成功!\n");
printf ("\t\t输入回车键。。。");
fgets(tmpch,MAX,stdin);
fgets(tmpch,MAX,stdin);
return 0;
}
else
{
printf ("\t\t输入错误,请重新输入!\n");
printf ("\t\t输入回车键。。。");
fgets(tmpch,MAX,stdin);
fgets(tmpch,MAX,stdin);
return -1;
}
}
//判断胜负(五子相连为赢)
int Win(char a[][Y+2])
{
int i,j;
for (i = 1;i < X+1;i++)
{
for (j = 1;j < Y+1;j++)
{
if (a[i][j] != '*') //从有子的地方判断
{
int tmpi = i;
int tmpj = j;
int win = 0;
while(a[tmpi][tmpj] == a[tmpi][tmpj+1]) //判断横向是否赢了
{
tmpj = tmpj + 1;
win++;
if (win == 4)
{
return WIN;
}
}
tmpi = i;
tmpj = j;
win = 0;
while(a[tmpi][tmpj] == a[tmpi+1][tmpj]) //判断纵向是否赢了
{
tmpi = tmpi + 1;
win++;
if (win == 4)
{
return WIN;
}
}
tmpi = i;
tmpj = j;
win = 0;
while(a[tmpi][tmpj] == a[tmpi+1][tmpj+1]) //判断右下向是否赢了
{
tmpi = tmpi + 1;
tmpj = tmpj + 1;
win++;
if (win == 4)
{
return WIN;
}
}
tmpi = i;
tmpj = j;
win = 0;
while(a[tmpi][tmpj] == a[tmpi+1][tmpj-1]) //判断左下向是否赢了
{
tmpi = tmpi + 1;
tmpj = tmpj - 1;
win++;
if (win == 4)
{
return WIN;
}
}
}
}
}
return FAIL;
}
int main()
{
char ch;//判断谁的局
if (flag == 0)
{
ch = 'A';
}
else
{
ch = 'B';
}
char a[X+2][Y+2];
system("clear");
Start(a);
while (1)
{
Move(a);
if(Win(a)) //判断是否赢了
{
system("clear");
Print(a,0,0,'#');
printf ("\t\t%c赢了\n",ch);
break;
}
if(count == X*Y) //判断是否落满子
{
system("clear");
Print(a,0,0,'#');
printf ("\t\t子已落满\n");
break;
}
}
return 0;
}
欢迎大家对其进行改进,希望能一起交流。