小游戏之五子棋

简单的双人五子棋,在终端运行,通过输入坐标选择落子的位置。

源代码:

#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;
}






欢迎大家对其进行改进,希望能一起交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值