【扫雷游戏】C语言 用递归实现扫雷游戏

本文分享了一篇使用C语言编程实现扫雷游戏的方法,详细介绍了游戏流程、核心函数及其实现,包括Initboard、Displayboard、leiboard、usermove等。文章还提供了完整的代码结构,包括test.c、game.c和game.h三个文件,并分享了游戏测试的几种情况。读者可以通过这篇文章学习到如何用递归来设计扫雷游戏。
摘要由CSDN通过智能技术生成

代码分为三部分,test.c(整体游戏框架),game.c(游戏的实现,定义的大部分函数),game.h(放的用到的头文件)

目录

一、游戏流程

二、定义的函数

三、函数的实现

1.void menu();

2.void game();

2.void Initboard(char board[ROWS][COLS],int row,int col,char set);

4.void Displayboard(char board[ROWS][COLS], int row, int col);

 5.void leiboard(char board[ROWS][COLS], int row, int col);

6. void usermove(char board[ROWS][COLS], char userboard[ROWS][COLS], int row, int col);

 7.int leicount(char board[ROWS][COLS],  int x, int y);

8.void openaround(char board[ROWS][COLS], char userboard[ROWS][COLS], int x, int y);

 9.int iswin(char userboard[ROWS][COLS], int row, int col);

四、完整的代码

1.test.c

2.game.c

3.game.h

五、游戏测试

1.你赢了(步骤有点多,可以自己去玩一下嘻嘻)

 2.你输了(我这个运气,第一个子儿就被炸死了哈哈)

3.输入坐标非法请重新输入

4.你已经排查过此位置,请重新输入


一、游戏流程

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请输入:>");
		scanf_s("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

二、定义的函数

void menu();
void game();
void Initboard(char board[ROWS][COLS],int row,int col,char set);
void Displayboard(char board[ROWS][COLS], int row, int col);
void leiboard(char board[ROWS][COLS], int row, int col);
void usermove(char board[ROWS][COLS], char userboard[ROWS][COLS], int row, int col);
//返回类型为整型,返回用户输入坐标周围雷的个数
int leicount(char board[ROWS][COLS],  int x, int y);
void openaround(char board[ROWS][COLS], char userboard[ROWS][COLS], int x, int y);
int iswin(char userboard[ROWS][COLS], int row, int col);

三、函数的实现

1.void menu();

void menu()
{
	printf("*********************************\n");
	printf("*********   1.play     **********\n");
	printf("*********   0.end      **********\n");
	printf("*********************************\n");
}

2.void game();

void game()
{
	char board1[ROWS][COLS];
	char board2[ROWS][COLS];
	printf("开始游戏\n");
	//初始化扫雷棋盘
	Initboard(board1, ROW, COL, '0');
	//给用户展示的排雷页面的初始化
	//放雷,把雷初始化好,雷是放在棋盘1
	leiboard(board1, ROW, COL);
	Initboard(board2, ROW, COL, '*');
	//打印一下给用户展示的棋盘
	Displayboard(board2, ROW, COL);
	//这个打印棋盘
	//1.初始化为0以及放入雷后的棋盘
	//2.用户排雷失败被炸死的时候,让用户被炸的明白用这个给打印出来
	//3.让程序员好用来测试完成扫雷游戏,最后注释掉
	//Displayboard(board1, ROW, COL);
	//用户进行扫雷,输入要排的坐标,都是在棋盘1上进行的,棋盘2,只是为了方便给用户展示,总不能把雷的位置也给用户展示了吧
	usermove(board1, board2, ROW, COL);

}

2.void Initboard(char board[ROWS][COLS],int row,int col,char set);

//初始化棋盘
//多初始化的两行,两列棋盘是为了判断边缘是否有雷时,数组会被越界访问
void Initboard(char board[ROWS][COLS], int row, int col, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row + 2; i++)
	{
		for (j = 0; j < col + 2; j++)
		{
			board[i][j] = set;
		}
	}
}

4.void Displayboard(char board[ROWS][COLS], int row, int col);

//打印1-9的初始化的那部分棋盘
void Displayboard(char board[ROWS][COLS], int row, int col)
{
	int i = 1;
	int j = 1;
	for (i = 0; i < row + 1; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i < row + 1; i++)
	{
		printf("%d ", i);//打印出行数,竖着的一排嘛,方便看是第几行
		for (j = 1; j < col + 1; j++)
		{
			printf("%c ", board[i][j]); 
		}
		printf("\n");
	}
}

 5.void leiboard(char board[ROWS][COLS], int row, int col);

//放雷
void leiboard(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int i = 0;
	//放十个雷,用字符1表示
	for (i = 0; i < pri_count; i++)
	{
		//用随机数产生1-9的随机数(再棋盘为9*9的情况下,改变ROW和COL会改变)
		x = rand() % row + 1;//放到内圈 整个大圈时0-10 内圈是需要初始化和放雷的 即1-9
		y = rand() % col + 1;
		//这个if也是为了让雷在内圈,多的两行两列只是为了判断边缘的雷的情况,如果不设置的话会比较麻烦,或者会越界访问数组。
		//还有个条件就是这个地方没有雷才能放
		if (x > 0 && x < row + 1 && y>0 && y < col + 1&& board[x][y] == '0')
		{
			board[x][y] = '1';
		}
		else
			i--;//因为如果上一个if没进去的话,i就多加了一个1,但是没有放上雷,所以就减去一个1
	}
}

6. void usermove(char board[ROWS][COLS], char userboard[ROWS][COLS], int row, int col);

void usermove(char board[ROWS][COLS], char userboard[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	do
	{
		printf("请输入你要排除的坐标:>");
		scanf_s("%d %d", &x, &y);
		//判断输入的坐标是否正确
		if (x > 0 && x < row + 1 && y>0 && y < col + 1)
		{
			//判断是否为雷
			if (board[x][y] == '1')
			{
				printf("很遗憾ÿ
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值