三子棋游戏

三子棋游戏
程序实现步骤
1.首先利用二维数组打印一个棋盘并且对表示的棋盘进行初始化
2.打印一个3*3棋盘(利用二维数组进行实现)
3.玩家根据棋盘大小有效的进行落子
4.判定游戏是否结束
5.电脑进行随机落子
6.检查游戏是否结束
7.假如游戏没有结束又重新回到步骤2继续执行
以下对各个步骤进行程序编写
对玩家进行信息提示

int  Menu(){
	printf("=================================\n");
	printf("**欢迎来到三子棋游戏** \n");
	printf("1.表示开始游戏\n");
	printf("0.表示结束游戏\n");
	printf("X 表示玩家落的子;O 表示电脑落的子\n");
	printf("==================================\n");
	printf("请输入您的选择:\n");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}

步骤1.初始化棋盘

void Init(char chessBoard[Max_Row][Max_col]) {
	//	for (int row = 0; row < Max_Row; row++){
	//		for (int col = 0; col < Max_col; col++)
	//			chessBoard[row][col] = ' ';
	//	}
	//}
	//设置棋盘全部要是空棋盘
	srand((unsigned int)time(0));//随机种子在程序启动之后一放就可以了
	memset(chessBoard, ' ', Max_Row*Max_col);//以字节字节为单位设置的
}

这块利用二维数组循环进行初始化或者memset函数都可以
步骤2.打印一个棋盘

void Print(char chessBoard[Max_Row][Max_col]){
	for (int row = 0; row < Max_Row; row++){
			printf("+---+---+---+\n");
			printf("| %c | %c | %c |\n", chessBoard[row][0],chessBoard[row][1], chessBoard[row][2]);
			//printf("\n");
		}
		printf("+---+---+---+\n");
 }

3*3的棋盘里面都是空的
步骤3.玩家落子

void PlayerMove(char chessBoard[Max_Row][Max_col]){
	printf("轮到玩家落子!\n");
	while (1){
		printf("请输入您要落子的位置(Row col): ");
		int row = 0;
		int col = 0;
		scanf("%d %d", &row, &col);
		//尽可能对用户输入数据进行校验,如果输入数据非法,就要进行处理
		//2个if是对用户输入的数据进行校验
		//合法性校验
		if (row < 0 || row >= Max_Row || col < 0 || col >= Max_col){
			printf("您的输入有误!请重新输入 \n");
			continue;//调到while/意思就是重新调到while语句的位置重新执行
		}
		if (chessBoard[row][col] != ' '){
		//当前位置有子了,不能再重复落子
			printf("该位置已经有子了 \n");
			continue;
		}
       chessBoard[row][col] = 'X';
	   break; //结束循环
	}
}

以上所有的情况都要考虑到
步骤4.和步骤6.:检查游戏是否结束

步骤4.查看游戏是否结束 步骤6.查看游戏是否结束
/*返回值表述当前游戏状况;
1.返回X表示玩家获胜
2.返回O表示电脑获胜
3.返回' '表示还未分出胜负
4.返回Q表示和棋*/
char Check(char chessBoard[Max_Row][Max_col]){
	//1.检查所有的行,看是否有连
	for (int row = 0; row < Max_Row; row++){
		if (chessBoard[row][0] != ' '&& chessBoard[row][0] == chessBoard[row][1] &&
			chessBoard[row][0] == chessBoard[row][2]){
			return  chessBoard[row][0];
		}
	}
	//2.检查所有的列
	for (int col = 0; col < Max_col; col++){
		if (chessBoard[0][col] != ' '&& chessBoard[0][col] == chessBoard[1][col] &&
			chessBoard[0][col] == chessBoard[2][col]){
			return  chessBoard[0][col];
		}
	}
	//3.检查所有对角线,
	if (chessBoard[0][0] != ' '&&chessBoard[0][0] == chessBoard[1][1] &&
		chessBoard[2][2] == chessBoard[0][0]){
		return chessBoard[0][0];
	}
	if (chessBoard[0][2] != ' '&&chessBoard[0][2] == chessBoard[1][1] &&
		chessBoard[0][2] == chessBoard[2][0]){
		return chessBoard[0][2];
	}
	//4.判定是否是和棋,如果满了就是和棋
	int IsFull(chessBoard);
	if ( IsFull(chessBoard)){
		return 'Q';
	}
	return ' ';
}
//判定棋盘是否满了,满了返回1,否则返回0
//查看棋盘是否有空位置
int IsFull(char chessBoard[Max_Row][Max_col]){
	//查找棋盘上是否有空位,
	for (int row = 0; row < Max_Row; row++){
		for (int col = 0; col < Max_col; col++){
			if (chessBoard[row][col] == ' ')  {
				//找到空位棋盘没满,
				//判定棋盘是否满了,满了返回1,否则返回0
				return 0;
			}
		}
	}
	//所有的位置都找完,也没找到空格,最终返回1.
	return 1;
}

步骤5.电脑落子

void ComputerMove(char chessBoard[Max_Row][Max_col]){
	printf("轮到电脑落子!\n");
	while (1){
		int row = rand() % Max_Row;//Max_Row代表就是棋盘行的范围
		int col = rand() % Max_col;//Max_col代表就是棋盘列的范围
		if (chessBoard[row][col] != ' '){
			continue;
		}
		chessBoard[row][col] = 'O';
		break;
	}
}

游戏核心步骤:

void  Game(){
	//1,创建并初始化一个棋盘(字符类型的二维数组)
	//尽量避免使用 magic number 魔幻数字
	//最好给这个数字起一个合适的名字
	char chessBoard[Max_Row][Max_col] = { 0 };
	//1.初始化棋盘
	Init(chessBoard);
	char winner = ' ';
	while (1){
		//2.打印棋盘
		Print(chessBoard);
		//3.提示玩家落子(输入坐标)
		PlayerMove(chessBoard);
		//4.检查游戏是否结束
	     winner = Check(chessBoard);
		if (winner != ' '){
			break;
		}
		//5.电脑落子
		ComputerMove(chessBoard);
		//6.检查游戏是否结束
		winner = Check(chessBoard);
		if (winner != ' '){
			break;
		}
	}
	Print(chessBoard);
	if (winner == 'X'){
		printf("恭喜你,你赢了\n");
	}
	else if (winner == 'O') {
		printf("你真菜,连电脑都下不过\n");
	}
	else{
		printf("你真菜,和电脑五五开\n");
	}
 }

主函数程序

int main(){
	while (1){
		int choice = Menu();//循环调用菜单函数(Menu())
		if (choice == 1){
			Game();
		}
		else if(choice == 0) {
			printf("goodbye\n");
			break;
		} else {
			printf("您的输入信息有误\n");
		}
	}
	system("pause");
	return 0;
}

整体程序:

//三子棋游戏
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int  Menu(){
	printf("=================================\n");
	printf("**欢迎来到三子棋游戏** \n");
	printf("1.表示开始游戏\n");
	printf("0.表示结束游戏\n");
	printf("X 表示玩家落的子;O 表示电脑落的子\n");
	printf("==================================\n");
	printf("请输入您的选择:\n");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}
//上面部分均属于用户的提示信息

//初始化棋盘
#define Max_Row 3
#define Max_col 3

//步骤1.初始化棋盘
void Init(char chessBoard[Max_Row][Max_col]) {
	//	for (int row = 0; row < Max_Row; row++){
	//		for (int col = 0; col < Max_col; col++)
	//			chessBoard[row][col] = ' ';
	//	}
	//}
	//设置棋盘全部要是空棋盘
	srand((unsigned int)time(0));//随机种子在程序启动之后一放就可以了
	memset(chessBoard, ' ', Max_Row*Max_col);//以字节字节为单位设置的
}
//步骤2.打印棋盘
void Print(char chessBoard[Max_Row][Max_col]){
	把棋盘的内容打印下来几行几列
	//		for (int row = 0; row < Max_Row; row++){
	//			for (int col = 0; col < Max_col; col++){
	//	//%c表示打印一个字符(后面传的是一个char变量) %s表示打印一个字符串(后面传的参数是一个字符数组)
	//				printf("%c", chessBoard[Max_Row][Max_col]);
	//		}
	//			printf("\n");
	//	}
		for (int row = 0; row < Max_Row; row++){
			printf("+---+---+---+\n");
			printf("| %c | %c | %c |\n", chessBoard[row][0],chessBoard[row][1], chessBoard[row][2]);
			//printf("\n");
		}
		printf("+---+---+---+\n");
 }
 
//步骤3.玩家落子程序
void PlayerMove(char chessBoard[Max_Row][Max_col]){
	printf("轮到玩家落子!\n");
	while (1){
		printf("请输入您要落子的位置(Row col): ");
		int row = 0;
		int col = 0;
		scanf("%d %d", &row, &col);
		//尽可能对用户输入数据进行校验,如果输入数据非法,就要进行处理
		//2个if是对用户输入的数据进行校验
		//合法性校验
		if (row < 0 || row >= Max_Row || col < 0 || col >= Max_col){
			printf("您的输入有误!请重新输入 \n");
			continue;//调到while/意思就是重新调到while语句的位置重新执行
		}
		if (chessBoard[row][col] != ' '){
		//当前位置有子了,不能再重复落子
			printf("该位置已经有子了 \n");
			continue;
		}
       chessBoard[row][col] = 'X';
	   break; //结束循环
	}
}

//步骤4.查看游戏是否结束 步骤6.查看游戏是否结束
/*返回值表述当前游戏状况;
1.返回X表示玩家获胜
2.返回O表示电脑获胜
3.返回' '表示还未分出胜负
4.返回Q表示和棋*/
char Check(char chessBoard[Max_Row][Max_col]){
	//1.检查所有的行,看是否有连
	for (int row = 0; row < Max_Row; row++){
		if (chessBoard[row][0] != ' '&& chessBoard[row][0] == chessBoard[row][1] &&
			chessBoard[row][0] == chessBoard[row][2]){
			return  chessBoard[row][0];
		}
	}
	//2.检查所有的列
	for (int col = 0; col < Max_col; col++){
		if (chessBoard[0][col] != ' '&& chessBoard[0][col] == chessBoard[1][col] &&
			chessBoard[0][col] == chessBoard[2][col]){
			return  chessBoard[0][col];
		}
	}
	//3.检查所有对角线,
	if (chessBoard[0][0] != ' '&&chessBoard[0][0] == chessBoard[1][1] &&
		chessBoard[2][2] == chessBoard[0][0]){
		return chessBoard[0][0];
	}
	if (chessBoard[0][2] != ' '&&chessBoard[0][2] == chessBoard[1][1] &&
		chessBoard[0][2] == chessBoard[2][0]){
		return chessBoard[0][2];
	}
	//4.判定是否是和棋,如果满了就是和棋
	int IsFull(chessBoard);
	if ( IsFull(chessBoard)){
		return 'Q';
	}
	return ' ';
}
//步骤5.电脑落子程序
void ComputerMove(char chessBoard[Max_Row][Max_col]){
	printf("轮到电脑落子!\n");
	while (1){
		int row = rand() % Max_Row;//Max_Row代表就是棋盘行的范围
		int col = rand() % Max_col;//Max_col代表就是棋盘列的范围
		if (chessBoard[row][col] != ' '){
			continue;
		}
		chessBoard[row][col] = 'O';
		break;
	}
}
//判定棋盘是否满了,满了返回1,否则返回0
//查看棋盘是否有空位置
int IsFull(char chessBoard[Max_Row][Max_col]){
	//查找棋盘上是否有空位,
	for (int row = 0; row < Max_Row; row++){
		for (int col = 0; col < Max_col; col++){
			if (chessBoard[row][col] == ' ')  {
				//找到空位棋盘没满,
				//判定棋盘是否满了,满了返回1,否则返回0
				return 0;
			}
		}
	}
	//所有的位置都找完,也没找到空格,最终返回1.
	return 1;
}
//核心函数
void  Game(){
	//一局游戏的核心函数
	//1,创建并初始化一个棋盘(字符类型的二维数组)
	//尽量避免使用 magic number 魔幻数字
	//最好给这个数字起一个合适的名字
	char chessBoard[Max_Row][Max_col] = { 0 };
	//1.初始化棋盘
	Init(chessBoard);
	char winner = ' ';
	while (1){
		//2.打印棋盘
		Print(chessBoard);
		//3.提示玩家落子(输入坐标)
		PlayerMove(chessBoard);
		//4.检查游戏是否结束
	     winner = Check(chessBoard);
		if (winner != ' '){
			break;
		}
		//5.电脑落子
		ComputerMove(chessBoard);
		//6.检查游戏是否结束
		winner = Check(chessBoard);
		if (winner != ' '){
			break;
		}
	}
	Print(chessBoard);
	if (winner == 'X'){
		printf("恭喜你,你赢了\n");
	}
	else if (winner == 'O') {
		printf("你真菜,连电脑都下不过\n");
	}
	else{
		printf("你真菜,和电脑五五开\n");
	}
 }
//主函数程序
int main(){
	while (1){
		int choice = Menu();//循环调用菜单函数(Menu())
		if (choice == 1){
			Game();
		}
		else if(choice == 0) {
			printf("goodbye\n");
			break;
		} else {
			printf("您的输入信息有误\n");
		}
	}
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述

技术选型 【后端】:Java 【框架】:springboot 【前端】:vue 【JDK版本】:JDK1.8 【服务器】:tomcat7+ 【数据库】:mysql 5.7+ 项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧! 在当今快速发展的信息技术领域,技术选型是决定一个项目成功与否的重要因素之一。基于以下的技术栈,我们为您带来了一份完善且经过实践验证的项目资源,让您在学习和提升编程技能的道路上事半功倍。以下是该项目的技术选型和其组件的详细介绍。 在后端技术方面,我们选择了Java作为编程语言。Java以其稳健性、跨平台性和丰富的库支持,在企业级应用中处于领导地位。项目采用了流行的Spring Boot框架,这个框架以简化Java企业级开发而闻名。Spring Boot提供了简洁的配置方式、内置的嵌入式服务器支持以及强大的生态系统,使开发者能够更高效地构建和部署应用。 前端技术方面,我们使用了Vue.js,这是一个用于构建用户界面的渐进式JavaScript框架。Vue以其易上手、灵活和性能出色而受到开发者的青睐,它的组件化开发思想也有助于提高代码的复用性和可维护性。 项目的编译和运行环境选择了JDK 1.8。尽管Java已经推出了更新的版本,但JDK 1.8依旧是一种成熟且稳定的选择,广泛应用于各类项目中,确保了兼容性和稳定性。 在服务器方面,本项目部署在Tomcat 7+之上。Tomcat是Apache软件基金会下的一个开源Servlet容器,也是应用最为广泛的Java Web服务器之一。其稳定性和可靠的性能表现为Java Web应用提供了坚实的支持。 数据库方面,我们采用了MySQL 5.7+。MySQL是一种高效、可靠且使用广泛的关系型数据库管理系统,5.7版本在性能和功能上都有显著的提升。 值得一提的是,该项目包含了前后台的完整源码,并经过严格调试,确保可以顺利运行。通过项目的学习和实践,您将能更好地掌握从后端到前端的完整开发流程,提升自己的编程技能。欢迎参考博主的详细文章或私信获取更多信息,利用这一宝贵资源来推进您的技术成长之路!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值