【C语言】扫雷(简易版)

1.编程前的准备

在编程前我们要分析扫雷的游戏机制,这样我们才有思路敲代码
下面是微软扫雷的链接,可以玩一下了解游戏规则
微软扫雷游戏链接:link

2.开始编写代码

我们需要创建一个头文件“game.h”用来存放函数声明和头文件,以及#define定义的常量,这样我们就只需要再每个需要的源文件第一行加上#include"game.h"就可以了。
再这个头文件创建完成后,再将两个源文件,一个用来装主函数,一个用来装游戏的主体。
在这里插入图片描述
再两个源文件里添加game.h
在这里插入图片描述
game.h里面封装的函数声明,头文件以及#define定义的常量

2.1菜单

首先我们需要一个游戏菜单,提示我们玩游戏,还是退出游戏
代码如下
在这里插入图片描述

2.2构建游戏是否开始的程序

在这里插入图片描述

2.3创建函数,调用其他函数,实现游戏功能

在这里插入图片描述
这里布置雷的数组是一个12X12的二维数组,因为我们要实现一个9X9的雷区,有人可能会问为什么不直接创建一个9X9的二维数组,下面我将给大家讲解为什么使用12X12的二维数组。
下图是我们要实现的9X9的雷区,因为我们要实现选择一个坐标,假如这个坐标没有地雷,则显示该坐标附近又多少地雷,如果你要使用9X9的二维数组来储存数据,当你选择靠近边缘的最表示,就会越界访问,所以我们使用12X12的二维数组。
在这里插入图片描述
再就是存放排查地雷信息的数组选择和布置地雷数组一样的长度是为了方便使用,不然再写部分程时,还要单独为排查数组创建一个函数。

2.4初始化雷区

在这里插入图片描述
这里用char ch当作给数组初始化的值,是为了让这个函数具有通用性,想给数组每个元素初始化什么,直接将初始化的值传给ch。

2.5打印雷区

我们要在命令窗口里打印一个雷区,这样我们才能知道该选择什么坐标。
在这里插入图片描述

2.6布置地雷

使用rand();函数布置地雷,使地雷每次开始游戏具有随机性
在这里插入图片描述

2.7排查地雷

如果find函数返回’W’,表示玩家排出所有地雷,游戏胜利,如果返回‘D’,表示玩家踩到地雷,游戏结束。
在这里插入图片描述

2.7.1排查选择坐标的周围坐标地雷的数量(此代码一定要放在find函数上面)

如何确定选择坐标周围的坐标,如下图所示
在这里插入图片描述
根据上图的结论得到下图代码
在这里插入图片描述

2.8判断游戏结果

在这里插入图片描述

3.程序的全部代码

game.h头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
//实际雷区的大小
#define ROWS 12
#define COLS 12
//打印雷区的大小
#define ROW 9
#define COL 9
//地雷的数量
#define COUNT 10
//初始化雷区
void init_board(char show[ROWS][COLS], int row, int col,char ch);
//打印雷区
void display_board(char show[ROWS][COLS], int row, int col);
//布置地雷
void set_mine(char mine[ROWS][COLS]);
//排查雷
char find(char show[ROWS][COLS], char mine[ROWS][COLS],int row,int col, int count);
//查找坐标附近的地雷
int find_count(char mine[ROWS][COLS], int x, int y);

game.c源文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"


void init_board(char show[ROWS][COLS], int row, int col,char ch)
{
	int i = 0;
	int j = 0;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
		{
			show[i][j] = ch;
		}
	}
}


void display_board(char show[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("---------------扫雷---------------\n");
	//打印纵向坐标
	printf("0 1 2 3 4 5 6 7 8 9\n");
	for (i = 1; i <= row; i++)
	{
		//打印横向坐标
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", show[i][j]);
		}
		printf("\n");
	}
}


void set_mine(char mine[ROWS][COLS])
{
	int count = COUNT;
	while (count)
	{
		int x = rand() % 9 + 1;
		int y = rand() % 9 + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '#';
			count--;
		}
	}
}


int find_count(char mine[ROWS][COLS], int x, int y)
{
	int flag1 = -1;
	int flag2 = -1;
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 0; i < 3; i++)
	{
		flag2 = -1;
		for (j = 0; j < 3; j++)
		{
			if (mine[x + flag1][y + flag2] == '#')
			{
				count++;
			}
			flag2++;
		}
		flag1++;
	}
	return count;
}


char find(char show[ROWS][COLS], char mine[ROWS][COLS],int row, int col, int count)
{
	int num = 0;
	while (1)
	{
		int x = 0;
		int y = 0;
		printf("请输入要排查区域的坐标:>");
		scanf("%d %d", &x, &y);
		if (x <= row && x >= 1 && y <= col && y >= 1)
		{
			if (show[x][y] == '*')
			{
				if (mine[x][y] != '#')
				{
					show[x][y] = find_count(mine, x, y) + '0';
					num++;
				}
				else
				{
					return 'D';
				}
			}
			else
			{
				printf("目标区域已被排查,请重新输入坐标\n");
				continue;
			}
		}
		else
		{
			printf("非法输入,请重新输入坐标\n");
			continue;
		}
		if (num == row * col - count)
		{
			return 'W';
		}
		display_board(show, ROW, COL);
	}
}

test.c包含主函数的源文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//打印游戏菜单
void menu()
{
	printf("***************************\n");
	printf("******     1.play    ******\n");
	printf("******     0.exit    ******\n");
	printf("***************************\n");
}
void game()
{
	char ret = 0;
	//mine数组专门用来存放布置地雷的信息
	char mine[ROWS][COLS] = { 0 };

	init_board(mine, ROW, COL, '0');
	//show数组专门用来存放排查出地雷的信息
	char show[ROWS][COLS] = { 0 };
	//初始化雷区
	init_board(show, ROW, COL,'*');
	//打印雷区
	display_board(show, ROW, COL);
	//布置地雷
	set_mine(mine);
	//display_board(mine, row, col);
	//排查雷,find函数返回'D'游戏失败,返回'W'游戏胜利
	ret = find(show, mine, ROW, COL,COUNT);
	if (ret == 'W')
	{
		display_board(mine, ROW, COL);
		printf("恭喜你,所有地雷已被排出,游戏胜利\n");
	}
	else
	{
		display_board(mine, ROW, COL);
		printf("很遗憾,你被炸死了,游戏结束\n");
	}
}
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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗!伯!特!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值