【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】

目录

  • 一、扫雷游戏的运行逻辑
  • 二、代码逻辑讲解+源码
    • 1.打印一个简易的游戏开始菜单
    • 2.创建数组储存数据并初始化数组
      • 代码逻辑讲解
      • 源码
    • 3.布雷
      • 代码逻辑讲解
      • 源码
    • 4.排雷
      • 代码逻辑
      • 源码
  • 三、结果展示
  • 完整源码链接

一、扫雷游戏的运行逻辑

1.鼠标点击进行扫雷
2.若此处没有雷则会显示周围相应的雷的数目
3.若踩雷则游戏失败【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第1张图片

二、代码逻辑讲解+源码

这里我们以9*9规格来实现简易版扫雷的游戏代码

【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第2张图片
逻辑思维导图↓
【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第3张图片

注意:好的代码习惯——边写边调试,不要把错误累积到最后

1.打印一个简易的游戏开始菜单

#include "game.h"//所有需要用到的编译预处理命令放game.h头文件里,这里直接引用头文件
//#include 
void menu()
{
	printf("***********1.star game***********\n");
	printf("*********************************\n");
	printf("***********0.quit game***********\n");
}
void game(){}
int main()
{
	int input = 0;
	do//循环体至少执行一次所以选用do while循环
	{
		menu();
		printf("请输入数字:");
		scanf("%d", &input);
		if (1 == input)
		{
			printf("游戏开始\n");
			game();//游戏运行
		}
		else if (0 == input)
		{
			printf("退出游戏\n");
			break;
		}
		else
		{
			printf("选择错误请重新输入\n");
		}
	} while (input);
	return 0;
}

运行结果↓
【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第4张图片
【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第5张图片

2.创建数组储存数据并初始化数组

代码逻辑讲解

【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第6张图片

源码

//在头文件中定义二维二维数组的行和列,注意编译预处理命令后面没有;
#define ROW 9//方便后期对数组的行和列进行修改#define COL 9

#define ROWS ROW+2
#define COLS COL+2

//初始化数组
void init_board(char board[ROWS][COLS], int rows, int cols, char symbol);

//打印数组
void print_board(char board[ROWS][COLS], int row, int col);
  • 注意:编译预处理命令后面没有分号 ' ; '
//test.c
void game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化数组
	init_board(mine, ROWS, COLS, '0');//0和‘0’不一样,如果数组里面元素都是0打印出来什么也不显示,所里这里也需要初始化
	init_board(show, ROWS, COLS, '*');
	//打印数组
	print_board(show, ROW, COL);
	print_board(mine, ROW, COL);
}
  • 对于书写初始化函数的注意:被指定的初始化的符号也属于函数参数(变量)之一
  • 初始化函数和打印函数注意被初始化的数组是原本创建的11×11数组,但是打印的时候只需要打印9×9的数组,两个函数传参传的不一样
//game.c
//初始化数组
void init_board(char board[ROWS][COLS], int rows, int cols, char symbol)
{
	int i = 0, j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = symbol;
		}
	}
}


//打印数组
void print_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0, j = 0;
	//打印一下列数
	printf("%d", i);//补齐空位
	for (i = 1; i <= col; i++)
	{
		printf(" %d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d", i);//打印行数
		for (j = 1; j <= col; j++)
		{
			printf(" %c ", board[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

运行结果↓
【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第7张图片

3.布雷

代码逻辑讲解

1.操作对象是mine数组
2.生成两个随机数(x,y)作为要布置雷的坐标
3.判断此处是否已经布过雷
4.用字符1来代表“有雷
5.while循环这个过程

【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第8张图片

源码

//布雷(头文件函数声明
void set_mine(char board[ROWS][COLS], int row, int col);
#define MINE 10 //设置布雷的数目
//布雷(MINE)
void set_mine(char board[ROWS][COLS], int row, int col)
{

	int count = 0;
	while (count < MINE)
	{
		//这里要注意!!布雷的时候要防止布在重复(相同的坐标)所以要判断一下!!
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';//注意这里放的是字符‘1’
			count++;
		}
	}
}

【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第9张图片

4.排雷

代码逻辑

【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第10张图片

【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第11张图片
【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第12张图片

源码

//game.c

int mine_is(char board[ROWS][COLS], int x, int y)
{
	return (board[x - 1][y - 1] +
		board[x - 1][y] +
		board[x - 1][y + 1] +
		board[x][y - 1] +
		board[x][y + 1] +
		board[x + 1][y - 1] +
		board[x + 1][y] +
		board[x + 1][y + 1] - 8 * '0');
}
//排雷
void clearance_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
	printf("开始排雷\n");
	int win = 0;
	while (win < ROW * COL - MINE)//只要雷没有排完就一直循环排雷的过程
	{
		printf("请输入要排雷的坐标:");
		int x = 0, y = 0;
		scanf("%d %d", &x, &y);
		//首先判断坐标是否合法
		if (x > 0 && x < rows - 2 && y>0 && y < cols - 2)
		{
			//再判断坐标是否已经排过雷
			if (show[x][y] == '*')
			{
				if (mine[x][y] != '1')//此处不是雷,则用字符数字替换'*'
				{
					show[x][y] = (mine_is(mine, x, y) + '0');
					print_board(show, ROW, COL);
					win++;
				}
				else//如果踩雷
				{
					printf("很遗憾,你被炸死了,排雷失败\n");
					break;
				}
			}
		}
		else
		{
			printf("坐标非法请重新输入:");
		}
	}
	if (win == ROW * COL - MINE)//排雷成功跳出循环
	{
		printf("恭喜你排雷成功!\n");
	}
}

三、结果展示

(真正玩游戏的时候不用打印mine数组)【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】_第13张图片

完整源码链接

点击获取完整源码

你可能感兴趣的:(C语言—小游戏,学习笔记,c语言)