C语言小项目之扫雷(进阶版)

news/2024/11/19 11:40:18/

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C语言学习分享⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵
带你学习更多C语言知识
  🔝🔝


在这里插入图片描述

扫雷小项目

  • 1. 前期准备
  • 2. 初始化棋盘
  • 3. 打印棋盘
  • 4. 布置地雷
  • 5. 当前位置周围的雷数
  • 6. 排查地雷(非展开)
  • 7. 利用递归使棋盘展开
  • 8. 总结以及代码分享


1. 前期准备

扫雷游戏其实就是一个N×N的棋盘
可以用二维数组来模仿这个环境

值得注意的是:

当当前位置不是雷时
我们需要计算以当前位置为中心
的九宫格中有多少个雷
然后将这个数字填入当前位置中
当这个位置为棋盘边缘时,数组会越界

结论:

  • N×N的棋盘应该定义为
  • (N+2)×(N+2)
  • 打印棋盘时应该打印N×N的数组

画图理解:
在这里插入图片描述
再将所有步骤细化成:

  • 初始化棋盘- InitBoard
  • 打印棋盘- PrintBoard
  • 布置地雷- SetMine
  • 排查地雷- FindMine
  • 求坐标周围有几个雷- GetMineCount
  • 周围都没有雷时的展开- unfold

2. 初始化棋盘

假设我们用9×9的棋盘玩游戏
地雷的数量一共是10个:

#define ROW 9 //打印9×9
#define COL 9
#define ROWS ROW+2 //内部实现用11×11
#define COLS COL+2
#define MCount 10  //定义一共有10个地雷

要打印的棋盘应该和
内部实现功能的棋盘分开
所以我们定义两个数组
将打印数组初始化为’*’
埋地雷的棋盘初始化为’0’

为什么要将埋地雷棋盘初始化为0?

因为在埋地雷的时候将’0’改为’1’
没有地雷的位置就是’0’
有地雷的位置就是’1’
当我们计算一个位置的九宫格
范围内有多少个雷时就可以
直接将九宫格里所有位置加起来
得出的值就是当前位置周围雷的个数

void InitBoard(char mine[ROWS][COLS], char show[ROW][COLS], int rows, int cols)
{for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){mine[i][j] = '0';show[i][j] = '*';}}
}

3. 打印棋盘

打印出来的是9×9的棋盘

在这里插入图片描述

并且在左边和上面给对应的坐标1~9

void PrintBoard(char a[ROWS][COLS], int rows, int cols)
{printf("最边上为行数与列数\n");int  i = 0;for (i = 0; i <= cols; i++){printf("%d-", i);}printf("\n");for (i = 1; i <= rows; i++){printf("%d ", i);int j = 0;for (j = 1; j <= cols; j++){printf("%c ", a[i][j]);}printf("\n");}
}

4. 布置地雷

需要随机生成一个坐标
然后将此坐标从’0’变成’1’

(注:随机选取的位置不能已经有雷了)

void SetMine(char mine[ROWS][COLS], int rows, int cols)
{int count = MCount;//define宏定义的雷的个数while (count > 0){int x = rand() % rows + 1;//生成1~9的随机横坐标int y = rand() % cols + 1;if (mine[x][y] == '0')//若当前位置已经有雷了,就不执行if语句,再重新生成一个随机位置{mine[x][y] = '1';count--;//当前位置不是雷才进入if语句,count才减少}}
}

解释在代码块中


5. 当前位置周围的雷数

正如上面解释的一样
将以当前位置为中心的九宫格
中其他八个位置的值相加就是
当前位置雷的个数!

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

因为初始化时给的是字符’0’
所以将全部值加起来后减去八个’0’
得到的才是整数


6. 排查地雷(非展开)

排查地雷需玩家输入需要排查的坐标
然后判断这个位置是不是字符’1’
如果是就被地雷炸死了
如果不是,就将周围雷的个数打印出来

(注:当棋盘上只剩下Mcout个位置时
也就是除了地雷外所有位置都被排查了
代表玩家胜利了!)

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{int x, y;int winC = 0;//当winC等于棋盘数减去雷数时,游戏胜利!while (winC < ROW * COL - MCount){printf("请输入要排查的坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= cols && y >= 1 && y <= rows){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!");PrintBoard(mine, rows, cols);break;}else if (mine[x][y] == '0'){winC++;mine[x][y] = GetMineCount(mine,x,y);PrintBoard(show, rows, cols);}}else{printf("坐标输入错误");}if (winC == rows * cols - MCount){printf("恭喜你,排雷成功\n");PrintBoard(mine, ROW, COL);}}
}

7. 利用递归使棋盘展开

电脑上的扫雷游戏有这样的功能:
当前位置不是地雷并且周围也没有雷时
它会将这一区域展开:

在这里插入图片描述

只有当打印棋盘的当前位置
是字符’*',并且横纵坐标没有越界时递归

void unfold(char mine[ROWS][COLS], char show[ROWS][COLS],int x, int y,int rows,int cols)
{if (GetMineCount(mine,x,y) == 0)//如果当前位置周围雷数为0{show[x][y]=' ';//像上面的图片一样将这个位置变成空格for (int i = x - 1; i < x + 1; i++)//递归左上,正上,右上,正左,正右...八个位置{for (int j = y - 1; j < y + 1; j++){if (show[i][j] == '*' && i > 0 && i <= rows && j > 0 && j <= cols){unfold(mine, show, i, j, rows, cols);//递归}}}}else{show[x][y] = GetMineCount(mine, x, y) + '0';}
}

在这里插入图片描述


8. 总结以及代码分享

完成一个规范的项目
少不了定义多个头文件和.c文件
要想你的工程变得规范,容易理解
应该将各个部分分开来实现

把所有代码的链接分享给大家:

gitee代码仓库


http://www.ppmy.cn/news/651062.html

相关文章

从零开始的力扣刷题记录-第七十二天

力扣每日四题 2206. 将数组划分成相等数对-简单1920. 基于排列构建数组-简单1253. 重构 2 行二进制矩阵-中等673. 最长递增子序列的个数-中等总结 2206. 将数组划分成相等数对-简单 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;它包含 2 * n 个整数。 你需要将 n…

LIS实验室信息管理系统功能模块(Oracle数据库、Client/Server架构)

一、系统框架简介 1、技术框架 &#xff08;1&#xff09;总体框架&#xff1a; ♦SaaS架构的Client/Server应用 ♦服务可伸缩&#xff0c;多服务协同 ♦服务可拆分&#xff0c;功能易扩展 &#xff08;2&#xff09;技术细节&#xff1a; ♦体系结构&#xff1a;Client/Serv…

为何及如何使用数据结构提升算法效率和问题解决能力?

数据结构是计算机科学中的一个重要概念&#xff0c;它是一种组织和存储数据的方式。数据结构提供了一种在计算机程序中有效地组织和操作数据的方法。 数据结构的主要目的是解决问题和优化算法。它们帮助我们在计算机内存中存储和组织数据&#xff0c;以便能够高效地访问和操作这…

计算机动漫设计与游戏制作课程,有关计算机动漫与游戏制作专业介绍

原标题&#xff1a;有关计算机动漫与游戏制作专业介绍 鉴于目前想要从事动漫与游戏制作专业的人很多&#xff0c;但是很多人都对这个专业没有太深的理解&#xff0c;在这里我就简单的对计算机动漫与游戏制作专业介绍一下。 对于计算机动漫与游戏制作这个专业&#xff0c;其实内…

计算机动漫设计VR主要学什么,动漫设计专业学什么 要学什么软件

动漫设计专业学什么 要学什么软件2019-05-28 14:00:23文/叶丹 动漫设计专业主要学影视动画设计制作、游戏角色进阶设计合成、广告特效动画设计、影视后期特技、卡通造型数字手绘、交互式3D场景游戏设计、影视剪辑输出与包装等。 动漫设计专业课程 基础素描、基础色彩、Maya、3D…

基于java的动漫网站设计

动漫网站的设计主要实现动漫信息查询模块。此系统采用MVC设计模式&#xff0c;系统主要包括动漫信息展示&#xff0c;按照类别管理动漫信息、在线播放下载等模块。此系统主要是为了迎合广大动漫爱好者了解动漫信息的需求&#xff0c;避免他们盲目在互联网上寻求动漫&#xff0c…

计算机动漫设计和游戏设计需要什么基础,学动漫游戏设计需要什么样的电脑配置?...

原标题&#xff1a;学动漫游戏设计需要什么样的电脑配置&#xff1f; 这几年动漫游戏产业的发展和扩张&#xff0c;不仅得到了大多数年轻人的最爱&#xff0c;很多已经成家立业的中年人也对此充满兴趣。其中的优秀作品不仅能够让大家在忙碌之余得到些许的轻松&#xff0c;同时也…

优漫动游:游戏ui设计包括什么?

游戏UI设计是游戏开发过程中非常重要的一部分&#xff0c;涉及到游戏中各种交互元素的设计。下面将介绍游戏UI设计包括哪些内容。 ​ 主菜单界面设计   主菜单是游戏的入口&#xff0c;主菜单界面设计需要具有视觉冲击力&#xff0c;吸引玩家的眼球&#xff0c;让玩家可以方…