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

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

其中的open函数在下面讲解。


5.设计随机雷


我们设置雷的个数为10个。


其EASY_COUNT,在上面的宏定义部分有讲到,意思是我们选择了简单模式。


我们使用使用srand和rand函数生成随机数,使得雷的分布为随机位置。


void SetMine(char a[COLS][ROWS], int col, int row)
{
  int set = EASY_COUNT;
  do
  {
  int x = rand() % col + 1;
  int y = rand() % row + 1;//产生1~9的数字
  a[x][y] = '1';
  set--;
  } while (set != 0);
}

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


至于rand函数,我在 “ 三子棋 ” 和 “ 猜数字 ”的博客中都有提到,大家可以去看看,支持一下,蟹蟹大家!!


6.统计周围雷的个数


int FindMine(char a[COLS][ROWS], int x, int y)
{
  return (a[x - 1][y - 1] + a[x - 1][y] + a[x - 1][y + 1] + a[x][y - 1] + a[x][y + 1] + a[x + 1][y - 1] + a[x + 1][y] + a[x + 1][y + 1] - 8 * '0');
}

show数组是字符类型的数组,我们将周围8格的数字加起来再减去8个字符零,就能得到雷数目。


通过它统计已选位置周围八个位置中含有雷的个数,并在该位置上数字的形式打印出来。


7.当周围无雷时展开空白


倘若我们只能一个一个格子来点,那会使游戏非常复杂,为此,当一个格子周围没有雷时,我们需要让它展开一片空白。我们将用递归来实现这样的操作。


void open(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
  if (x >= 1 && x <= ROWS-2 && y >= 1 && y <= COLS-2)
  {
  int count = FindMine(show, x, y);
  if (count != 0) 
  {
    mine[x][y] = count + '0';//如果该格子周围雷的个数不为0,我们就把该格子周围雷的个数传到玩家玩的show棋盘对应的格子中,而如果是0,我们传入空格‘ ’ 
  }
  else if (mine[x][y] != ' ')
  {
    mine[x][y] = ' ';
    int i = 0;
    for (i = x - 1; i <= x + 1; i++)
    {
    int j = 0;
    for (j = y - 1; j <= y + 1; j++)
    {
      open(mine, show, i, j);//不停调用函数,直到周围有雷为止
    }
    }
  }
  else
    {
      return;
    }
  }
}

接下来让我们快乐地来上一局!


61d93508b42dd6569454e6e4a2bc641f_0e3328ea40094528a9204b827198136d.png


31af3c2826ecf9066b237a3215b1bf30_efe8c90381c84e4ca4ef977ea9a9be53.png

接下来就愉快地被炸死了,过程太惨,就不发了。


最后,总结一下各部分文件。


game.h


#pragma once
#define COLS 11
#define ROWS 11
#define EASY_COUNT 10
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void InitBoard(char a[COLS][ROWS], int col, int row, char set);
void DisplayBoard(char a[COLS][ROWS], int col,int row);
void SetMine(char a[COLS][ROWS], int col, int row);
void BreakBoard(char mine[COLS][ROWS],char show[COLS][ROWS], int col, int row);
int FindMine(char a[COLS][ROWS], int col, int row);
void menu();
void open(char mine[COLS][ROWS],char show[COLS][ROWS], int col, int row);


game.c


#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
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;
  }
  }
}
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");
  }
}
void SetMine(char a[COLS][ROWS], int col, int row)
{
  int set = EASY_COUNT;
  do
  {
  int x = rand() % col + 1;
  int y = rand() % row + 1;
  a[x][y] = '1';
  set--;
  } while (set != 0);
}
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);
}
int FindMine(char a[COLS][ROWS], int x, int y)
{
  return (a[x - 1][y - 1] + a[x - 1][y] + a[x - 1][y + 1] + a[x][y - 1] + a[x][y + 1] + a[x + 1][y - 1] + a[x + 1][y] + a[x + 1][y + 1] - 8 * '0');
}
void open(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
  if (x >= 1 && x <= ROWS-2 && y >= 1 && y <= COLS-2)
  {
  int count = FindMine(show, x, y);
  if (count != 0) 
  {
    mine[x][y] = count + '0';
  }
  else if (mine[x][y] != ' ')
  {
    mine[x][y] = ' ';
    int i = 0;
    for (i = x - 1; i <= x + 1; i++)
    {
    int j = 0;
    for (j = y - 1; j <= y + 1; j++)
    {
      open(mine, show, i, j);
    }
    }
  }
  else
    {
      return;
    }
  }
}


test.c


#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
  char mine[COLS][ROWS], show[COLS][ROWS];
  InitBoard(mine, COLS, ROWS, '*');
  InitBoard(show, COLS, ROWS, '0');
  DisplayBoard(mine, COLS, ROWS);
  SetMine(show, COLS-2, ROWS - 2);
  //DisplayBoard(show, COLS, ROWS);
  BreakBoard(mine,show, COLS-2, ROWS-2);
  open(mine, show, COLS - 2, ROWS - 2);
}
void menu()
{
  printf("**************************\n");
  printf("********  1 play  ********\n");
  printf("********  0 exit  ********\n");
  printf("**************************\n");
}
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;
}

如果您觉得我写得好,不妨给我点赞,关注来鼓励我,我一定会继续努力的!


咱们下次再见!



e7e7f2afa36e274dc66d67710fd97f4a_082541a0741246c3872cdde69fb7972e.jpeg

 


相关文章
|
4月前
|
移动开发 JavaScript 前端开发
【绝技揭秘】从零到英雄:解锁UniApp H5项目中的二维码生成与扫描秘籍,让你的应用瞬间变身扫码达人!
【8月更文挑战第20天】二维码在移动应用中无处不在。本文详述了在UniApp H5项目中实现二维码生成与扫描的方法。通过对比插件`uni-app-qrcode`和JavaScript库`qrcode-generator`生成二维码的方式,以及使用插件`@juggle/resize-observer`和HTML5的MediaDevices API进行扫描的技术方案,帮助开发者挑选最佳实践。无论是插件的便捷性还是原生JavaScript的灵活性,都能满足不同项目需求。
141 0
|
7月前
|
图形学
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
307 0
|
7月前
|
算法
连连看游戏系列教程开篇
连连看游戏系列教程开篇
106 0
|
小程序 算法 数据可视化
扫雷小游戏 万字全网最详细(可展开一片空白)上
扫雷小游戏 万字全网最详细(可展开一片空白)
96 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