C语言——实现“扫雷”小游戏(简易版)

2023-01-09 07:55:35

扫雷游戏想必我们都有玩过,那么今天就用C语言来简单实现“扫雷”小游戏!

目录

一.游戏规则

二.基本思路介绍

三.各功能代码实现

1.创建用户交互界面

2.初始化棋盘函数

3.埋雷函数

4..显示棋盘函数

5.排雷函数

四.完整代码

五.程序运行展示


一.游戏规则

扫雷是非常经典的一款游戏,给出一张棋盘,根据自己选择的位置来判断该位置是否有雷,如果有雷则游戏结束,如果没有雷,则该位置显示附近区域的雷的个数,并继续选择位置,直至排除所有的雷为止。

以上是扫雷的游戏规则,但我们自己实现时,也同样需要给出自己所设计的规则。

1.在定义棋盘时,定义9*9的棋盘,以二维数组来实现;

2.布雷时,‘0’代表该位置没有雷,‘1’代表该位置有雷(以‘1’代表有雷是为了方便后面对于所选位置周围雷数的计算);

3.由于该程序只是简易版本,因此不能像电脑上的扫雷小游戏那样,可以一次排除点击位置附近所有可排位置,只能一个一个位置的去输入判断。

二.基本思路介绍

1.首先创建一个用户交互界面,方便进行游戏;

2.定义出显示棋盘,用来给用户看的,棋盘大小为9*9,以二维数组来定义出棋盘;

3.定义出实际操作棋盘,即用来实现埋雷、扫雷、计算所选位置雷数等功能的棋盘,该棋盘需要设置大小为11*11,这样方便后续对于棋盘的操作;

4.初始化棋盘,显示棋盘全部初始化为‘*’,实际操作棋盘全部初始化为‘0’;

5.进行埋雷,我们设置雷的个数为10个,利用随机播种来随机生成雷的位置,将埋雷的位置赋值为‘1’;

6.开始排雷,直至碰到雷 or 排除所有雷为止,游戏结束。

三.各功能代码实现

1.创建用户交互界面

int main(int argc, char* argv[])
{
	int select = 1;
	while (select)
	{
		printf("*******扫雷小游戏*******\n");
		printf("*        1.Play        *\n");
		printf("*        0.Exit        *\n");
		printf("************************\n");
		printf("请输入你的选择:>");
		scanf("%d", &select);
		if (select == 0)
			break;
		if (select != 1)
		{
			printf("输入有误,请重新输入...\n");
			continue;
		}
		StartGame();
	}
	printf("退出游戏,欢迎下次使用...\n");
	return 0;
}

2.初始化棋盘函数

void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = set;
		}
	}
}

3.埋雷函数

利用srand函数随机播种,生成雷的位置

void SetMine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	srand(time(0));
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

4..显示棋盘函数

根据传入不同的棋盘来显示

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	for (int i = 0; i <= col; i++)
		printf("%d ", i);
	printf("\n");
	for (int i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

5.排雷函数

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int win = 0;
	int x, y;
	while (win < col * row - EASY_COUNT)
	{
		printf("请输入排雷的位置:>");
		scanf("%d %d", &x, &y);
		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
			if (mine[x][y] == '1')
			{
				DisplayBoard(mine, ROW, COL);
				printf("很遗憾,排雷失败,你被炸糊了...\n");
				break;
			}
			int n = GetMineCount(mine, x, y);
			show[x][y] = n + '0';
			system("cls");
			DisplayBoard(show, ROW, COL);
			win++;
		}
		else
			printf("非法输入,请重新输入...\n");

	}
	if (win >= col * row - EASY_COUNT)
	{
		printf("恭喜你,排雷成功...\n");
		DisplayBoard(mine, ROW, COL);
	}
}

四.完整代码

#define _CRT_SECURE_NO_WARNINGS

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

//用于棋盘的显示
#define ROW 9
#define COL 9

//用于真实的处理
#define ROWS ROW+2
#define COLS COL+2

#define EASY_COUNT 10

void StartGame();

void InitBoard(char board[ROWS][COLS], int row, int col, char set);
void SetMine(char mine[ROWS][COLS], int row, int col);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);
int GetMineCount(char mine[ROWS][COLS], int x, int y);

int main(int argc, char* argv[])
{
	int select = 1;
	while (select)
	{
		printf("*******扫雷小游戏*******\n");
		printf("*        1.Play        *\n");
		printf("*        0.Exit        *\n");
		printf("************************\n");
		printf("请输入你的选择:>");
		scanf("%d", &select);
		if (select == 0)
			break;
		if (select != 1)
		{
			printf("输入有误,请重新输入...\n");
			continue;
		}
		StartGame();
	}
	printf("退出游戏,欢迎下次使用...\n");
	return 0;
}
void StartGame()
{
	char show[ROWS][COLS];
	char mine[ROWS][COLS];

	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');//字符0代表无雷,1代表雷
	InitBoard(show, ROWS, COLS, '*');
	
	//埋雷
	SetMine(mine, ROW, COL);
	//显示棋盘
	DisplayBoard(show, ROW, COL);
	//扫雷
	FindMine(mine, show, ROW, COL);
}
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = set;
		}
	}
}

void SetMine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	srand(time(0));
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	for (int i = 0; i <= col; i++)
		printf("%d ", i);
	printf("\n");
	for (int i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int win = 0;
	int x, y;
	while (win < col * row - EASY_COUNT)
	{
		printf("请输入排雷的位置:>");
		scanf("%d %d", &x, &y);
		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
			if (mine[x][y] == '1')
			{
				DisplayBoard(mine, ROW, COL);
				printf("很遗憾,排雷失败,你被炸糊了...\n");
				break;
			}
			int n = GetMineCount(mine, x, y);
			show[x][y] = n + '0';
			system("cls");
			DisplayBoard(show, ROW, COL);
			win++;
		}
		else
			printf("非法输入,请重新输入...\n");

	}
	if (win >= col * row - EASY_COUNT)
	{
		printf("恭喜你,排雷成功...\n");
		DisplayBoard(mine, ROW, COL);
	}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]
		+ mine[x][y - 1] + mine[x][y + 1] +
		mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - (8 * '0');
}

五.程序运行展示

 

 

 

 

  • 作者:Li_yizYa
  • 原文链接:https://blog.csdn.net/qq_58284486/article/details/122631582
    更新时间:2023-01-09 07:55:35