成都创新互联网站制作重庆分公司

【C语言】你还不会做三子棋?-创新互联

目录

创新互联是一家专业提供青川企业网站建设,专注与网站设计、成都做网站、html5、小程序制作等业务。10年已为青川众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。

整段代码

主函数(程序思路)

用随机函数产生的随机值来充当电脑下棋的坐标(用时间作为随机函数的变量)。

我们首先定义一个二位数组,用来存放棋盘。一个变量a来接受玩家的选择。

使用do-while循环来实现多次对局(不然只能玩一次就结束了)。

使用switch搭配a来实现菜单的选择。选择1,进行游戏。选择0,退出。输入其他选项,提示用户选择正确的选项。

生成棋盘。后打印棋盘(生成棋盘函数)。

玩家下棋环节(玩家行动函数)。

显示玩家\电脑活动后的棋盘(显示棋盘函数)。

判断是否出现胜利者。若是,则显示获胜者消息,否则继续(判断输赢函数)。

电脑下棋环节(电脑行动函数)。

显示玩家\电脑活动后的棋盘(显示棋盘函数)。

判断是否出现胜利者。若是,则显示获胜者消息,否则继续(判断输赢函数)。

所用函数 

菜单函数

生成棋盘函数

显示棋盘函数 

玩家下棋函数

电脑下棋函数

判断输赢函数

显示赢家函数 


整段代码

废话不多说直接上整段代码!!!

#define _CRT_SECURE_NO_WARNINGS
#include#include#include#define ROW 3
#define COL 3
int winner(char ret)
{
	if (ret == '*')
	{
		return 1;
	}
	if (ret == '#')
	{
		return 2;
	}
	if (ret == 'p')
	{
		return 3;
	}
}
void menu()
{
	printf("**********************\n");
	printf("*****1.开始游戏*******\n");
	printf("*****0.退出        ***\n");
	printf("**********************\n");
}

void bord(char arr[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i< row; i++)
	{
		for (j = 0; j< col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}
void dis_bord(char arr[ROW][COL], int row, int col)
{
	int i, j;
	j = 0;
	for (i = 0; i< row; i++)
	{
		printf(" %c| %c| %c\n", arr[i][0], arr[i][1], arr[i][2]);
		if (j< col - 1)
		{
			printf("--|--|--\n");
			j++;
		}
	}
}


void player_move(char arr[ROW][COL], int row, int col)//玩家下棋的函数
{
	int x, y;
	printf("请输入要下棋子坐标(行 列)\n");
	scanf("%d%d", &x, &y);
	while (1)//用while循环不断判断玩家是否输入了正确的坐标
	{
		if (arr[x - 1][y - 1] == ' ')
		{
			arr[x - 1][y - 1] = '*';
			break;//如果输入了正确的坐标,则跳出循环
		}
		else//否则提示重新输入正确坐标后再一次进入循环
		{
			printf("请输入正确的坐标\n");
			scanf("%d%d", &x, &y);
			continue;

		}
	}
}
void computer_move(char arr[ROW][COL], int row, int col)//电脑下棋的函数
{
	printf("电脑下\n");
	int i, j;
	while (1)//判断电脑下棋的坐标是否正确
	{
		int i, j;
		i = rand() % row;//用了随机函数,将获得的随机值跟棋盘大小取余,就能将值的范围控制在0~(棋盘大小-1,此处是0~2)
		j = rand() % col;
		//判断占用
		if (arr[i][j] == ' ')//判断电脑下的位置是否有棋子占用
		{
			arr[i][j] = '#';
			break;
		}

	}
}
char wether_win(char arr[ROW][COL], int row, int col)//判断输赢的函数
{
	int i = 0, j = 0;
	while (1)//此处的while好像没有什么作用
	{
		for (i = 0; i< row; i++)//用for循环实现行(hang)的扫描
		{
			if (arr[i][0] == arr[i][1] && arr[i][2] == arr[i][1] && arr[i][0] == '*')//如果一行中有三个*则返回*
			{
				return'*';
				break;
			}
			else
			{
				if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
					if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
						if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
						{
							return 'p';
						}
			}
		}
		for (j = 0; j< col; j++)
		{
			if (arr[0][j] == arr[1][j] && arr[2][j] == arr[1][j] && arr[0][j] == '*')
			{

				return'*';
				break;
			}
			else
			{
				if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
					if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
						if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
						{
							return 'p';
						}
			}
		}
		if (arr[0][0] == arr[1][1] && arr[2][2] == arr[1][1] && arr[0][0] == '*')
		{

			return'*';
			break;
		}
		else
		{
			if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
				if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
					if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
					{
						return 'p';
					}
		}

		if (arr[0][2] == arr[1][1] && arr[2][0] == arr[1][1] && arr[0][2] == '*')
		{
			return'*';
			break;
		}
		else
		{
			if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
				if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
					if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
					{
						return 'p';
					}
		}
		for (i = 0; i< row; i++)
		{
			if (arr[i][0] == arr[i][1] && arr[i][2] == arr[i][1] && arr[i][0] == '#')
			{
				return'#';
				break;
			}
			else
			{
				if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
					if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
						if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
						{
							return 'p';
						}
			}
		}
		for (j = 0; j< col; j++)
		{
			if (arr[0][j] == arr[1][j] && arr[2][j] == arr[1][j] && arr[0][j] == '#')
			{
				return'#';
				break;
			}
			else
			{
				if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
					if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
						if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
						{
							return 'p';
						}
			}
		}
		if (arr[0][0] == arr[1][1] && arr[2][2] == arr[1][1] && arr[0][0] == '#')
		{
			return'#';
			break;
		}
		else
		{
			if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
				if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
					if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
					{
						return 'p';
					}

		}
		if (arr[0][2] == arr[1][1] && arr[2][0] == arr[1][1] && arr[0][2] == '#')
		{
			return'#';
			break;
		}
		else
		{
			if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
				if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
					if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
					{
						return 'p';
					}
		}
		break;
	}
	return 0;
}

int main()
{
	srand((unsigned int)time(NULL));
	int a; int ret = 0; int ret1 = 0;
	char arr[ROW][COL]={0};//定义一个二维数组
	do
	{
		menu();//打印一个菜单
		scanf("%d", &a);//输入选项
		switch (a)//选择结构
		{
		case 1://开始游戏选项
			bord(arr, ROW, COL);//棋盘初始化
			dis_bord(arr, ROW, COL);//打印一个棋盘
			while (1)//下棋环节
			{
				player_move(arr, ROW, COL);
				dis_bord(arr, ROW, COL); 
				char ret= wether_win(arr, ROW, COL);
				ret1=winner(ret);
				computer_move(arr, ROW, COL);
				dis_bord(arr, ROW, COL);
				ret=wether_win(arr,ROW,COL);
				ret1 = winner(ret);
				if (ret1 == 1)
				{
					printf("玩家获胜\n");
					break;
				}
				if (ret1 == 2)
				{
					printf("电脑获胜\n");
					break;
				}
				if (ret1 == 3)
				{
					printf("平局");
				}
			}
			break;
		case 0://退出选项
			printf("拜拜\n");
			break;
		default:
			printf("请选择正确的选项\n");//提示用户输入正确的值
			break;
		}	
	} while (a);
	return 0;
}
主函数(程序思路) 用随机函数产生的随机值来充当电脑下棋的坐标(用时间作为随机函数的变量)。 我们首先定义一个二位数组,用来存放棋盘。一个变量a来接受玩家的选择。 使用do-while循环来实现多次对局(不然只能玩一次就结束了)。 使用switch搭配a来实现菜单的选择。选择1,进行游戏。选择0,退出。输入其他选项,提示用户选择正确的选项。 生成棋盘。后打印棋盘(生成棋盘函数)。 玩家下棋环节(玩家行动函数)。 显示玩家\电脑活动后的棋盘(显示棋盘函数)。 判断是否出现胜利者。若是,则显示获胜者消息,否则继续(判断输赢函数)。 电脑下棋环节(电脑行动函数)。 显示玩家\电脑活动后的棋盘(显示棋盘函数)。 判断是否出现胜利者。若是,则显示获胜者消息,否则继续(判断输赢函数)。
int main()
{
	srand((unsigned int)time(NULL));
	int a; int ret = 0; int ret1 = 0;
	char arr[ROW][COL]={0};//定义一个二维数组
	do
	{
		menu();//打印一个菜单
		scanf("%d", &a);//输入选项
		switch (a)//选择结构
		{
		case 1://开始游戏选项
			bord(arr, ROW, COL);//棋盘初始化
			dis_bord(arr, ROW, COL);//打印一个棋盘
			while (1)//下棋环节
			{
				player_move(arr, ROW, COL);
				dis_bord(arr, ROW, COL); 
				char ret= wether_win(arr, ROW, COL);
				ret1=winner(ret);
				computer_move(arr, ROW, COL);
				dis_bord(arr, ROW, COL);
				ret=wether_win(arr,ROW,COL);
				ret1 = winner(ret);
				if (ret1 == 1)
				{
					printf("玩家获胜\n");
					break;
				}
				if (ret1 == 2)
				{
					printf("电脑获胜\n");
					break;
				}
				if (ret1 == 3)
				{
					printf("平局");
				}
			}
			break;
		case 0://退出选项
			printf("拜拜\n");
			break;
		default:
			printf("请选择正确的选项\n");//提示用户输入正确的值
			break;
		}	
	} while (a);
	return 0;
}
所用函数  菜单函数

用printf就完事了,不多废话。

void menu()
{
	printf("**********************\n");
	printf("*****1.开始游戏*******\n");
	printf("*****0.退出        ***\n");
	printf("**********************\n");
}
生成棋盘函数

这里的ROW和COL是#define 定义的标识符常量。

用两层for循环实现数组的初始化。

将数组的元素赋值成空格字符。

void bord(char arr[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i< row; i++)
	{
		for (j = 0; j< col; j++)
		{
			arr[i][j] = ' ';
		}
	}
显示棋盘函数 

我们想要的棋盘样式

这里使用的是行打印,将数组的元素放入棋盘中。%c| %c| %c

为了实现上面的棋盘,我们发现,%c| %c| %c要打印三次,--|--|--只需要两次。所以加了个if语句限制

void dis_bord(char arr[ROW][COL], int row, int col)
{
	int i, j;
	j = 0;
	for (i = 0; i< row; i++,j++)
	{
		printf(" %c| %c| %c\n", arr[i][0], arr[i][1], arr[i][2]);
		if (j< col - 1)
		{
			printf("--|--|--\n");
		}
	}
}
玩家下棋函数

用while循环不断判断玩家是否输入了正确的坐标,如果输入了正确的坐标,则跳出循环,否则提示重新输入正确坐标后再一次进入循环。

void player_move(char arr[ROW][COL], int row, int col)//玩家下棋的函数
{
	int x, y;
	printf("请输入要下棋子坐标(行 列)\n");
	scanf("%d%d", &x, &y);
	while (1)
	{
		if (arr[x - 1][y - 1] == ' ')
		{
			arr[x - 1][y - 1] = '*';
			break;
		}
		else
        {
			printf("请输入正确的坐标\n");
			scanf("%d%d", &x, &y);
			continue;
		}
	}
}
电脑下棋函数

用while循环不断判断电脑下棋的坐标是否正确,用了随机函数,将获得的随机值跟棋盘大小取余,就能将值的范围控制在0~2(棋盘大小减一1)

void computer_move(char arr[ROW][COL], int row, int col)
{
	printf("电脑下\n");
	int i, j;
	while (1)
	{
		int i, j;
		i = rand() % row;
		j = rand() % col;
		if (arr[i][j] == ' ')
		{
			arr[i][j] = '#';
			break;
		}

	}
}
判断输赢函数

虽然很长,但逻辑很简单,就是遍历棋盘,寻找三点一线的棋子,并且返回这个棋子的棋子类型。

char wether_win(char arr[ROW][COL], int row, int col)//判断输赢的函数
{
	int i = 0, j = 0;
	while (1)//此处的while好像没有什么作用
	{
		for (i = 0; i< row; i++)//用for循环实现行(hang)的扫描
		{
			if (arr[i][0] == arr[i][1] && arr[i][2] == arr[i][1] && arr[i][0] == '*')//如果一行中有三个*则返回*
			{
				return'*';
				break;
			}
			else
			{
				if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
					if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
						if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
						{
							return 'p';
						}
			}
		}
		for (j = 0; j< col; j++)
		{
			if (arr[0][j] == arr[1][j] && arr[2][j] == arr[1][j] && arr[0][j] == '*')
			{

				return'*';
				break;
			}
			else
			{
				if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
					if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
						if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
						{
							return 'p';
						}
			}
		}
		if (arr[0][0] == arr[1][1] && arr[2][2] == arr[1][1] && arr[0][0] == '*')
		{

			return'*';
			break;
		}
		else
		{
			if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
				if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
					if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
					{
						return 'p';
					}
		}

		if (arr[0][2] == arr[1][1] && arr[2][0] == arr[1][1] && arr[0][2] == '*')
		{
			return'*';
			break;
		}
		else
		{
			if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
				if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
					if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
					{
						return 'p';
					}
		}
		for (i = 0; i< row; i++)
		{
			if (arr[i][0] == arr[i][1] && arr[i][2] == arr[i][1] && arr[i][0] == '#')
			{
				return'#';
				break;
			}
			else
			{
				if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
					if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
						if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
						{
							return 'p';
						}
			}
		}
		for (j = 0; j< col; j++)
		{
			if (arr[0][j] == arr[1][j] && arr[2][j] == arr[1][j] && arr[0][j] == '#')
			{
				return'#';
				break;
			}
			else
			{
				if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
					if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
						if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
						{
							return 'p';
						}
			}
		}
		if (arr[0][0] == arr[1][1] && arr[2][2] == arr[1][1] && arr[0][0] == '#')
		{
			return'#';
			break;
		}
		else
		{
			if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
				if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
					if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
					{
						return 'p';
					}

		}
		if (arr[0][2] == arr[1][1] && arr[2][0] == arr[1][1] && arr[0][2] == '#')
		{
			return'#';
			break;
		}
		else
		{
			if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
				if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
					if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
					{
						return 'p';
					}
		}
		break;
	}
	return 0;
}
显示赢家函数 

返回1就打印玩家获胜,返回2就打印电脑获胜,返回3就打印平局。

int winner(char ret)
{
	if (ret == '*')
	{
		return 1;
	}
	if (ret == '#')
	{
		return 2;
	}
	if (ret == 'p')
	{
		return 3;
	}
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:【C语言】你还不会做三子棋?-创新互联
网址分享:http://cxhlcq.com/article/doeheh.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部