扫雷小游戏 万字全网最详细(可展开一片空白)上

简介: 扫雷小游戏 万字全网最详细(可展开一片空白)

扫雷对初学者来说是一个比较困难的小程序,今天的文章就教大家如何独立做出自己的扫雷游戏,如果您认为我写的不错,请给小陈点赞,收藏加关注,话不多说,让我们开始!


5d5ed90a2440bd6f7c668807c304fce9_568ea133c9514ecbb5fda35bee8473c3.jpeg


1.游戏的整体思路

一个较为复杂的小程序一般有着不同的文件来负责不同的功能。我们只需要运用几个算法模块来实现,会分成game.h,test.c,game.c等几个模块来运行,为了方便可以创建多个项目来实现。我们这里需要新建三个文件。


1. test.c 负责游戏整体流程的实现


2. game.c 负责游戏内部复杂函数的实现


3. game.h 负责包含所有函数所需的头文件


4ddbb2c63a35254027ecfa75b15f1709_34053f05e450475b9933ad422fac52cc.png


需要注意的是,game.c和test.c文件创建时选择c++文件,而game.h选择头文件


2.游戏菜单的创建


首先是游戏菜单的创建


int main()
{
  int input;
  do
  {   
  scanf("%d", &input);
  switch (input)//用1来表示开始游戏,用0来表示退出游戏
//这样做的好处是,当输入为0时,input的值判断为假,则直接跳出循环
  {
  case 1:
      game();
    break;
  case 0:printf("游戏结束\n");
    break;
  default:printf("输入错误,请重新输入\n");
    break;
  }
  } while (input);
  return 0;
}


只是这样太过单调,我们加入可视化的菜单,为此我们单独创建menu函数


void menu()
{
  printf("**************************\n");
  printf("********  1 play  ********\n");
  printf("********  0 exit  ********\n");
  printf("**************************\n");
}
int main()
{
  int input;
  do
  {   menu();
  scanf("%d", &input);
  switch (input)
  {
  case 1:
      game();
    break;
  case 0:printf("游戏结束\n");
    break;
  default:printf("输入错误,请重新输入\n");
    break;
  }
  } while (input);
  return 0;
}


3.棋盘的初始化


想要做出扫雷,首先要做出扫雷的底盘,它应该有以下的两个功能。


1.读取输入的排雷位置,并判断该位置有没有雷


2.在读取位置之后,在没爆炸的情况下显示出周围8个格子雷的个数


为了打印出棋盘,和三子棋类似,我们可以使用喜闻乐见的二维数组,如果我们想要实现9x9的扫雷游戏,难道我们要创建9x9的二维数组吗?答案是否定的,至于原因:


程序需要判断周围8个格子所含雷的个数,假如选择9X9的二维数组,在输入边缘位置时就会有数组越界的现象。那我们就要在9X9的边界多上一圈元素,也就要定义11X11的数组元素,


多出来的部分需要打印吗?答案是否定的,我们自己心里知道有这部分就行。


在game.h文件中定义行和列 ,在test.c中完成对数组的定义。


#define COLS 11
#define ROWS 11
#define EASY_COUNT 10//下面会讲
char mine[COLS][ROWS], show[COLS][ROWS];

在show数组中,用字符‘0’表示无雷区域,用字符‘1’表示有雷区域


在mine数组中,用’✳‘来覆盖然后来排雷,之后用数字来取代,数字代表其周围的雷的个数


3.1函数部分


我们使用InitBoard函数来打印出棋盘。

    void InitBoard(char a[COLS][ROWS], int col, int row, char set);
    InitBoard(mine, COLS, ROWS, '*');
  InitBoard(show, COLS, ROWS, '0');
void InitBoard(char a[COLS][ROWS], int col, int row, char set)
{
  int i, j;
  for (i = 0;i <=col;i++)
  {
    for (j = 0;j <=row;j++)
    {
      a[i][j] = set;
    }
  }
}

为了同时照顾到两个数组,我们定义出set,为两个数组分配不同的符号。


3.2棋盘的打印


我们定义出DisplayBoard函数来完成棋盘的打印,并贴心地打印出行号和列号


void DisplayBoard(char a[COLS][ROWS], int col, int row)
{
  int i, j;
  printf("********扫雷*******\n");
  for (i = 0;i < 10;i++)
  {
  printf("%d ", i);//行号
  }printf("\n");
  for (i = 1;i < 10;i++)
  {
  printf("%d ", i);//列号
  for (j = 1;j < 10;j++)
  {
    printf("%c ", a[i][j]);
  }
  printf("\n");
  }
}


64775c3859120eb6da169b97ac28bf8a_e025ffdfddc24d02bf6a20155f5c9730.png


打印出来的效果就是这样。


4.下棋功能的实现


打印出棋盘之后,接下来就轮到下棋的功能了。


为了实现其中的rand()函数,我们需要引用时间戳,在test.c文件中引用时间戳。


int main()
{
  int input;
  srand((unsigned int)time(NULL));//时间戳
  do
  {   menu();
  scanf("%d", &input);
  switch (input)
  {
  case 1:
      game();
    break;
  case 0:printf("游戏结束\n");
    break;
  default:printf("输入错误,请重新输入\n");
    break;
  }
  } while (input);
  return 0;
}


并在game.h中包含所需头文件


#include<stdlib.h>
#include<time.h>

接着是玩家下棋的部分。


void BreakBoard(char mine[COLS][ROWS],char show[COLS][ROWS], int col, int row)
{
  int x, y, set, k = 0;
  do
  {
  scanf("%d%d", &x, &y);
  if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
  {
    if (show[x][y] == '1')
    {
    DisplayBoard(show, COLS, ROWS);//打印棋盘让人死的明白
    printf("很遗憾,你被炸死\n");
    break;
    }
    else
    {
    open(mine, show, x, y);
    DisplayBoard(mine, COLS, ROWS);
    printf("未发现危险\n");
    k++;
    }
  }
  else
  {
    printf("重新输入\n");
  }
if (k == 71)
  {
  printf("恭喜你,扫雷成功!\n");
  break;
  }
  } while (k<=71);
}


假设一共有10个雷,我们总共循环71=81-10次,当我们已经循环了71次后,就代表我们已经将所有非雷区域全部排除了,我们在前面定义了一个k如果我们排对了就++,当达到了71次就代表我们已经将所有非雷区域全部排除了,紧接着打印扫雷成功。


相关文章
|
4月前
|
移动开发 JavaScript 前端开发
【绝技揭秘】从零到英雄:解锁UniApp H5项目中的二维码生成与扫描秘籍,让你的应用瞬间变身扫码达人!
【8月更文挑战第20天】二维码在移动应用中无处不在。本文详述了在UniApp H5项目中实现二维码生成与扫描的方法。通过对比插件`uni-app-qrcode`和JavaScript库`qrcode-generator`生成二维码的方式,以及使用插件`@juggle/resize-observer`和HTML5的MediaDevices API进行扫描的技术方案,帮助开发者挑选最佳实践。无论是插件的便捷性还是原生JavaScript的灵活性,都能满足不同项目需求。
141 0
扫雷小游戏 万字全网最详细(可展开一片空白)下
扫雷小游戏 万字全网最详细(可展开一片空白)
72 0
|
7月前
|
图形学
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
307 0
|
7月前
|
算法
连连看游戏系列教程开篇
连连看游戏系列教程开篇
106 0
|
C语言
无敌!我用【C语言】手搓出了一个体系完整的【员工管理系统】还能玩游戏听音乐?(超详细,附完整源码)
前言:员工管理系统是一款面向公司管理员的管理工具,旨在提供员工信息管理、薪资管理、员工绩效评估、员工福利管理和智能推荐等功能,帮助公司管理员更好地管理员工信息和提高员工工作效率。 这是总体设计大概模型图:
146 0
|
存储 Java API
一个精美的主界面窗口功能的设计和实现原来如此简单,万字肝爆
一个精美的主界面窗口功能的设计和实现原来如此简单,万字肝爆
123 0
微信小游戏开发系列教程1-做个小游戏并不难,你也可以的
这是小蚂蚁的人人都能做游戏的系列教程的开篇,做个小游戏没有那么难,你也可以的。 我做了一个精致而温暖的小游戏,欢迎点击试玩。
146 0
|
前端开发 容器
#yyds干货盘点# 前端歌谣的刷题之路-第一百四十四题-双列布局-定位
#yyds干货盘点# 前端歌谣的刷题之路-第一百四十四题-双列布局-定位
104 0
#yyds干货盘点# 前端歌谣的刷题之路-第一百四十四题-双列布局-定位
|
前端开发 JavaScript
#yyds干货盘点# 前端歌谣的刷题之路-第八十五题-列表动态渲染
#yyds干货盘点# 前端歌谣的刷题之路-第八十五题-列表动态渲染
111 0
#yyds干货盘点# 前端歌谣的刷题之路-第八十五题-列表动态渲染
|
前端开发
#yyds干货盘点# 前端歌谣的刷题之路-第十九题-固定定位
#yyds干货盘点# 前端歌谣的刷题之路-第十九题-固定定位
194 0
#yyds干货盘点# 前端歌谣的刷题之路-第十九题-固定定位
下一篇
DataWorks