扫雷小游戏

简介: 扫雷小游戏

扫雷小游戏


游戏思路

游戏编写

1.test.c 测试游戏逻辑
 2. game.c游戏代码实现
 3. game.h游戏代码声明


1. 游戏思路:

两个雷盘,其一用于布置雷(玩家不可见)


58fb5016487a3b9faddf1b6ed90645ca_440ab7a7034942bd95eb9c60e5fc5ce6.png


另一个用于扫雷,并计算所排查位置周围存在雷的数目


916e4712480d85f850fc9fe3f396e1dd_354db6d9d7a744749b9838ae0b4791e7.png


//存放布置雷的信息
  char mine[ROWS][COLS] = { 0 };


将10个雷随机存放在中间 99格子里

而之所以使用 1111的棋盘,是因为以此可便于每次扫雷之后计算周围8个格子里存在雷的数目


例如 排查第一行第八列时,若是使用99的棋盘,在计算周围八个格子里存在的雷时就会产生越界。而使用1111的棋盘可以巧妙解决这个问题


1665a33e80c498f578f609257053cf91_44be5a31e9474bfd9e61ac77345236fe.png


//存放排查雷的信息
  char show[ROWS][COLS] = { 0 };


在每次排查某个格子时,会自动把这个格子周围八个格子里存放雷的个数,以数字字符形式存放在这个格子里


例如。接这个上面的情景,在第一行第八列的格子里,此时存放的便是’2‘,其余情景于此相似。

531f0e04e965dcb68104b9e1169a9ad1_67c2d4aeb44e41e293f11eb6d000d3e7.png


2. 游戏编写


1.test.c

1.1 引头文件


#include"game.h"


1.2 主函数


#include"game.h"
int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));//设置随机数起点
  do
  {
  menu(); //打印菜单
  printf("请选择>");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
    game();
    break;
  case 0:
    printf("退出游戏\n");
    break;
  default:
    printf("选择错误,重新选择\n");
    break;
  }
  } while (input);
  return 0;
}


1.3 打印菜单


void menu()
{
  printf("********************************\n");
  printf("**********   1.play    *********\n");
  printf("**********   0.exit    *********\n");
  printf("********************************\n");
}


42b9ca9c62a4e716f85e9374ca00dd6b_808bf41f6a3547bfb55054c6075cea5d.png


1.4 游戏逻辑


void game()
{
  //设置雷的雷盘
  char Mineboard[ROWS][COLS] = { 0 };
  //排查雷的雷盘
  char Showboard[ROWS][COLS] = { 0 };
  //初始化雷盘
  //将初始化的内容也传递给函数Initboard
  //避免产生歧义
  //mine 在没有布置雷的位置 全为 ‘0’
  Initboard(Mineboard, ROW, COL, '0');
  //show 在没有排查雷的位置 全为  ‘*’
  Initboard(Showboard, ROW, COL, '*');
  //设置雷的位置
  //虽然棋盘大小为11*11,但只在中间9*9内设置雷的位置
  Setmine(Mineboard, ROW, COL);
  //打印排查雷的信息
  //第一次执行时并未进行扫雷,此时运行全为*
  Displayboard(Showboard, ROW, COL);
  //扫雷
  //这里将两个雷盘都传递给函数Findmine()
  //1.传递mine,是为了在其上面完成扫雷
  //2.传递show,是为了在扫雷之后,把这个坐标周围
  //存在雷的个数存放show中
  Findmine(Mineboard, Showboard, ROW, COL);
}


2.game.c

2.1 引头文件


#include"game.h"


2.2 初始化雷盘


//ch  在这里即代表’0‘,也代表’*‘
void Initboard(char board[ROWS][COLS], int row, int col, char ch)
{
  int i = 0;
  int j = 0;
  for (i = 0; i <= row; i++)
  {
  for (j = 0; j <= col; j++)
  {
    board[i][j] = ch;
  }
  }
}


2.3 打印雷盘


void Displayboard(char board[ROWS][COLS], int row, int col)
{
  printf("************扫雷游戏**********\n");
  int i = 0;
  int j = 0;
  //打印列数,起点为0
  for (j = 0; j <= col; j++)
  {
  printf("%d ", j);
  }
  printf("\n");
  for (i = 1; i <= row; i++)
  {
  //打印行数,起点为1
  printf("%d ", i);
  for (j = 1; j <= col; j++)
  {
    printf("%c ", board[i][j]);
  }
  printf("\n");
  }
  printf("************扫雷游戏**********\n");
}

b344657b0cb97b2302b48922a126ba77_5327fffaa0894527a0c1ae9301858404.png


2.4 设置雷的位置


void Setmine(char board[ROWS][COLS], int row, int col)
{
  //游戏中存在雷的总数为 mine_number
  int count = mine_number;
  while (count)
  {
  //行数范围 1-9
     //列数范围 1-9
  int x = rand() % row + 1;
  int y = rand() % col + 1;
  if (board[x][y] == '0')
  {
    board[x][y] = '1';
    //每完成一次雷的设置,count--,
    //直到count==0为止
    count--;
  }
  }
}


c6f37327405a8f475b4a0d427dac9870_1acef148ce0542b8a047942fdf7cf8dc.png


2.5 扫雷


int get_mine(char board[ROWS][COLS], int x, int y)
{
  return (board[x - 1][y - 1] + board[x - 1][y]
  + board[x - 1][y + 1] + board[x][y - 1]
  + board[x][y + 1] + board[x + 1][y - 1]
  + board[x + 1][y] + board[x + 1][y + 1]
  - 8 * '0');
}
void Findmine(char Mineboard[ROWS][COLS], char Showboard[ROWS][COLS], int row, int col)
{
  int x = 0;
  int y = 0;
  //找到不是雷的个数
  //当 win==row*col-mine_number 时,代表玩家胜利
  int win = 0;
  while (win<row* col - mine_number)
  {
  printf("输入需要排查的坐标>");
  scanf("%d%d", &x, &y);
  //判断坐标是否重复排查
  if (Showboard[x][y] != '*')
  {
    printf("坐标已被排查,不可重复操作\n");
  }
  else
  {
    //判断坐标是否合法
    if (x >= 1 && x <= row && y >= 1 && y <= col)
    {
    //判断是否踩雷
    //如果是雷
    if (Mineboard[x][y] == '1')
    {
      printf("很遗憾,游戏结束\n");
      //打印设置雷的最终结果
      Displayboard(Mineboard, ROW, COL);
      break;
    }
    //如果不是雷
    //计算board[x][y]周围雷的个数
    else
    {
      win++;
      int number = get_mine(Mineboard, x, y);
      //转换成数字字符
      Showboard[x][y] = number + '0';
      //打印排查雷的结果
      Displayboard(Showboard, row, col);
    }
    }
    else
    {
    printf("坐标非法,请重新输入\n");
    }
  }
  }
  if (win == row * col - mine_number)
  {
  printf("恭喜扫雷成功!\n");
  }
}


8dfb485cfafdac5dbd0393308eb43a1a_d2247d5bce184d95ae4c319d37c93084.png


如何计算某个格子周围存在雷的数目?


例如某格子,坐标为[x][y]

因为在mine()中,雷存在的位置存放的是字符’1‘,否则存放的则为字符’0‘

若是使用if语句一个个去判断太过繁琐


换个角度,将周围八个坐标里的字符全部加在一起,然后减去8*’0‘,
得到的数值便是,周围雷的个数。最后再加上’0‘转换成数字字符存放到show中


1c2fbe9ef0314b9c195605054b6af4b4_8c82d57049ce47e2a1f63ab27e1ee6fc.png


3.game.h

函数声明


#include<stdio.h>
//使用srand(),rand()函数需引用头文件
#include<stdlib.h>
//使用time()函数需引用头文件
#include<time.h>
//define定义的常量,可通改变ROW,COL的数值来控制雷盘的大小
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
//定义雷的数目
#define mine_number 10
//初始化雷盘
void Initboard(char board[ROWS][COLS], int row, int col, char ch);
//打印雷盘
void Displayboard(char board[ROWS][COLS],int row,int col);
//设置雷盘
void Setmine(char board[ROWS][COLS], int row, int col);
//扫雷
void Findmine(char Mineboard[ROWS][COLS], char Showboard[ROWS][COLS], int row, int col);

目录
相关文章
leetcode-301:删除无效的括号
leetcode-301:删除无效的括号
109 0
|
UED
「Mac畅玩鸿蒙与硬件17」鸿蒙UI组件篇7 - Animation组件基础
在应用开发中,动画效果可以增强用户体验。鸿蒙框架提供了 translate、scale 和 rotate 等动画功能,允许对组件进行平移、缩放和旋转等操作。本篇将介绍 Animation 组件的基础知识和示例代码。
633 10
「Mac畅玩鸿蒙与硬件17」鸿蒙UI组件篇7 - Animation组件基础
MAC地址
MAC帧地址是Media Access Control Address的缩写,也称为物理地址或硬件地址。它是一个用于在局域网中唯一标识网络适配器(如网卡)的48位二进制数。每个网络适配器都有一个唯一的MAC地址,它由厂商在生产时烧录到适配器中。MAC帧地址用于在局域网中寻找目标设备,它是数据链路层的一部分,用于将数据包从源设备传输到目标设备。在以太网中,MAC地址是数据包在局域网中传输所必需的信息。 MAC地址
|
开发框架 数据可视化 C#
C# | 上位机开发新手指南(三)框架
在上位机开发中,Windows Forms是使用最广泛的C#框架之一。Windows Forms是.NET Framework中的一个GUI框架,提供了丰富的GUI控件和易于使用的编程模型,可以快速开发Windows桌面应用程序。Windows Forms已经存在多年,并且在.NET Framework中得到广泛的支持和优化,因此在上位机开发中得到了广泛应用。除此之外,随着.NET Core的不断发展,越来越多的开发人员开始使用跨平台的C#框架进行上位机开发,例如使用Electron或Avalonia等框架开发基于Web技术的桌面应用程序。
796 0
C# | 上位机开发新手指南(三)框架
|
缓存 Oracle 关系型数据库
[oracle]序列
[oracle]序列
103 1
|
Java 测试技术 数据安全/隐私保护
基于ssm+vue.js+uniapp小程序的“涛宝”大学生二手物品交易商城附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的“涛宝”大学生二手物品交易商城附带文章和源代码部署视频讲解等
118 0
基于ssm+vue.js+uniapp小程序的“涛宝”大学生二手物品交易商城附带文章和源代码部署视频讲解等
|
PHP 计算机视觉
php结合imagick 修改图片的DPI,达到与ps类似的效果
php结合imagick 修改图片的DPI,达到与ps类似的效果
503 1
|
机器学习/深度学习 算法 安全
【Python 百练成钢】时间调整、二进制数、回文素数、字母距离、CTF、Huffuman树、抽奖、前后缀最值、纯质数求解、花园灌溉
【Python 百练成钢】时间调整、二进制数、回文素数、字母距离、CTF、Huffuman树、抽奖、前后缀最值、纯质数求解、花园灌溉
【Python 百练成钢】时间调整、二进制数、回文素数、字母距离、CTF、Huffuman树、抽奖、前后缀最值、纯质数求解、花园灌溉
|
存储
LeetCode 16.最接近的三数之和
LeetCode 16.最接近的三数之和
127 0