C语言【三子棋】(保姆级别)

🚀Get to know🚀
😊大家好,我是适才,这是我的主页链接 🌐个人主页链接🌐欢迎您的到来😊
🎁欢迎各位➡点赞👍➕收藏⭐+关注💖+留言📝
🛸文章如果有错误,不足的地方。欢迎指出🛸
🌍希望你这篇文章对你有所帮助🌍
💌学习是终身的事业💌

🔴正文开始🔴

前言

😋游戏的介绍😋
三子棋游戏是一种两人玩的棋类游戏,也称为连珠棋、井字棋等。游戏中,玩家轮流在一个 3 × 3 3 \times 3 3×3 的棋盘上下棋子,目标是在水平、垂直或对角线上连成三个棋子。先把三个棋子连成一条直线的玩家获胜。如果棋盘下满了棋子但没有一方获胜,则游戏平局。这个游戏简单易学,但也需要一些策略和思考能力。

模块化编程

🌅模块化编程介绍🌅
模块化编程是一种软件开发方法,它将程序分割成独立的、可重用的模块,每个模块都具有其特定的功能。模块化编程的主要目的是提高代码的可读性、可维护性和可扩展性。通过模块化编程,不同的团队可以并行地开发不同的模块,从而提高开发效率。此外,模块化编程也可以减少代码冗余、提高代码复用率,从而降低开发成本。

三子棋游戏

创建三个文件

🟢test.c——源文件—实现游戏的逻辑🟢
🟢game.c——源文件——实现函数的功能🟢
🟢game.h——头文件——实现头文件的引用和函数的声明🟢

1️⃣ 游戏的整体思路

🔹创建一个游戏菜单函数
🔹分支语句实现游戏的选择
🔹创建游戏函数来包含游戏需要实现的函数
🔹创建一个二维数组并初始化为空格
🔹创建打印棋盘函数并实现其功能
🔹创建玩家下棋函数并实现其功能
🔹创建电脑下棋函数并实现其功能
🔹创建判断输赢平局的函数并实现其功能

2️⃣ 游戏的逐步实现

🤩前面知道了游戏实现的总体思路,接下来就一步一步地完成游戏吧。🤩

◾ 游戏菜单函数

菜单的实现无非就是让用户知道怎么选择
菜单函数代码:

void meun()
{
	printf("------------------三子棋游戏------------------\n");
	printf("*************  0.exit  1.paly ****************\n");
	printf("------------------三子棋游戏------------------\n");
}

😁我这菜单比较简陋,大家见谅一下😁

◾ 游戏的选择

游戏的菜单已经完成了,就要实现选择的功能。
这里分支语句采用的是switch多分支语句
这个模块比较简单,直接上代码

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		meun();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出游戏\n");
			break;
		case 1:
			Gmae_mitsuko();//游戏函数
			break;
		default:
			printf("选择错误,请重新选择\n");
		}
	} while (input);
	return 0;
}

◾ 创建游戏函数

▪ 二维数组

二维数组的行和列需在game.h当中进行宏定义

#define ROW 3  // 行
#define COL 3  //列

代码如下:

//创建二维数组
char broad[ROW][COL] = { 0 };
▪ 初始化函数

需要在game.h中进行声明

代码如下:

//初始化棋盘函数
void Init_broad(char str[ROW][COL],int row, int col);

函数的实现:

//初始化棋盘函数
void Init_broad(char str[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			str[i][j] = ' ';//二维数组初始化为空格
		}
	}
}
▪ 打印棋盘函数

棋盘是一个字棋盘

game.h中进行声明

代码如下:


//打印棋盘函数
void Print_broad(char str[ROW][COL], int row, int col);

函数的实现

//打印棋盘函数
void Print_broad(char str[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", str[i][j]);

			if (j < col - 1)//不打印最后的竖线
			{
				printf("|");
			}
		}
		printf("\n");

			if (i < row - 1)//不打印最后的行线
			{
				for (j = 0; j < col; j++)
				{
					printf("---");

					if (j < col - 1)
					{
						printf("|");
					}
				}
				printf("\n");
			}
	}	
}
▪ 玩家下棋函数

玩家下棋让玩家输入坐标
棋盘空的位置上面落子,并且要判断坐标的合法性
‘0’——这个符号是玩家的符号。
依然先在game.h中声明

代码如下:

//玩家下棋
void Player(char str[ROW][COL], int row, int col);

函数的实现

//玩家下棋
void Player(char str[ROW][COL], int row, int col)
{
	printf("玩家\n");

	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入坐标:>");
		scanf("%d%d", &x, &y);
		if ((x >= 1 && x <= 3) && (y >= 1 && y <= 3))
		{
			//由于数组坐标是从0开始的
			//减1也是由于这个
			if (str[x-1][y-1] == ' ')
			{
				str[x-1][y-1] = '0';
				break;
			}
			else
			{
				printf("该坐标已被占用,重新输入\n");
			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
}

▪ 电脑下棋函数

📑需引用头文件📑
#include<stdlib.h>—— /* srand rand*/
#include<time.h>—— /* time */

在电脑下棋之前,先详解两个函数——rand
🥳rand——会生成随机值的一个库函数🥳
参数:int rand (void)

🌈使用案例🌈
v1 = rand() % 100; // v1 in the range 0 to 99
v2 = rand() % 100 + 1; // v2 in the range 1 to 100
v3 = rand() % 30 + 1985; // v3 in the range 1985-2014

实现之前还要知道另一个库函数——srand
🥳srand——初始化随机数生成器🥳
参数:void srand (unsigned int seed);

srand使用:

srand((unsigned int)time(NULL));

函数的实现:

//电脑下棋
void computer(char str[ROW][COL], int row, int col)
{
	printf("电脑\n");
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (str[x][y] == ' ')
		{
			str[x][y] = '1';
			break;
		}
	}
}

▪ 判断游戏的输赢

判断游戏的输赢符号(可以自定义)
我这里分别是

’ 0 '——玩家
‘ 1 ’——电脑
‘ a '——平局
’ b '——继续

对于三子棋判断输赢的三个条件

🚀1. 横三行的每个字符相等并且不是空格🚀
🚀2. 竖三列的每个字符相等并且不是空格🚀
🚀3. 两条对角线每个字符相等并且不是空格🚀

判断输赢函数的代码:

char if_win(char str[ROW][COL], int row, int col)
{
	int i = 0;
	//判断横三行
	for (i = 0; i < row; i++)
	{
		if (str[i][0] == str[i][1] && str[i][0] == str[i][2] && str[i][1] != ' ')
		{
			return str[i][1];
		}
	}
	//判断列三行
	for (i = 0; i < row; i++)
	{
		if (str[0][i] == str[1][i] && str[0][i] == str[2][i] && str[1][i] != ' ')
		{
			return str[1][i];
		}
	}
	//判断两条对角线
	if (str[0][0] == str[1][1] && str[1][1] == str[2][2] && str[1][1] != ' ')
	{
		return str[1][1];
	}
	if (str[0][2] == str[1][1] && str[1][1] == str[2][0] && str[1][1] != ' ')
	{
		return str[1][1];
	}
	int ret = if_Dead_heat(str, row, col);//判断平局函数
	if (ret == 1)
	{
		return 'b';
	}
	return 'a';
}

为了判断是否平局,创建了一个函数
代码如下:

//判断平局函数
int if_Dead_heat(char str[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (str[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

到这里,游戏已经完成
🚀总体效果图如下🚀
玩家赢
在这里插入图片描述
电脑赢
在这里插入图片描述

平局
在这里插入图片描述

全部代码

Ⅰ test.c

🛸内部包含了一个猜数字的小游戏🛸

#define   _CRT_SECURE_NO_WARNINGS 1

#include"Game_mitsuko.h"



---------------------------------------------------------------------
猜数字游戏
//
//
菜单
//void meun()
//{
//	printf("---------------猜数字游戏------------\n");
//	printf("********** 1.paly      0.exit *******\n");
//	printf("---------------猜数字游戏------------\n");
//}
//
游戏实现
//void game_guess()
//{
//	int key = 0;
//	
//	int ret = rand() % 100 + 1;
//	int i = 5;
//	while (i)
//	{ 
//		printf("有%d机会\n",i);
//		printf("请猜数字:>");
//		scanf("%d", &key);
//		if (key > ret)
//		{
//			printf("猜大了\n");
//			i--;
//		}
//		else if (key < ret)
//		{
//			printf("猜小了\n");
//			i--;
//		}
//		else
//		{
//			printf("恭喜你,猜对了\n");
//			break;
//		}
//	}
//	if (i == 0)
//	{
//		printf("次数已用完,请重新开始\n");
//	}
//}
//
//
//int main()
//{
//
//	int input = 0;
//	srand((unsigned int)(time) NULL);
//	do
//	{
//		meun();
//		printf("请选择:>");
//		scanf("%d",&input);
//		switch (input)
//		{
//		case 0:
//			printf("退出游戏\n");
//			break;
//		case 1:
//			game_guess();
//			break;
//		default:
//			printf("选择错误,请重新选择\n");
//		}
//	} while (input);
//	return 0;
//}
//---------------------------------------------------------------------

//三子棋

//菜单
void meun()
{
	printf("------------------三子棋游戏------------------\n");
	printf("*************  0.exit  1.paly ****************\n");
	printf("------------------三子棋游戏------------------\n");
}

//游戏函数
void Gmae_mitsuko()
{
	//创建二维数组
	char broad[ROW][COL] = { 0 };

	//初始化二维数组为空格
	Init_broad(broad,ROW,COL);
		//打印棋盘函数
		//Print_broad(broad, ROW, COL);

	while (1)
	{
		//玩家下棋
		Player(broad, ROW, COL);

		Print_broad(broad, ROW, COL);
	
		char pc = if_win(broad, ROW, COL);
		if (pc != 'a')
		{
			break;
		}

		//电脑下棋
		computer(broad, ROW, COL);

		Print_broad(broad, ROW, COL);

		if (pc != 'a')
		{
			break;
		}
		
	
	}
	//判断输赢
	char pc = if_win(broad, ROW, COL);

	if (pc == '0')
	{
		printf("玩家赢\n");
	}
	else if (pc == '1')
	{
		printf("电脑赢\n");
	}
	else if (pc == 'b')
	{
		printf("平局\n");
	}
	
}

	
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		meun();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出游戏\n");
			break;
		case 1:
			Gmae_mitsuko();
			break;
		default:
			printf("选择错误,请重新选择\n");
		}
	} while (input);
	return 0;
}

Ⅱ game.c

#define   _CRT_SECURE_NO_WARNINGS 1


#include"Game_mitsuko.h"



//初始化棋盘函数
void Init_broad(char str[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			str[i][j] = ' ';
		}
	}
}


//打印棋盘函数
void Print_broad(char str[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", str[i][j]);

			if (j < col - 1)//不打印最后的竖线
			{
				printf("|");
			}
		}
		printf("\n");

			if (i < row - 1)//不打印最后的行线
			{
				for (j = 0; j < col; j++)
				{
					printf("---");

					if (j < col - 1)
					{
						printf("|");
					}
				}
				printf("\n");
			}
	}	
}

//玩家下棋
void Player(char str[ROW][COL], int row, int col)
{
	printf("玩家\n");

	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入坐标:>");
		scanf("%d%d", &x, &y);
		if ((x >= 1 && x <= 3) && (y >= 1 && y <= 3))
		{
			//由于数组坐标是从0开始的
			//减1也是由于这个
			if (str[x-1][y-1] == ' ')
			{
				str[x-1][y-1] = '0';
				break;
			}
			else
			{
				printf("该坐标已被占用,重新输入\n");
			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
}


//电脑下棋
void computer(char str[ROW][COL], int row, int col)
{
	printf("电脑\n");
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (str[x][y] == ' ')
		{
			str[x][y] = '1';
			break;
		}
	}
}



//判断平局函数
int if_Dead_heat(char str[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (str[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}


//判断输赢
char if_win(char str[ROW][COL], int row, int col)
{
	int i = 0;
	//判断横三行
	for (i = 0; i < row; i++)
	{
		if (str[i][0] == str[i][1] && str[i][0] == str[i][2] && str[i][1] != ' ')
		{
			return str[i][1];
		}
	}
	//判断列三行
	for (i = 0; i < row; i++)
	{
		if (str[0][i] == str[1][i] && str[0][i] == str[2][i] && str[1][i] != ' ')
		{
			return str[1][i];
		}
	}
	//判断两条对角线
	if (str[0][0] == str[1][1] && str[1][1] == str[2][2] && str[1][1] != ' ')
	{
		return str[1][1];
	}
	if (str[0][2] == str[1][1] && str[1][1] == str[2][0] && str[1][1] != ' ')
	{
		return str[1][1];
	}
	int ret = if_Dead_heat(str, row, col);//判断平局函数
	if (ret == 1)
	{
		return 'b';
	}
	return 'a';
}

Ⅲ game.h

#pragma once  //为了避免同一个头文件被包含(include)多次

#define ROW 3  // 行
#define COL 3  //列

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//初始化棋盘函数
void Init_broad(char str[ROW][COL],int row, int col);


//打印棋盘函数
void Print_broad(char str[ROW][COL], int row, int col);

//玩家下棋
void Player(char str[ROW][COL], int row, int col);

//电脑下棋
void computer(char str[ROW][COL], int row, int col);

//判断输赢
char if_win(char str[ROW][COL], int row, int col);

Alt

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
三子棋是一种简单的棋类游戏,玩家和电脑轮流在一个3x3的棋盘上下棋。玩家输入的坐标会在棋盘上标记为"*",而电脑会自动选择一个合适的位置下棋。下面是一个简单的C语言实现的例子: 首先,我们需要初始化一个3x3的二维数组来表示棋盘,并用空格字符来表示棋盘上的空位。\[1\] 然后,我们可以编写一个函数来让玩家输入下棋的坐标,并将其标记在棋盘上。\[2\]这个函数会检查玩家输入的坐标是否合法,即在1-3的范围内,并且对应的位置在棋盘上是空的。如果是合法的,就将该位置标记为"*",否则要求玩家重新输入。 接下来,我们可以编写一个函数来让电脑下棋。这个函数可以随机选择一个合法的位置,并将其标记在棋盘上。\[3\]同样,这个函数也会检查选择的位置是否合法,并且对应的位置在棋盘上是空的。 最后,我们可以使用一个while循环来实现玩家和电脑轮流下棋的过程。每次落子后,都会打印当前的棋盘状态。当棋盘上出现三个连续的"*"或"O"时,游戏结束。 这是一个简单的C语言实现的三子棋游戏。希望对你有帮助! #### 引用[.reference_title] - *1* *2* [C语言——简单三子棋](https://blog.csdn.net/weixin_46263870/article/details/123002439)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [c语言三子棋](https://blog.csdn.net/wastedyouth/article/details/124169006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值