C语言入门级小游戏——扫雷

今天我们写一个小游戏——扫雷来增加我们对编程的兴趣在这里插入图片描述
希望这篇文章对友友们有帮助!

游戏思路

在这里插入图片描述

游戏文件的创建

这里我们需要是三个文件
test.c —— 游戏的测试
game.h —— 游戏函数的声明
game.c —— 游戏函数的实现

游戏菜单

游戏菜单
游戏菜单,就像名字一样,是为了方便我们对游戏进行选择。
这里我们创建一个 函数menu 来引导我们开始游戏。在这里插入图片描述
menu函数的功能
1.游戏的开始
2.游戏的退出
3.当选择错误时,重新选择

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

棋盘的创建

初始化棋盘

扫雷游戏要存储布置好的雷,需要一个二维数组。
这里我们需要创建两个二维数组
一个用来存放雷 char mine[][]
一个用来展示该点附近八个坐标雷的个数char show[][]
在这里插入图片描述
在这里插入图片描述
其实本质上我们只需要一个 9 * 9的数组来存放我们的数据
但是当我们想要统计边上坐标附近有几个雷时,我们发现有
一些坐标越界了,所以我们创建一个11*11的数组把边上坐标
附近的空间变成我们自己的。

char mine[ROWS][COLS];//存放布置好的雷  ROWS=11
char show[ROWS][COLS];//存放排查好的雷  COLS=11

这里我们创建一个 Initboard函数 来初始化我们的棋盘

void Initboard(char board[ROWS][COLS], int rows, int cols, char ret)
{
    
    
	int i = 0;
	for (i = 0; i <rows; i++)
	{
    
    
		int j = 0;
		for (j = 0; j < cols; j++)
		{
    
    
			board[i][j] = ret;
		}
	}
}

打印棋盘

然后我们需要把棋盘给打印出来,给玩家进一步游戏。
这里我们创建一个 Displayboad函数 把我们的棋盘打印出来。在这里插入图片描述

void Displayboard(char board[ROWS][COLS], int row, int col)
{
    
    
	int i = 0;
	printf("--------扫雷游戏-------\n");
	for (i = 0; i <= row; i++)
		printf(" %d", i);//打印出我们的列标
	printf("\n");
	for (i = 1; i <= row; i++)
	{
    
    
		int j = 0;
		printf(" %d", i);//打印出我们的行标
		for (j = 1; j <= 9; j++)
		{
    
    
			printf(" %c", board[i][j]);
		}
		printf("\n");
	}
}

注:因为玩家感知到的棋盘是9行9列的,所以我们只
需要打印出9行9列的棋盘就可以了。
mine数组的棋盘最开始全是‘0’
show数组的棋盘最开始全是*’

在这里插入图片描述

布置雷

想要完成布置雷,我们需要生成随机数。
生成随机数我们需要调用 rand() 函数,而使用rand函数我们又要调用函数 srand((unsignedint)time(NULL)) 这个函数只需要调用一次,我们可以把他放到主函数中
这里我们需要调用这两个头文件
1.<stdlib.h>
2.<time.h>
布置雷时需要注意:
1.生成的随机数在1~9之间
x = rand() % row + 1;
y = rand() % row + 1;
2.判断布置的雷是否成功
这里我们创建一个SetMine函数来实现我们的布置雷!在这里插入图片描述

void SetMine(char mine[ROWS][COLS], int row, int col)
{
    
    
	int x, y;
	int count = EasyCount;//布置雷的个数
	while (count)
	{
    
    
		x = rand() % row + 1;
		y = rand() % row + 1;
		if (mine[x][y] == '0')//判断雷是否布置成功
		{
    
    
			mine[x][y] = '1';
			count--;
		}
	}
}

在这里插入图片描述

排查雷

排查雷时我们需要注意:
1.当排查到雷游戏结束
2.当排查到的不是雷时我们需要把该点附近八个坐标雷的在这里插入图片描述
个数放的我们shou数组棋盘中
我们需要创建一个***GetMineCount函数***来计算该点附近
八个坐标雷的个数

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');
		
}

3.判断玩家输入的位置是否正确。
这里我们创建FindMine函数来实现我们的排查雷
4.判断我们的雷什么时候全部排完

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    
    
	int win = 0;
	while (win<(ROW*COL- EasyCount))//判断雷是否全部排完
	{
    
    
		int x, y;
		printf("请输入坐标,中间用空格隔开");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
    
    
			if (mine[x][y] == '1')
			{
    
    
				printf("很遗憾,你被炸死了\n");
				Displayboard(mine, ROW, COL);
				break;
			}
			else
			{
    
    
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				win++;//成功排完一个雷
				Displayboard(show, ROW, COL);
			}

		}
		else 
			printf("坐标非法,重新输入\n");
	}
	if (win == (ROW * COL - EasyCount))
	{
    
    
		printf("恭喜你,排雷成功");
		Displayboard(mine, ROW, COL);
	}
}

在这里插入图片描述

game.h —— 游戏函数的声明

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EasyCount 10//设置雷的数量
void Initboard(char mine[ROWS][COLS], int row, int col, char ret);//初始化棋盘
void Displayboard(char mine[ROWS][COLS], int row, int col);//棋盘打印
void SetMine(char mine[ROWS][COLS], int row, int col);//布置雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排查雷

game.c —— 游戏函数的实现

#include"game.h"
//初始化棋盘
void Initboard(char board[ROWS][COLS], int rows, int cols, char ret)
{
    
    
	int i = 0;
	for (i = 0; i <rows; i++)
	{
    
    
		int j = 0;
		for (j = 0; j < cols; j++)
		{
    
    
			board[i][j] = ret;
		}
	}
}
//棋盘打印
void Displayboard(char board[ROWS][COLS], int row, int col)
{
    
    
	int i = 0;
	printf("--------扫雷游戏-------\n");
	for (i = 0; i <= row; i++)
		printf(" %d", i);
	printf("\n");
	for (i = 1; i <= row; i++)
	{
    
    
		int j = 0;
		printf(" %d", i);
		for (j = 1; j <= 9; j++)
		{
    
    
			printf(" %c", board[i][j]);
		}
		printf("\n");
	}
}
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{
    
    
	int x, y;
	int count = EasyCount;
	while (count)
	{
    
    
		x = rand() % row + 1;
		y = rand() % row + 1;
		if (mine[x][y] == '0')
		{
    
    
			mine[x][y] = '1';
			count--;
		}
	}
}
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');
		
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    
    
	int win = 0;
	while (win<(ROW*COL- EasyCount))
	{
    
    
		int x, y;
		printf("请输入坐标,中间用空格隔开");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
    
    
			if (mine[x][y] == '1')
			{
    
    
				printf("很遗憾,你被炸死了\n");
				Displayboard(mine, ROW, COL);
				break;
			}
			else
			{
    
    
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				win++;
				Displayboard(show, ROW, COL);
			}

		}
		else 
			printf("坐标非法,重新输入\n");
	}
	if (win == (ROW * COL - EasyCount))
	{
    
    
		printf("恭喜你,排雷成功");
		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()
{
    
    

	char mine[ROWS][COLS];//存放布置好的雷
	char show[ROWS][COLS];//存放排查好的雷、
	//初始化棋盘
	Initboard(mine, ROWS, COLS, '0');//mine函数最开始全是‘0’
	Initboard(show, ROWS, COLS, '*');//show函数最开始全是‘*’
	//棋盘打印
	
	Displayboard(show, ROW, COL);
	//布置雷
	SetMine(mine, ROW, COL);
	//排查雷
	FindMine(mine, show, ROW, COL);
	
}
int main()
{
    
    
	srand((unsigned)time(NULL));
	int input = 0;
	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;
}

猜你喜欢

转载自blog.csdn.net/Tiam_cr/article/details/130795233