【C语言】函数递归实现——扫雷小游戏(详细步骤)(二)

简介: 【C语言】函数递归实现——扫雷小游戏(详细步骤)

2.2.布置地雷模块

void SetMine()函数

布置地雷需要一个埋雷函数

void SetMine(char board[ROWS][COLS], int row, int col)

这里需要用到时间戳,要在main()函数加上


srand((unsigned int)time(NULL));

从而在埋雷函数里就可以使用rand()函数生成随机坐标来进行地雷的设置

将地雷位置设置成字符1,方便后续排雷时使用


void SetMine(char board[ROWS][COLS], int row, int col)
{
  int count = EASY_COUNT;
  while (count)//一共设置了10个雷,没设置一颗雷,count就减一
  {
  //生成随机下标,这里利用时间戳和rand()函数
  int x = rand() % row + 1;
  int y = rand() % col + 1;
  if (board[x][y] == '0')
  {
    board[x][y] = '1';
    count--;
  }
  }
}


2.3.玩家排雷模块

void FindMine()函数

排雷函数FindMine()里包含计数函数int GetMineCount()和特殊展开函数Clear()


void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
 {
  int x = 0;
  int y = 0;
  int win = 0;
  while (win < row * col - EASY_COUNT)//一共10颗雷,只要排过的点<所有格子减去10个雷,就继续
  {
   printf("请输入要排查的坐标:>");
   scanf_s("%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
    {
     Clear(mine, show, x, y, ROW, COL, &win);
     DisplayBoard(show, ROW, COL);
     printf("已排除位置数= %d\n", win);
    }
   }
   else
   {
    printf("坐标非法,重新输入\n");
   }
  }
  if (win == row * col - EASY_COUNT)
  {
   printf("恭喜你,排雷成功\n");
   DisplayBoard(mine, ROW, COL);
  }
 }


2.3.1对排查点进行分类判断

2.3.1.1对排查点周围的雷进行计数

int GetMineCount()函数

这里设置一个计数函数:

因为雷是‘1’,所以将排查点周围的点相加

因为‘1’-‘0’=1,Ascii码

所以周围八个字符相加减去8*‘0’等于几

说明有几颗雷在旁边


int GetMineCount(char mine[ROWS][COLS], int x, int y)//因为雷是‘1’,所以将排查点周围的点相加
                                                   //因为‘1’-‘0’=1,Ascii码
                                                   //所以周围八个字符相加减去8*‘0’等于几
               //说明有几颗雷在旁边
 {
  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');
 }


2.3.1.2如果排查点周围都没有雷

void Clear()函数

这属于特殊情况,可以对此点采用函数递归展开大片区域

用到这个递归展开函数:

6881d50d14454641b5b0526b644cfdd7.png


设置一个win变量,当win=9×9 - 10的时候,游戏就胜利了

排查非雷点有两种情况:

①每发现一个周围没有雷的点,就将其设置成空格,同时给win++

②每发现一个周围有雷的点,就调用计数函数,将结果返回给这个点,同时win++

注意,由于是递归的方式来排查点,一定不要重复对排过的点进行win++


void Clear(char mine[ROWS][COLS], char show[ROWS][COLS] , int x , int y , int row , int col, int*win)
 {
  if (x >= 1 && x <= row && y >= 1 && y <= col)
  {
   if (show[x][y] == ' ' || show[x][y]!='*')//排除已经检查过的点
    return;
   else if (GetMineCount(mine, x, y) != 0)
   {
    show[x][y] = GetMineCount(mine, x, y) + '0';
    (*win)++;
    return;
   }
   else
   {
    show[x][y] = ' ';
    (*win)++;
    Clear(mine, show, x - 1, y, ROW, COL, win);
    Clear(mine, show, x + 1, y, ROW, COL, win);
    Clear(mine, show, x, y - 1, ROW, COL, win);
    Clear(mine, show, x, y + 1, ROW, COL, win);
   }
  }return;
 }

a5b3ff4756fe421e8e48e778b75cd8a4.png



2.4.判断游戏输赢

在void FindMine种设置有一个变量win,将win通过指针传址的方式与void Clear建立联系,用来统计排查点的数目,当win=9×9-10时

即打印游戏胜利


if (win == row * col - EASY_COUNT)
  {
   printf("恭喜你,排雷成功\n");
   DisplayBoard(mine, ROW, COL);
  }

843da813c9344cf6ae124089389a2820.png


相关文章
|
1天前
|
C语言
每天一道C语言编程(递归:斐波那契数,母牛的故事)
每天一道C语言编程(递归:斐波那契数,母牛的故事)
5 0
|
1天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
15 2
|
1天前
|
C语言
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
11 0
|
1天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
1天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
1天前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
|
1天前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
|
1天前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
5 0
|
1天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)

热门文章

最新文章