IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C语言】你还不会做三子棋? -> 正文阅读

[C++知识库]【C语言】你还不会做三子棋?

目录

整段代码

主函数(程序思路)

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

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

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

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

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

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

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

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

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

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

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

所用函数?

菜单函数

生成棋盘函数

显示棋盘函数?

玩家下棋函数

电脑下棋函数

判断输赢函数

显示赢家函数?


整段代码

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

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#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;
	}
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 10:47:31  更:2022-12-25 10:50:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 21:47:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码