c语言实现扫雷游戏----数组和函数的实践

目录

前言

游戏功能说明

​编辑

总体思路

分析

建立基本逻辑

设计扫雷相关函数

初始化棋盘

布置雷

打印棋盘

​编辑

排查雷

源代码

头文件game.h

源文件game.c

源文件test.c


前言

想必我们小时候都玩过扫雷游戏吧,当我们学完c语言中数组和函数相关知识后,我们自己也可以实现一个简易版的扫雷游戏了,想想就挺激动的,对吗?接下来就跟着我的脚步一起实现吧~~

c语言实现扫雷游戏----数组和函数的实践_第1张图片


注:如有错误,欢迎指出

创作不易,喜欢的话就点点赞吧~


游戏功能说明

*使用控制台实现经典的扫雷游戏

*游戏可以通过菜单实现继续玩或者退出游戏

*扫雷的棋盘是9*9的格子·默认随机布置10个雷·

*可以排查雷
        #如果位置不是雷,就显示周围有几个雷

        #如果位置是雷,就炸死游戏结束
        #把除10个雷之外的所有雷都找出来,排雷成功,游戏结束

c语言实现扫雷游戏----数组和函数的实践_第2张图片


总体思路

创建两个源文件和一个头文件,

源文件test.c用于测试扫雷游戏代码逻辑;

源文件game.c用于封装实现扫雷游戏需要的函数;

头文件game.h用于声明扫雷游戏需要的相关函数。

注意:源文件game.c和源文件test.c都要包含头文件game.h

至于为什么要分成3个文件,主要的好处是为了设计思路清晰、方便梳理和测试。

c语言实现扫雷游戏----数组和函数的实践_第3张图片

分析

我们首先要制作一个9*9的扫雷棋盘,这个棋盘要存储布置雷的信息和排查雷的信息,

展示给玩家,未扫的地方打印“*

c语言实现扫雷游戏----数组和函数的实践_第4张图片

布置雷的信息:若这个位置是雷,存放1,否则为0。在棋盘中随机布置10个雷,这里需要运用rand函数产生雷的下标。

c语言实现扫雷游戏----数组和函数的实践_第5张图片

排查雷的信息:排雷时,我们通过绿色的小格子里的统计数字推断其周围雷的位置,但是为了防止数组越界,我们加上了绿色的一圈,即格子范围变成了11*11。

c语言实现扫雷游戏----数组和函数的实践_第6张图片

建立基本逻辑

游戏的框架逻辑主要在主函数中建立,一上来打印游戏菜单页面,玩家选择进入游戏或退出游戏。若选择进入游戏,则会进入game()函数,里面封装了与扫雷相关的函数。

c语言实现扫雷游戏----数组和函数的实践_第7张图片

测试基本逻辑

c语言实现扫雷游戏----数组和函数的实践_第8张图片

设计扫雷相关函数

game()函数中封装的函数有如图主要有4个,即 初始化棋盘,布置雷,打印棋盘,排查雷,这是代码逻辑顺序,但是我们实际写代码时需要把 打印棋盘 放在第二,方便测试后面的函数代码。

c语言实现扫雷游戏----数组和函数的实践_第9张图片

初始化棋盘

c语言实现扫雷游戏----数组和函数的实践_第10张图片

布置雷

c语言实现扫雷游戏----数组和函数的实践_第11张图片

测试mine数组,查看10个雷是否布置成功(数字1代表雷)

c语言实现扫雷游戏----数组和函数的实践_第12张图片

打印棋盘

c语言实现扫雷游戏----数组和函数的实践_第13张图片

打印show数组,测试如图

c语言实现扫雷游戏----数组和函数的实践_第14张图片

排查雷

c语言实现扫雷游戏----数组和函数的实践_第15张图片

FindMine()函数需要借助 GetMineCount()函数统计雷的数量,如图,用static修饰GetMineCount()函数是为了让该函数作用于本源文件中。

c语言实现扫雷游戏----数组和函数的实践_第16张图片

测试如图

c语言实现扫雷游戏----数组和函数的实践_第17张图片



源代码

头文件game.h

#pragma once

#include
#include
#include


//定义ROW为9,方便以后修改
#define ROW 9
#define COL 9

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

#define EASY_COUNT 10


//声明函数

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

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

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

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

源文件game.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"


//初始化棋盘  11*11
void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set)
{
	for (int i = 0; i < rows; i++)//行
	{
		for (int j = 0; j < cols; j++)//列
		{
			arr[i][j] = set;
		}
	}
}

//打印棋盘   9*9
void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{
	printf("--------扫雷-------\n");
	//打印行号
	for (int i = 0; i <= row; 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 ", arr[i][j]);
		}
		printf("\n");
	}
	printf("-------------------\n");

}

//布置雷    9*9
void SetMine(char arr[ROWS][COLS], int row, int col)
{
	//布置10个雷
	int count = EASY_COUNT;//EASY_COUNT在头文件game.h中定义为10
	while (count)
	{
		//布置雷
		int x = rand() % row + 1;//生成1~9的下标
		int y = rand() % col + 1;//生成1~9的下标
		//布置一个雷,count--
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}


static int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	int i = 0;
	int count = 0;
	for (i = x - 1; i <= x + 1; i++)
	{
		int j = 0;
		for (j = y - 1; j <= y + 1; j++)
		{
			count += (mine[i][j] - '0');
		}
	}
	return count;
}


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 < row * col - EASY_COUNT)
	{
		printf("请输入要排查的坐标:");
		scanf("%d %d", &x, &y);
		//判断坐标的有效性
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] == '*')
			{
				if (mine[x][y] == '1')
				{
					printf("很遗憾,你被炸死了\n");
					DisplayBoard(mine, ROW, COL);
					break;
				}
				else
				{
					//该坐标不是雷,就得统计坐标周围有几个雷
					int count = GetMineCount(mine, x, y);
					show[x][y] = count + '0';
					DisplayBoard(show, ROW, COL);
					win++;
				}
			}
			else
			{
				printf("该坐标已经被排查了,重新输入坐标\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

源文件test.c

#define _CRT_SECURE_NO_WARNINGS

#include "game.h"//包含自己写的头文件要使用""
void menu()
{
	printf("*************************\n");
	printf("******   1.play    ******\n");
	printf("******   0.exit    ******\n");
	printf("*************************\n");
}



void game()
{
	//mine数组中存放布置好的雷的信息
	char mine[ROWS][COLS] = { 0 };//数组全部初始化为'0'

	//show数组中存放排查出的雷的信息
	char show[ROWS][COLS] = { 0 };//数组全部初始化为'*'

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

	//布置雷
	//就9*9的棋盘上随机布置10个雷
	SetMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);//用于查看数组mine里雷布置情况

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

	//排查雷
	FindMine(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("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

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