如何用C语言快速实现初级版扫雷(步骤详细)(二)

简介: 当你自己完成后一定成就感幸福感满满的!

打印


考虑如何实现图表

什么时候该打印

什么时候不该打印

打印的间距

换行的考虑

打印布局的美观性

参考代码

//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
  int i = 0;//在外围打印标数以便于玩家定位坐标
  printf("-----------------------------------------\n");
  for (i = 0; i <= 9; i++)//0-9打印最上排数字
  {
    printf("| %d ", i);
  }
  printf("|\n");
  printf("-----------------------------------------\n");
  for (i = 1; i <= row; i++)
  {
    int j = 0;
    printf("| %d |", i);//1-9打印最左排数字
    for (j = 1; j <= col; j++)
    {
      printf(" %c |", board[i][j]);
    }
    printf("\n");//一定注意要换行
    printf("-----------------------------------------\n");//每打印一排内容,再打印一排横线,形成表格,提升美观
  }

效果图

20210730221459396.png

玩家排雷


考虑问题

1.因为实际雷区是11x11的,也就是说显示雷区的下标是从1开始的,符合玩家思维

2.排雷范围

3.第一次免雷

4.显示周围雷数

免雷

//第一次免雷
void FirstSafe(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y)
{
  int count = 0;
  if (mine[x][y] == '1')
  {
    mine[x][y] = '0';//替换
    while (1)
    {
      int rx = rand() % row + 1;
      int ry = rand() % col + 1;
      if (mine[rx][ry] == '0' && (rx != x) && (ry != y))
      {
        mine[rx][ry] = '1';//再次布雷
        break;
      }
    }
    count = GetMineCount(mine, x, y);
    show[x][y] = count + '0';
    ExtendNotMine(mine, show, x, y, '0', '*');
    DisplayShow(show, row, col);
  }
}

査雷

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
  int x = 0;
  int y = 0;
  int win = 0;
  while (1)
  {
    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);
      }
    }
    else
    {
      printf("坐标非法,重新输入\n");
    }
  }

周围雷数

int GetMineCount(char mine[ROWS][COLS], int x, int y)//获取周边一圈雷个数的信息
{
  int ret = 0;
  for (int i = x - 1; i <= x + 1; i++)
  {
    for (int j = y - 1; j <= y + 1; y++)//3X3范围
    {
      ret += mine[i][j];
    }
  }
  return ret - mine[x][y] - 8 * '0';//注:'1'-'0'=1(ASCII码值)
}//返回值代表雷的个数

雷区展开


考虑用递归实现

//扩展排雷,展开周围非雷区
void ExtendNotMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
  int n = 0;
  n = GetMineCount(mine, x, y);
  if (n == 0)
  {
    show[x][y] = ' ';//如果周围没有雷,将中心赋值为空格
    int i = 0;
    int j = 0;
    for (i = x - 1; i <= x + 1; i++)
    {
      for (j = y - 1; j <= y + 1; j++)
      {
        if (mine[i][j] =='0'&& show[i][j]=='*')//周围坐标满足自身不是雷且还是初始化字符,进入递归再次扩展排雷
        {
        {
          ExtendNotMine(mine, show, i, j, '0', '*');//递归排雷
        }
      }
    }
  }
  else
    show[x][y] = n + '0';//如果附近有雷,展示雷的个数
}

胜利判断


遍历雷区剩余的初始值个数进行判断

//求展示扫雷棋盘上含有初始化字符的个数,用来判断游戏何时终止
int AroundInitCount(char board[ROWS][COLS], int row, int col)
{
  int i = 0;
  int j = 0;
  int count = 0;
  for (i = 1; i <= row; i++)
  {
    for (j = 1; j <= col; j++)
    {
      if (board[i][j] == '0')
        count++;
    }
  }
  return count;
}
if (count == EASY_COUNT)
        {
          printf("恭喜你!扫雷成功!\n");
          DisplayShow(mine, ROW, COL);
          break;
        }

显示用时

void SpendTime(clock_t start)
{
  clock_t end = clock();
  clock_t total = end - start;
  printf("游戏所用时间为:%.1lf秒!\n", 1.0 * total / CLOCKS_PER_SEC);
}


相关文章
|
28天前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
72 0
|
2月前
|
存储 安全 算法
C 语言——实现扫雷小游戏
本文介绍了使用二维数组创建棋盘并实现扫雷游戏的方法。首先,通过初始化数组创建一个9x9的棋盘,并添加行列标识以便操作。接着,利用随机数在棋盘上布置雷。最后,通过判断玩家输入的坐标来实现扫雷功能,包括显示雷的数量和处理游戏胜利或失败的情况。文中提供了完整的代码实现。
42 1
C 语言——实现扫雷小游戏
|
1月前
|
存储 算法 安全
C语言实现扫雷游戏
C语言实现扫雷游戏
|
1月前
|
IDE Unix 开发工具
1.6使用C语言的7个步骤后续
在编程过程中,首先通过不同环境下的方法运行程序,如输入可执行文件名或点击图标。接着测试程序运行情况,查找并修正可能出现的错误,即调试。创建程序后还需根据需求进行维护与修改,如修正错误或添加新功能。整个流程非线性,需反复迭代。
67 8
|
1月前
|
编译器 C语言
1.6 使用C语言的7个步骤
在开发C程序时,首先要明确程序目标,即程序需要处理的信息、计算和输出;接着设计程序实现的方法,包括用户界面、程序结构等;随后用C语言编写程序代码;最后通过编译器将源代码转换为特定机器语言的可执行文件,同时链接C库中的标准函数,形成最终可运行的程序。此过程需根据具体编程环境调整相关设置和操作。
50 7
|
28天前
|
C语言
初学者指南:使用C语言实现简易版扫雷游戏
初学者指南:使用C语言实现简易版扫雷游戏
31 0
|
30天前
|
C语言
C语言扫雷游戏(详解)
C语言扫雷游戏(详解)
35 0
|
1月前
|
存储 编译器 C语言
【C语言篇】数组和函数的实践:扫雷游戏(附源码)
【C语言篇】数组和函数的实践:扫雷游戏(附源码)
34 0
|
28天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
31 3
|
18天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
32 10