前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简易版扫雷游戏

简易版扫雷游戏

作者头像
用户11036582
发布2024-03-21 18:17:35
550
发布2024-03-21 18:17:35
举报

前言

扫雷是一款益智类游戏,游戏规则如下:

  1. 在一个方块矩阵中随机布置一定量的炸弹(初级为10个,中级为40个,高级为99个炸弹)。
  2. 玩家逐个翻开方块,以找出所有炸弹为目的。
  3. 如果玩家翻开的方块是炸弹,则游戏结束,失败。
  4. 如果玩家翻开的方块不是炸弹,则会显示这个方块周围一圈的雷的个数。
  5. 如果周围没有雷,则会自动翻开周围的方块,直到周围有雷为止。
  6. 玩家可以标记自己认为是炸弹的方块,以便在后续游戏中避免误触。

为了解决“1”到底是该格子周围雷的个数还是雷的问题,我们需要建立两个二维数组,一个用来存储雷的位置,另一个用于展示给玩家看的棋盘,存放的是排查雷的信息。展示给玩家看的数组为了保持神秘感,最开始放的全是✳,这时我们创建的数组就是字符数组。


提示:以下是本篇文章正文内容,下面案例可供参考

一:编程方式:

传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路。传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路。

模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等。模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "game.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等

当你代码比较多的时候,就可以采用模块化编程来完成这个程序

扫雷游戏可以算是一个代码较多的程序,所以在此我们将会运用到第二种编程方式,模块化编程。

二:实现游戏的大致过程

2.1游戏界面初始化

首先我们应该赋予这个游戏一个初始化界面

如图,这是我们这个游戏的初始化界面,

2.2二维数组的运用

要构建这样这个画面,我们要运用到二维数组。

如图,我们构建一个这样的二维数组及游戏界面。

代码语言:javascript
复制
void menu() {
	printf("**************************\n");
	printf("********  1.play  ********\n");
	printf("********  0.exit  ********\n");
	printf("**************************\n");
}

这串代码可以得到一个游戏界面,由于过于简单,在此不做过多介绍。

同时,我们在头文件中写这样一些代码,来定义二维数组的大小,我们这里构建了一个9*9的表格,但是由于如果雷出现在最后,他下一行没有任何内容,就会出现混淆和打印上的困难。

所以我们这样来这样创建这个二维数组

这样就可以避免那种情况。

2.3文件结构的设计

由于扫雷游戏的实现比较复杂且代码数量较多,所以我们在此使用多文件形式:

1.test.c //文件中写游戏的测试逻辑

2.game.c // ⽂件中写游戏中函数的实现等

3.game.h //文件中写游戏需要的数据类型和函数声明等

三.扫雷游戏中代码的实现

3.1game.h
代码语言:javascript
复制
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 9
#define COL 9

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

#define EASY_COUNT 10

//声明函数
void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set);

//打印函数
void DisplayBoard(char arr[ROWS][COLS], int rwo, int col);


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


//排查雷
void FindMine(char arr[ROWS][COLS], char[ROWS][COLS],int row,int col);
3.2game.c
代码语言:javascript
复制
#include"game.h"
void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set) {
	int i = 0;
	for (i = 0; i <= ROWS; i++) {
		int j = 0;
		for (j = 0; j <= COLS; j++) {
			arr[i][j] = set;
		}
	}
 }
void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("-----扫雷游戏-----\n");
	for (i = 0; i <= col; i++) {
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++) {
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}


 void SetMine(char arr[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	while (count) {
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (arr[x][y] == '0') {
			arr[x][y] = '1';
			count--;
		}
	}
}

static int GetMineCount(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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0, 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 (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");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);

	}
}
3.3test.c
代码语言:javascript
复制
#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,'*');
	
	//布置雷,
	 SetMine(mine,ROW,COL);
	 DisplayBoard(mine,ROW,COL);


    //打印棋盘
   DisplayBoard(show, ROW, COL);
	
   //排查雷
	FindMine(mine,show,ROW,COL);

}



void test() {
	int input = 0;
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束。");
			break;
		default:
			printf("选择有误,请重新选择。");
			break;
		}
	} while (input);
}

int main()
{
	
	test();
	return 0;
}

四.扫雷游戏的拓展

1• 是否可以选择游戏难度

2◦ 简单 9*9 棋盘,10个雷

3◦ 中等 16*16棋盘,40个雷

4◦ 困难 30*16棋盘,99个雷

5• 如果排查位置不是雷,周围也没有雷,可以展开周围的⼀⽚

6• 是否可以标记雷

7• 是否可以加上排雷的时间显⽰

在线扫雷游戏: http://www.minesweeper.cn/

这是一个线上扫雷游戏的链接,大家可以玩一下,然后得到一些启示,进而去重构自己的代码。


总结

本次我们对简易版扫雷游戏进行了一个大致的讲解,希望对各位正在学习扫雷的友友们发挥到一些启示作用,另外,我们应在此还要理解创建多文件的好处与作用,学会创建多文件,慢慢的善于运用多文件,因为在以后多文件的运用肯定会变多,提前去适应他,我们也可以让以后的学习变得更加简单。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一:编程方式:
  • 二:实现游戏的大致过程
  • 三.扫雷游戏中代码的实现
    • 3.1game.h
      • 3.2game.c
        • 3.3test.c
        • 四.扫雷游戏的拓展
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档