C语言——如何实现扫雷游戏,详细解析

目录

一、扫雷游戏介绍

二、基本流程设计思路

三、代码实现

1、整体框架

2、菜单选项

3、游戏内部的实现

3.1 雷盘的初始化

3.2 打印雷盘

3.3 布置雷

3.4 扫雷

四、总代码

1、主函数源文件test.c

2、头文件game.h 

3、自定义函数源文件game.c

五、代码运行实例展示


 

一、扫雷游戏介绍

扫雷游戏的规则是,当点击某个位置时:

如果这个位置有雷,玩家就会被炸,展示雷盘中所有雷的位置,游戏结束;

如果这个位置没有雷,则点击的这个位置就会出现一个数字,这个数字代表的是这个位置周围一圈(8个位置)的雷的总数

C语言——如何实现扫雷游戏,详细解析_第1张图片

这里设计一个9*9的雷盘让玩家玩,所以我们程序员在设计这个雷盘的时候,需要创建11*11的雷盘 ,最主要的原因是因为9*9的每个无雷的位置,都会显示这个位置周围一圈的雷的总数。


 

二、基本流程设计思路

1.创建一个用户交互菜单
2.创建一个 mine雷盘 用来埋雷并初始化
3.创建一个 show雷盘 用来和用户交互并初始化
4.玩家选择想要扫描的坐标
5.判定游戏是否结束
6.若踩雷,展示所有雷的位置,游戏结束;若没有踩雷则在刚扫描的区域上显示周围八个区域的地雷数目,并继续游戏
7.继续扫雷
8.判定游戏是否结束

9.若全部扫描完,未被炸,则判断玩家赢


 

三、代码实现

1、整体框架

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

int main()
{
	test();
	return 0;
}

通过switch语句选择是否进入游戏。 

srand((unsigned int)time(NULL):用于随机生成起点函数和时间戳来进行雷的随机生成起点位置的功能。


2、菜单选项

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

3、游戏内部的实现

void game()
{
	//雷的信息储存
	//1.布置好的雷的信息
	char mine[ROWS][COLS] = { 0 };//11*11的棋盘
	//2.排查出雷的信息
	char show[ROWS][COLS] = { 0 };
	//初始化
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	//打印棋盘
	DisplayBoard(mine, ROW, COL);
	DisplayBoard(show, ROW, COL);
	//布置雷
	SetMine(mine, ROW, COL);
	//扫雷
	FindMine(mine, show, ROW, COL);
}

3.1 雷盘的初始化

//初始化
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

程序员设计的雷盘全部用字符 ' 0 ' 初始化,给玩家展示玩的雷盘全部用字符 ' * ' 初始化。

这样做的原因是便于我们程序员设计雷盘。  

 

3.2 打印雷盘

//打印雷盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	//打印列号
	for (i = 0; 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");
	}
}

1、打印出程序员设计的雷盘,并将第一行和第一列的每个位置打印出相应的序号。

2、打印出玩家玩的雷盘,即9*9,并在雷盘的最上面和最右面打印出序号,如图。 

C语言——如何实现扫雷游戏,详细解析_第2张图片

 

3.3 布置雷

//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;//这样x的随机范围就是1-9
		int y = rand() % row + 1;//这样y的随机范围就是1-9
		if (board[x][y] == '0')
		{
			board[x][y]='1';
				count--;
		}
	}
}

这里的rand函数和上面的 srand函数,就能随机生成所在范围内雷的位置。 

 

3.4 扫雷

//为了计算x,y坐标周围有几个雷,方便在扫雷函数里使用
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1] - 8 * '0';
}
//扫雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//坐标合法
			//1.踩到雷
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸了\n");
				DisplayBoard(mine, row, col);
				break;
			}
			else //不是雷
			{
				//计算x,y坐标周围有几个雷,设计一个函数
				int count = get_mine_count(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, row, col);
				win++;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入!\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
	}
}

在扫雷这个步骤里,就能体现出程序员的设计雷盘,当玩家踩到雷后,展示出整个雷盘里面所以雷的位置,这个时候就是打印程序员的设计雷盘。 


四、总代码

创建三个文件

第一个:主函数源文件test.c

第二个:函数声明t头文件game.h 

第三个:自定义函数源文件game.c

 

1、主函数源文件test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include"game.h"
void menu()
{
	printf("********************************\n");
	printf("****** 1. play    0. exit ******\n");
	printf("********************************\n");
}

void game()
{
	//雷的信息储存
	//1.布置好的雷的信息
	char mine[ROWS][COLS] = { 0 };//11*11的棋盘
	//2.排查出雷的信息
	char show[ROWS][COLS] = { 0 };
	//初始化
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	//打印棋盘
	DisplayBoard(mine, ROW, COL);
	DisplayBoard(show, ROW, COL);
	//布置雷
	SetMine(mine, ROW, COL);
	//扫雷
	FindMine(mine, show, ROW, COL);
}
void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
}

int main()
{
	test();
	return 0;
}

 

2、头文件game.h 

#pragma once
#define ROW 9
#define COL 9

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

#define EASY_COUNT 10 //定义雷的个数

#include
#include
#include

//初始化
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);
//扫雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

3、自定义函数源文件game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

//初始化
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

//打印雷盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	//打印列号
	for (i = 0; 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");
	}
}

//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;//这样x的随机范围就是1-9
		int y = rand() % row + 1;//这样y的随机范围就是1-9
		if (board[x][y] == '0')
		{
			board[x][y]='1';
				count--;
		}
	}
}

//为了计算x,y坐标周围有几个雷,方便在扫雷函数里使用
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1] - 8 * '0';
}
//扫雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//坐标合法
			//1.踩到雷
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸了\n");
				DisplayBoard(mine, row, col);
				break;
			}
			else //不是雷
			{
				//计算x,y坐标周围有几个雷,设计一个函数
				int count = get_mine_count(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, row, col);
				win++;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入!\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
	}
}

 

五、代码运行实例展示

C语言——如何实现扫雷游戏,详细解析_第3张图片 

 

 

你可能感兴趣的:(C语言,c语言,学习,大数据,安全)