扫雷游戏(C语言)

目录

  • 一:问题描述
  • 二:游戏逻辑分析流程
  • 三:代码模块
    • 3.1菜单实现
    • 3.2创建棋盘
    • 3.3棋盘初始化
    • 3.4在mine数组中布置雷
    • 3.5打印棋盘
    • 3.6玩家排查雷
  • 四:结果演示
    • 4.1排雷失败
    • 4.2排雷成功
  • 五:项目源代码

一:问题描述

用C语言实现9*9扫雷小游戏

二:游戏逻辑分析流程

1.菜单界面选择开始或者退出游戏。
2.创建两个数组来存放布置雷的信息和排查出雷的信息。
3.初始化两个棋盘。
4.布置雷。
5.打印棋盘,让棋盘可视化。
6.玩家排雷,并判断排雷是否成功。

三:代码模块

3.1菜单实现

菜单界面
void menu()
{
	printf("*************************\n");
	printf("*********1.play**********\n"); //1开始游戏
	printf("*********0.eixt**********\n"); //0退出游戏
	printf("*************************\n");
}

3.2创建棋盘

创建棋盘

棋盘:使用11行11列二维数组mine和show来表示,元素类型是char类型;玩家界面是9行9列的格子,使用11行11列的二维数组是避免排查雷时出现越界问题。

使用宏定义:
(1)提高代码的可读性,方便理解含义
(2)提高项目的扩展性,方便未来修改棋盘尺寸

#define ROW 9
#define COL 9

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

//mine数组是用来存放布置好雷的信息
	char mine[ROWS][COLS] = { 0 };    
//show数组是用来存放排查出雷的信息
	char show[ROWS][COLS] = { 0 };    

3.3棋盘初始化

棋盘初始化

注意这里传递了参数set,可以通过函数Init_board一次性实现mine数组和show数组的初始化。

//初始化棋盘
Init_board(mine, ROWS, COLS, '0');
Init_board(show, ROWS, COLS, '#');

void Init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{
	int i, j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

3.4在mine数组中布置雷

布置雷
#define EASY_COUNT 10 //用define宏定义雷的个数

//布置雷
void Set_mine(char mine[ROWS][COLS], int row, int col)
{
	int x, y = 0;
	int count = EASY_COUNT;
	while (count)
	{
		x = rand() % row + 1; //1~9
		y = rand() % col + 1; //1~9

		if (mine[x][y] == '0') //判断所布置的位置是否已经有雷
		{
			mine[x][y] = '1'; //布置雷'1'
			count--;  //注意count--在判断条件成立下执行,
			          //不能写成while(count--)
		}
	}
}

3.5打印棋盘

打印棋盘
void Show_board(char arr[ROWS][COLS], int row, int col)
//注意这里的参数row和col,接收的是调用函数的实参ROW和COL
//虽然用的仍然是11*11数组,但只操作9*9部分
{
	int i = 0, j = 0;
	printf("-----------扫雷-----------\n");
	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 ", arr[i][j]);
		}
		printf("\n");
	}
}

3.6玩家排查雷

排雷

注意Find_mine函数接收了mine数组和show数组,mine数组用来判断玩家输入的坐标位置是否有雷,show数组用来显示排查出的雷的信息。

//找出(x,y)坐标周围雷的个数
int get_mine_count(char mine[ROWS][COLS],int x, int y)
{
	int sz = 0;
	int i = x - 1, j = y - 1;
	for (i = x - 1; i <= x + 1; i++)
	{
		for (j = y - 1; j <= y + 1; j++)
		{
			  sz = sz + mine[i][j] - '0';
		}
	}
	return sz;
}
//排查雷
void Fine_mine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
	int x, y = 0;
	int win = 0;
	while (win<row*col-EASY_COUNT) //win是作为完全排查成功后的结束条件
	{
		printf("请输入要排查的坐标:>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了");
				Show_board(mine, ROW, COL);
				break;
			}
			else
			{
				int count = get_mine_count(mine, x, y); //调用get_mine_count函数,找出所输入坐标周围雷的个数
				show[x][y] = count + '0'; //因为show数组的类型是char
				Show_board(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("非法坐标,请重新输入");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功!");
		Show_board(mine, ROW, COL);
	}
}

四:结果演示

4.1排雷失败

排雷失败

扫雷游戏(C语言)_第1张图片

4.2排雷成功

排雷成功

这里取巧,直接修改了雷的个数,并在透析雷所处的位置的情况下实现。
扫雷游戏(C语言)_第2张图片

五:项目源代码

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include

#define ROW 9
#define COL 9

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

#define EASY_COUNT 10

//初始化棋盘声明
void Init_board(char arr[ROWS][COLS], int rows, int cols, char set);

//打印棋盘声明
void Show_board(char arr[ROWS][COLS], int row, int col);

//布置雷声明
void Set_mine(char arr[ROWS][COLS], int row, int col);

//排查雷	声明
void Find_mine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);
//初始化棋盘
void Init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{
	int i, j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

//打印棋盘
void Show_board(char arr[ROWS][COLS], int row, int col)//使用的仍然是11*11数组,但只操作9*9部分

{
	int i = 0, j = 0;
	printf("-----------扫雷-----------\n");
	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 ", arr[i][j]);
		}
		printf("\n");
	}
}


//布置雷
void Set_mine(char mine[ROWS][COLS], int row, int col)
{
	int x, y = 0;
	int count = EASY_COUNT;
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;

		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}


int get_mine_count(char mine[ROWS][COLS],int x, int y)
{
	int sz = 0;
	int i = x - 1, j = y - 1;
	for (i = x - 1; i <= x + 1; i++)
	{
		for (j = y - 1; j <= y + 1; j++)
		{
			  sz = sz + mine[i][j] - '0';
		}
	}
	return sz;
}
//排查雷
void Find_mine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
	int x, y = 0;
	int win = 0;
	while (win<row*col-EASY_COUNT)
	{
		printf("请输入要排查的坐标:>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了");
				Show_board(mine, ROW, COL);
				break;
			}
			else
			{
				int count = get_mine_count(mine, x, y);
				show[x][y] = count + '0';
				Show_board(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("非法坐标,请重新输入");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功!");
		Show_board(mine, ROW, COL);
	}
}
void menu()
{
	printf("*************************\n");
	printf("*********1.play**********\n");
	printf("*********0.eixt**********\n");
	printf("*************************\n");
}

void game()
{
	//扫雷游戏的实现
	//mine数组是用来存放布置好雷的信息
	char mine[ROWS][COLS] = { 0 };    
	//show数组是用来存放排查出雷的信息
	char show[ROWS][COLS] = { 0 };    

	//初始化棋盘
	Init_board(mine, ROWS, COLS, '0');
	Init_board(show, ROWS, COLS, '#');

	//布置雷
	Set_mine(mine, ROW, COL);

	//打印棋盘
	//Show_board(mine, ROW, COL);
	Show_board(show, ROW, COL);

	//排查雷
	Find_mine(mine,show, ROW, COL);
}
int main()
{
	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("选择错误,请重新选择:>");
			break;
		}
	} while (input);
	return 0;
}

你可能感兴趣的:(游戏,c语言,开发语言)