C语言实现扫雷小游戏(扩展版可选择游戏难度)分享!

游戏简介

扫雷,是一款益智类小游戏。
游戏目标是找出所有没有地雷的方格,完成游戏;要是按了有地雷的方格,游戏失败;玩家可标记雷的位置。游戏以完成时间来评高低。有不同的游戏难度可选择。

实现的功能介绍

1.计时
2.初始化雷盘
3.打印雷盘
4.随机设置雷的分布,可选择游戏难易程度
5.统计坐标位置周围的雷数
6.第一次排雷不会被炸死
7.扩展式排雷,展开周围的非雷区
8.给所选坐标位置做标记,或取消标记

该程序分为三个文件:

1.game.h :包含头文件的引用、函数的声明和宏定义
2.game.c :包含游戏各功能函数的具体实现
3.pro.c :各功能函数的调用(程序的流程)
PS:文章末尾附完整代码 及 游戏效果图

C语言实现扫雷小游戏(扩展版可选择游戏难度) 

因为排雷时要计算每个位置周围八个位置的雷数,所以在创建数组时要多一圈,即行列都要加2。给用户显示的数组不需要加。

C语言实现扫雷小游戏(扩展版可选择游戏难度)

游戏功能代码详解

1.计时

运用clock函数,该函数需要的头文件为 “time.h”
函数原型:clock_t clock(void);
功能:程序从启动到函数调用占用CPU的时间
这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间;若挂钟时间不可取,则返回-1。其中clock_t是用来保存时间的数据类型。

  void set_time()//计时  {    printf("用时:%u 秒n", clock() / CLOCKS_PER_SEC);  }

2.初始化雷盘
这里我用到的是memset函数,需要的头文件为“memory.h”或“string.h”
函数原型:void *memset(void *s, int ch, size_t n);
功能:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。在一段内存块中填充某个给定的值。

  void init_board(char board[ROWS][COLS], int row, int col, char c)//初始化雷盘  {    memset(board, c, row*col*sizeof(board[0][0]));  }

3.打印雷盘
运用两个循环体实现雷盘数组的赋值、行号、列号的打印。正式游戏时可以加上system(“CLS”); 清屏语句,每次调用时都清屏一次,使游戏画面更简洁清晰。
我们把计时函数放在里面,每次打印雷盘时就可以显示所用的时间。

  void disp_board(char board[ROWS][COLS], int row, int col)//打印雷盘  {    int i = 0;    int j = 0;    //system("CLS");//清屏    for (i = 0; i <= row; i++)    {      printf("%2d ", i);//打印行号    }    printf("n");    for (i = 1; i <= row; i++)    {      printf("%2d ", i);//打印列号      for (j = 1; j <= col; j++)      {        printf("%2c ", board[i][j]);      }      printf("n");    }    printf("n");    set_time();//打印所用的时间  }

4.随机设置雷的分布,可选择游戏难易程度
放置雷必须是随机的,这里用到了rand函数,它和srand函数配合使用产生随机数。srand(time(NULL))放在主函数中调用一次,通过系统时间提供的种子值,使rand函数生成不同的伪随机数序列。

  void set_mine(char board[ROWS][COLS], int row, int col,int count)//置雷  {    int x = 0;    int y = 0;     while (count)    {      x = rand() % row + 1;//随机位置范围1~row      y = rand() % col + 1;//随机位置范围1~col      if (board[x][y] == '0')//判断是否已有雷      {        board[x][y] = '1';//有雷的位置赋为1        count--;      }    }  }

5.统计坐标位置周围的雷数 及 未扫的位置的个数
当扫到一个没有雷的位置时,会显示这个位置周围一圈八个位置的含雷的总数,所以我们要写一个“数雷”函数来数。

  int count_mine(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';//数周围一圈八个位置的雷数  }    int count_print(char print[ROWS][COLS], int row, int col)//数未扫位置  {    int count = 0;    int i = 0;    for (i = 1; i <= row; i++)    {      int j = 0;      for (j = 1; j <= col; j++)      {        if (print[i][j] == '@' ||print[i][j] == '*')        {          count++;        }      }    }    return count;  }

6.第一次排雷不会被炸死
为了增加游戏的可玩性,加入“第一次排雷不被炸死”这个函数。当第一次排就遇到雷时,我们把雷偷偷挪走,随机放在一个原本无雷的位置。

  void safe_mine(char mine[ROWS][COLS],char print[ROWS][COLS],int x,int y,int row,int col)//第一次排雷不炸死  {    char ch = 0;    int ret = 1;    int number = 0;    if (mine[x][y] == '1')//第一次踩到雷后补救    {      mine[x][y] = '0';      char ch = count_mine(mine, x, y);      print[x][y] = ch + '0';//数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII值      extend_board(mine, print, x, y);      while (ret)//在其余有空的地方设置一个雷      {        int x = rand() % row + 1;//产生1到row的随机数,在数组下标为1到10的范围内布雷        int y = rand() % col + 1;//产生1到col的随机数,在数组下标为1到10的范围内布雷        if (mine[x][y] == '0')//找不是雷的地方布雷        {          mine[x][y] = '1';          disp_board(print, row, col);          //disp_board(mine, row, col);          ret--;          break;        }      }    }  }

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/483271.html

(0)
上一篇 2020年11月9日
下一篇 2020年11月9日

精彩推荐