C语言五子棋代码

初始化棋盘:

void init()//初始化 
{
	for (int i = 0; i < 19; i++) for (int j = 0; j < 19; j++) map[i][j] = 0;//将棋盘初始化为0 
	flag=0;//将回合数初始化为0 
}

判断是否胜利:

int isWin(int x,int y)//判断是否胜利 
{
	int dir[4][4]={//前面两个是x和y相对初始位置 。后面两个是x和y每次变化的情况 
		{0,-4,0,1},//从上到下 
		{-4,-4,1,1},//从左上到右下 
		{-4,0,1,0},//从左到右
		{-4,4,1,-1},//从左下到右上 
};
	int cnt=0;//定义计数器 
	for(int i=0;i<4;i++)//上下左右四个方向都要判断 
	{
		cnt=0;
		for(int j=dir[i][0],k=dir[i][1],n=0;n<9;j+=dir[i][2],k+=dir[i][3],n++)//j代表x坐标,k代表y坐标,一共要判断9次,最后一栏是每次增加的情况 
		{
			if(x+j>=19||y+k>=19||x+j<0||y+k<0)//判断是否越界 
			{
				continue;//越界则继续 
			}
			if(map[x+j][y+k]==(flag%2)+1)//判断当前位置的上下左右斜是否有相同颜色的棋子 
			{
				cnt++;//如果有则计数器+1 
				if(cnt==5)//判断是否胜利 
			{
				return (flag%2)+1;//胜利则返回胜利一方的棋子代数(黑子偶数回合,奇数代表黑子,所以%后加1) 
				}
			}else{
				cnt=0;//如果中间有间断则计数器清零 
			}
		}
	}
	return 0;
}

判断落子情况:

int playerMove(int x,int y)//判断此处是否有落子 
{
	if(map[x][y])
	{
		return 0;
	}
	map[x][y]=(flag%2)+1;//没有落子则此处变成对应颜色 
	return 1;
}

展示落子情况以及打印棋盘:

int playerMove(int x,int y)//判断此处是否有落子 
{
	if(map[x][y])
	{
		return 0;
	}
	map[x][y]=(flag%2)+1;//没有落子则此处变成对应颜色 
	return 1;
}
void gameView_ShowMap(){//展示落子情况 ,以及打印棋盘 
	for (int i = 0; i < 19; i++) {
		for (int j = 0; j < 19; j++) {
			if((i==0&&j==0))
			{
				printf("┌");
			 }
			else if(i==0&&j==18)
			 {
			 	printf("┐");
			 }
			 else if(i==18&&j==0)
			 {
			 	printf("└");
			 }
			 else if(i==18&&j==18)
			 {
			 	printf("┘");
			 }
			 else if(i==0&&(j!=0)&&(j!=18))
			 {
			 	printf("一");
			 }
			 else if((i!=0)&&j==0&&(i!=18))
			 {
			 	printf("|");
			 }
			  else if((i!=0)&&j==18&&(i!=18))
			 {
			 	printf("|");
			 }
			  else if(i==18&&(j!=0)&&(j!=18))
			 {
			 	printf("一");
			 }
			else{
				printf(map[i][j] == 0 ? "十" : map[i][j] == 1 ? "龘" : "口");//画图,先判断是否有落子,再判断是黑子还是白子 
	}
}
	printf("\n");
	}
}
v

胜利展示:

void winView()//胜利展示 
{
	printf((flag%2)==0?"黑子胜利\n":"白子胜利\n");
}

游戏进行:

void gameView()
 {
 	init();
 	int x=0,y=0;
 	while(1)
 	{
 		gameView_ShowMap();//打印地图 
 		printf((flag%2)==0?"黑棋落子":"白棋落子");
 		printf("请输入xy的坐标(空格分格如:3 6):");
 		scanf("%d%d",&x,&y);
 		if(!playerMove(x,y))//判断时候能够落子 
 		{
 			printf("这里不能落子,请从新输入\n");
 			continue;
		 }
		if(isWin(x, y))//判断是否胜利 
		{
			gameView_ShowMap();//打印棋盘 
			winView();//胜利展示 
			return;//结束 
		}
		flag++;//否则就回合数加一 
	 }
  }

菜单:

  void menuView()//整体菜单,我觉得放在主函数更加合适 
{
	int choose=0;
	while(1)
	{
		printf("输入1进入游戏界面\n输入2进入设置界面\n输入0退出游戏\n");
		scanf("%d",&choose);
		switch(choose)//选择开关 
		{
			case 1:{
				gameView();//进入游戏 
				break;
			}
			case 2:{
				printf("敬请期待......\n");
				break;
			}
			case 0:{
				exit(0);//退出
			}
		}
	}
	putchar('\n');
	putchar('\n');
	putchar('\n');
 }

最后是整体的代码:

#pragma warning(disable: 4996)
#include <stdio.h>
#include <stdlib.h>
int map[19][19];//定义一个棋盘 
int flag=0;//定义回合 
void init()//初始化 
{
	for (int i = 0; i < 19; i++) for (int j = 0; j < 19; j++) map[i][j] = 0;//将棋盘初始化为0 
	flag=0;//将回合数初始化为0 
}
int isWin(int x,int y)//判断是否胜利 
{
	int dir[4][4]={//前面两个是x和y相对初始位置 。后面两个是x和y每次变化的情况 
		{0,-4,0,1},//从上到下 
		{-4,-4,1,1},//从左上到右下 
		{-4,0,1,0},//从左到右
		{-4,4,1,-1},//从左下到右上 
};
	int cnt=0;//定义计数器 
	for(int i=0;i<4;i++)//上下左右四个方向都要判断 
	{
		cnt=0;
		for(int j=dir[i][0],k=dir[i][1],n=0;n<9;j+=dir[i][2],k+=dir[i][3],n++)//j代表x坐标,k代表y坐标,一共要判断9次,最后一栏是每次增加的情况 
		{
			if(x+j>=19||y+k>=19||x+j<0||y+k<0)//判断是否越界 
			{
				continue;//越界则继续 
			}
			if(map[x+j][y+k]==(flag%2)+1)//判断当前位置的上下左右斜是否有相同颜色的棋子 
			{
				cnt++;//如果有则计数器+1 
				if(cnt==5)//判断是否胜利 
			{
				return (flag%2)+1;//胜利则返回胜利一方的棋子代数(黑子偶数回合,奇数代表黑子,所以%后加1) 
				}
			}else{
				cnt=0;//如果中间有间断则计数器清零 
			}
		}
	}
	return 0;
}
int playerMove(int x,int y)//判断此处是否有落子 
{
	if(map[x][y])
	{
		return 0;
	}
	map[x][y]=(flag%2)+1;//没有落子则此处变成对应颜色 
	return 1;
}
void gameView_ShowMap(){//展示落子情况 ,以及打印棋盘 
	for (int i = 0; i < 19; i++) {
		for (int j = 0; j < 19; j++) {
			if((i==0&&j==0))
			{
				printf("┌");
			 }
			else if(i==0&&j==18)
			 {
			 	printf("┐");
			 }
			 else if(i==18&&j==0)
			 {
			 	printf("└");
			 }
			 else if(i==18&&j==18)
			 {
			 	printf("┘");
			 }
			 else if(i==0&&(j!=0)&&(j!=18))
			 {
			 	printf("一");
			 }
			 else if((i!=0)&&j==0&&(i!=18))
			 {
			 	printf("|");
			 }
			  else if((i!=0)&&j==18&&(i!=18))
			 {
			 	printf("|");
			 }
			  else if(i==18&&(j!=0)&&(j!=18))
			 {
			 	printf("一");
			 }
			else{
				printf(map[i][j] == 0 ? "十" : map[i][j] == 1 ? "龘" : "口");//画图,先判断是否有落子,再判断是黑子还是白子 
	}
}
	printf("\n");
	}
}
void winView()//胜利展示 
{
	printf((flag%2)==0?"黑子胜利\n":"白子胜利\n");
}
 void gameView()
 {
 	init();
 	int x=0,y=0;
 	while(1)
 	{
 		gameView_ShowMap();//打印地图 
 		printf((flag%2)==0?"黑棋落子":"白棋落子");
 		printf("请输入xy的坐标(空格分格如:3 6):");
 		scanf("%d%d",&x,&y);
 		if(!playerMove(x,y))//判断时候能够落子 
 		{
 			printf("这里不能落子,请从新输入\n");
 			continue;
		 }
		if(isWin(x, y))//判断是否胜利 
		{
			gameView_ShowMap();//打印棋盘 
			winView();//胜利展示 
			return;//结束 
		}
		flag++;//否则就回合数加一 
	 }
  }
  void menuView()//整体菜单,我觉得放在主函数更加合适 
{
	int choose=0;
	while(1)
	{
		printf("输入1进入游戏界面\n输入2进入设置界面\n输入0退出游戏\n");
		scanf("%d",&choose);
		switch(choose)//选择开关 
		{
			case 1:{
				gameView();//进入游戏 
				break;
			}
			case 2:{
				printf("敬请期待......\n");
				break;
			}
			case 0:{
				exit(0);//退出
			}
		}
	}
	putchar('\n');
	putchar('\n');
	putchar('\n');
 }
int main()
{
	menuView();
	return 0;	
} 

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值