简易版扫雷(C语言实现)

想要做出这个游戏,我们需要先了解游戏的玩法。就是在一个棋盘上面有若干个雷(隐藏的),当点击棋盘空格区域时,会显示相邻1格的雷的个数,若点中了雷,则游戏结束。

接下来让我们看看该如何做到这个扫雷游戏的实现。

还是一样,我们把这游戏的代码分成三个文件来完成,一个game.h用来存放游戏实现的各种函数声明以及头文件,game.c用来放游戏的实现函数定义,test.c用来存放游戏的界面打印和运行过程代码。

首先我们需要打印出游戏菜单来让玩家选择,代码如下:

void menu()
{
	printf("***************************\n");
	printf("*******  1.play  **********\n");//选择1进行游戏
	printf("*******  0.exit  **********\n");//0退出游戏
	printf("***************************\n");
}

然后让我们看一下主函数的代码:
 

int main()
{
	int in = 0;
	srand((unsigned int)time(NULL));//设置随机数
	do 
	{
		menu();//打印菜单
		printf("请选择\n");
		scanf_s("%d", &in);
		switch (in)//接收输入的数,进行判断
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误");
			break;
		}
	} while (in);//循环,只要不选择退出游戏就可以一直玩
	return 0;
}

然后给大家看一下game.h中的代码

接下来就是这个游戏的核心部分,game.c的代码该如何设置:
首先我们来分析一下该如何做,先我们需要一个棋盘来设置雷,但是我们又不能够将雷直接放给玩家看,所以我们需要在设置一个棋盘,展示给玩家看,让他们进行扫雷。我们将设置雷的棋盘上全部放上 0 ,然后雷设置为 1 ,展示给玩家的棋盘全部设为 * ,让玩家进行扫雷,下面是代码:
 

char mine[ROWS][COLS] = { 0 };//定义的设置雷的棋盘
char show[ROWS][COLS] = { 0 };//玩游戏的棋盘
InitBoard(mine, ROWS, COLS, '0');//将棋盘中放上 0 
InitBoard(show, ROWS, COLS, '*');//将棋盘全部放上 * 
void InitBoard(char board[ROWS][COLS], int rs, int cs,char set)//这个函数是给棋盘赋上值
{
	int i, j;
	for (i = 0; i < rs; i++)
	{
		for (j = 0; j < cs; j++)
		{
			board[i][j] = set;
		}
	}
}

接下来打印展示的游戏棋盘,同时为了美观和游戏体验,我们将棋盘设置成大两行的数列,便于操作,并在棋盘上下划线便于区分:
 

void show_board(char board[ROWS][COLS], int r, int c)
{
	int i, j;
	printf("-----------扫雷-----------\n");
	for (i = 0; i <= c; i++)//这一步是将每一列的列数打印出来
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= r;i++)
	{
		printf("%d ", i);//将每一行的行数打印出来
		for (j = 1; j <= c; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("-----------扫雷-----------\n");

}

然后就是布置雷了,这里我们要用到rand函数,随机设置雷的分布,并要注意不能重复设置:
 

void set_mine(char board[ROWS][COLS], int r, int c)
{
	int x, y;
	int count = COUNT;//雷的个数
	while (count)//当雷不为0时进入循环
	{
		x = rand() % r + 1;//在1到r中取随机数坐标
		y = rand() % r + 1;
		if (board[x][y] == '0')//当没有设置过雷时才能进入设置雷,否则重新循环
		{
			board[x][y] = '1';
			count--;//当设置了一个雷后,雷的数量减一
		}
	}
}

接下来让我们开始扫雷:

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 find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c)
{
	int x, y, win = 0;//win为排查非雷的个数
	while (win < r * c - COUNT)
	{
		printf("请输入要排查的坐标:\n");
		scanf_s("%d%d", &x, &y);
		if (x >= 1 && x <= r && y >= 1 && y <= c)
		{
			if (mine[x][y] == '1')//如果输入的坐标有雷,进入
			{
				printf("很遗憾,被炸死了。\n");
				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("坐标非法,重新输入\n");
		}
	}
	if (win == r * c - COUNT)//当非雷数与棋盘的格数减去雷数相等时,则游戏胜利
	{
		printf("恭喜你,排雷成功\n");
		show_board(mine, ROW, COL);
	}
}

然后这游戏的主要代码已经写完了,给你们整合一下game.h和test.c的代码:

game.h

#pragma once
#include
#include
#include
#define COL 9
#define ROW 9
#define ROWS 11
#define COLS 11
#define COUNT 10
void InitBoard(char board[ROWS][COLS], int r, int c,char set);
void show_board(char board[ROWS][COLS],int r,int c);
void find_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int r, int c);
void set_mine(char board[ROWS][COLS], int r, int c);

test.c

#include"game.h"
void menu()
{
	printf("***************************\n");
	printf("*******  1.play  **********\n");
	printf("*******  0.exit  **********\n");
	printf("***************************\n");
}
void game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	set_mine(mine, ROW, COL);
	show_board(show, ROW, COL);
	find_mine(mine, show, ROW, COL);
}
int main()
{
	int in = 0;
	srand((unsigned int)time(NULL));
	do 
	{
		menu();
		printf("请选择\n");
		scanf_s("%d", &in);
		switch (in)
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误");
			break;
		}
	} while (in);
	return 0;
}

好了,这一次的扫雷游戏就结束了,快点写完去玩两把吧,自己做到游戏玩起来可是有不同的成就感哦!

看到这里了还不三连吗!!!

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