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

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

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


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


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


🌹关注我🫵

带你学习更多C语言知识

  🔝🔝


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代码仓库


相关文章
|
2月前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
106 0
|
4月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
44 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
27天前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
32 1
|
3月前
|
存储 安全 算法
C 语言——实现扫雷小游戏
本文介绍了使用二维数组创建棋盘并实现扫雷游戏的方法。首先,通过初始化数组创建一个9x9的棋盘,并添加行列标识以便操作。接着,利用随机数在棋盘上布置雷。最后,通过判断玩家输入的坐标来实现扫雷功能,包括显示雷的数量和处理游戏胜利或失败的情况。文中提供了完整的代码实现。
51 1
C 语言——实现扫雷小游戏
|
2月前
|
存储 算法 安全
C语言实现扫雷游戏
C语言实现扫雷游戏
|
2月前
|
C语言
初学者指南:使用C语言实现简易版扫雷游戏
初学者指南:使用C语言实现简易版扫雷游戏
39 0
|
2月前
|
C语言
C语言扫雷游戏(详解)
C语言扫雷游戏(详解)
42 0
|
2月前
|
存储 编译器 C语言
【C语言篇】数组和函数的实践:扫雷游戏(附源码)
【C语言篇】数组和函数的实践:扫雷游戏(附源码)
39 0
|
4月前
|
C语言
扫雷(C语言)
扫雷(C语言)
45 4
|
5月前
|
存储 编译器 C语言