小游戏扫雷的实现

扫雷小游戏

用C来实现扫雷


前言

扫雷小游戏一个挺有趣味的小游戏,现在来用C语言来实现它吧

一、构思

一个扫雷游戏需要用到二维数组来定义它的行列,
游戏运行需要用到的代码量较大,分开让每个文件中的代码各自运行在将它互相串联起来,即可方便阅读,还可以构清思路。需要用到三个文件,一个头文件,两个源文件。
游戏需要布置雷,判断雷,统计雷,排除雷,先确定这些点来开始慢慢的展开吧。

在这里插入图片描述

头文件中放置需要声明的条件;game.c文件中放置游戏运行代码,test.c文件中放置创建的函数。

二、步骤

1.菜单

玩游戏进入的第一个交互界面就是选择菜单,可供玩家选择;先打印个菜单吧

代码如下(示例):

int main()
{
	int input = 0;//创建一个变量
	do//反复循环,让玩家可以多次玩游戏
	{
		menu();//菜单
		printf("请选择:");
		scanf("%d",&input);
		switch (input)//选择语句来实现玩家和游戏交互界面
		{
		case 1:
			game();//游戏实现的函数
			break;
		case 0:
			printf("退出游戏\n");
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}
void menu()//打印菜单
{
	printf("*******************\n");
	printf("***** 1.play ******\n");
	printf("***** 0.exit ******\n");
	printf("*******************\n");
}

在这里插入图片描述

2.棋盘

想要创建一个9*9大小的游戏棋盘
在tset.c文件中创建函数
代码如下(示例):

void game()
{
	char mine[ROWS][COLS] = { 0 };//存放布置的雷的信息
	char show[ROWS][COLS] = { 0 };//存放排查出雷的信息

	//初始化棋盘的参数
	Initboard(mine, ROWS, COLS, '0');//想要初始化什么样的就由传过去的参数
	Initboard(show, ROWS, COLS, '*');//为了初始化棋盘样子多传递个字符就可以解决冲突
}

在到头文件中定义


#define ROW 9//棋盘内部的是9*9的格子
#define COL 9//玩家下的棋和雷的布置都在这里

#define ROWS ROW+2//要打印的是11*11
#define COLS COL+2//不是11*11的话会出现越界的情况

//初始化棋盘
void Initboard(char board[ROWS][COLS], int rows, int cols,char set);//set设置接收传过来的字符,所以用char

在game.c文件中将棋盘打印出来

void Initboard(char board[ROWS][COLS], int rows, int cols,char set)
{
	int a = 0;//横坐标
	int b = 0;//纵坐标
	for (a = 0; a < rows; a++)
	{
		for (b = 0; b < cols; b++)
		{
			board[a][b] = set;//使棋盘初始化成传递过去的参数得到想要的函数
		}
	}
}

为了让玩家好在游戏中找到坐标接下来要打印这个

void Displayboard(char board[ROWS][COLS], int row, int col)
{
	int x = 0;//打印棋盘的每一行
	int y = 0;//列
	for (x = 0; x <= col; x++) //方便让玩家好判断坐标,打印列第一个数1-9
	{
		printf("%d ", x);
	}
	printf("\n");
	for (x = 1; x <= row; x++)
	{
		printf("%d ", x);//打印每行开头的数1-9
		for (y = 1; y <= col; y++)
		{
			printf("%c ", board[x][y]);
		}
		printf("\n");//打印完一行就换行
	}
}

在这里插入图片描述
有了横竖的数字可以容易的打出想要的坐标


布置雷

void Inment(char mine[ROWS][COLS], int row, int col)
{
	int count = 10;//布置10个雷
	while (count)//循环到0结束
	{//随机放置
		int a = rand() % row + 1;//放置雷的位置在1 —9之间
		int b = rand() % col + 1;//不超出棋盘
		if (mine[a][b] == '0')
		{
			mine[a][b] = '1';//放置一个减去一个
			count--;
		}
	}
}

虽然先打印的棋盘是1111的但是雷只在99内

实现玩家输赢的条件

玩家输入坐标要先判断输入的坐标是否合法,输入的坐标上是否有雷如果没有雷则提示周围有多少雷

void Fundmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int z = 0;//记录排查出的雷的个数
	while (z<row*col-10)//获胜的条件
	{
		printf("请输入检查的坐标: ");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标的合法性
		{
			if (mine[x][y] == '1')//碰到雷
			{
				printf("over\n");
				Displayboard(mine, row,col);
				break;
			}
			else //mine[x][y]=='0'则坐标不是雷统计周围雷的数目
			{
				int count = get_mine_count(mine, x, y);
				show[x][y] = count + '0';//周围有雷统计雷的数
				Displayboard(show, row,col);
				z++;//排查出的雷++
			}
		}
		else {
			printf("输入坐标错误,重新输入\n");
		}
	}
	if (z == row * col - 10)//当排除的雷等于时则雷排完游戏胜利
	{
		printf("恭喜你,游戏成功\n");
		Displayboard(mine, row, col);
	}
}
``

判断统计坐标周围8个坐标是否又累

static 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] +
		mine[x + 1][y + 1] +
		mine[x + 1][y - 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1] - 8 * '0';
}//在11*11的中间实现9*9的棋盘,判断边缘上的棋子是否有炸弹而不会越界

结尾

在源文件中都要引用头文件,才能实现之间的串联
源文件中的#define都可以在头文件中引用
有了这些就能基本的实现扫雷游戏了

代码

头文件的:

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

#define ROW 9//棋盘内部的是9*9的格子
#define COL 9//玩家下的棋和雷的布置都在这里

#define ROWS ROW+2//要打印的是11*11
#define COLS COL+2//不是11*11的话会出现越界的情况

//初始化棋盘
void Initboard(char board[ROWS][COLS], int rows, int cols,char set);//set设置接收传过来的字符,所以用char



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

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

//排查雷
void Fundmine(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 set)
{
	int a = 0;//横坐标
	int b = 0;//纵坐标
	for (a = 0; a < rows; a++)
	{
		for (b = 0; b < cols; b++)
		{
			board[a][b] = set;//使棋盘初始化成传递过去的参数得到想要的函数
		}
	}
}

void Displayboard(char board[ROWS][COLS], int row, int col)
{
	int x = 0;//打印棋盘的每一行
	int y = 0;//列
	for (x = 0; x <= col; x++) //方便让玩家好判断坐标,打印列第一个数1-9
	{
		printf("%d ", x);
	}
	printf("\n");
	for (x = 1; x <= row; x++)
	{
		printf("%d ", x);//打印每行开头的数1-9
		for (y = 1; y <= col; y++)
		{
			printf("%c ", board[x][y]);
		}
		printf("\n");//打印完一行就换行
	}
}

void Inment(char mine[ROWS][COLS], int row, int col)
{
	int count = 10;//布置10个雷
	while (count)//循环到0结束
	{//随机放置
		int a = rand() % row + 1;//放置雷的位置在1 —9之间
		int b = rand() % col + 1;//不超出棋盘
		if (mine[a][b] == '0')
		{
			mine[a][b] = '1';//放置一个减去一个
			count--;
		}
	}
}

static 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] +
		mine[x + 1][y + 1] +
		mine[x + 1][y - 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1] - 8 * '0';
}//在11*11的中间实现9*9的棋盘,判断边缘上的棋子是否有炸弹而不会越界

void Fundmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int z = 0;//记录排查出的雷的个数
	while (z<row*col-10)//获胜的条件
	{
		printf("请输入检查的坐标: ");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标的合法性
		{
			if (mine[x][y] == '1')//碰到雷
			{
				printf("over\n");
				Displayboard(mine, row,col);
				break;
			}
			else //mine[x][y]=='0'则坐标不是雷统计周围雷的数目
			{
				int count = get_mine_count(mine, x, y);
				show[x][y] = count + '0';//周围有雷统计雷的数
				Displayboard(show, row,col);
				z++;//排查出的雷++
			}
		}
		else {
			printf("输入坐标错误,重新输入\n");
		}
	}
	if (z == row * col - 10)//当排除的雷等于时则雷排完游戏胜利
	{
		printf("恭喜你,游戏成功\n");
		Displayboard(mine, row, col);
	}
}

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, '*');//为了初始化棋盘样子多传递个字符就可以解决冲突

	//打印棋盘
	Displayboard(show, ROW, COL);
	
	//布置雷
	Inment(mine, ROW, COL);

	//排查雷
	Fundmine(mine, show, ROW, COL);

}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;//创建一个变量
	do//反复循环,让玩家可以多次玩游戏
	{
		menu();//菜单
		printf("请选择:");
		scanf("%d",&input);
		switch (input)//选择语句来实现玩家和游戏交互界面
		{
		case 1:
			game();//游戏实现的函数
			break;
		case 0:
			printf("退出游戏\n");
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值