C语言扫雷游戏的实现代码

这是一个用C语言实现的控制台扫雷小游戏,实现了随机布置炸弹、扫描炸弹、标记炸弹、百分百第一次不被炸死等功能。

编译器:vs2015

功能模块图

源代码

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

void show(int cbd[10][10],int u[10][10])  //界面输出函数
{
  int i, j;
  //for (i = 0; i < 10; i++)   //输出全部炸弹信息(上帝视角,调试用)
  //{
  // for (j = 0; j < 10; j++)
  // {
  //   printf("%2d ", cbd[i][j]);
  // }
  // printf("\n");
  //}
  printf("   1 2 3 4 5 6 7 8 9 10\n");   //行标
  printf("  --------------------\n");
  for (i = 0; i<10; i++)    //根据u数组和cbd数组的值选择输出
  {                //■:未扫描,□:周围无炸弹,◇:炸弹标记
    for (j = 0; j<10; j++)
    {
      if (j == 0)printf("%2d║ ", i+1);
      if (u[i][j] == 0)printf("■");
      else if (u[i][j] == 1)
      {
        if (cbd[i][j] == 0)printf("□");
        else printf("%2d", cbd[i][j]);
      }
      else if (u[i][j] == -1)
      {
        printf("◇");
      }
    }
    printf("\n");
  }
}

int find(int cbd[10][10], int i, int j)   //扫描周围炸弹数目
{
  int l, c,lmin,cmin, lmax, cmax, num = 0;
  l = lmin = (i - 1) >= 0 ? (i - 1) : 0;   //计算行、列起点
  c = cmin = (j - 1) >= 0 ? (j - 1) : 0;
  lmax = ((i + 1) < 10 ? (i + 1) : 9);    //计算行、列终点
  cmax = ((j + 1) < 10 ? (j + 1) : 9);

  for (l = lmin; l <= lmax; l++)
  {
    for (c = cmin; c <= cmax; c++)
    {
      if (l == i&&c == j)continue;    //跳过自身
      if (cbd[l][c] == -1)num++;  //炸弹计数
    }
  }
  return num;
}

void init(int cbd[10][10])    //cbd数组初始化(随机布置炸弹并填充各个格子的数目)
{
  int n = 10, l, c, i, j;
  srand(time(NULL));      //随机数种子设置
  for (i = 0; i< 10; i++)
  {
    for (j = 0; j< 10; j++)
    {
      cbd[i][j] = 0;      //全0填充
    }
  }
  while (n--)     //随机行列放置炸弹
  {
    l = rand() % 10;
    c = rand() % 10;
    if (cbd[l][c] != -1)cbd[l][c] = -1;    //炸弹重复处理
    else n++;
  }
  for (i = 0; i< 10; i++)
  {
    for (j = 0; j< 10; j++)
    {
      if (cbd[i][j] != -1)
      {
        cbd[i][j] = find(cbd, i, j);  //炸弹数目填充
      }
    }
  }
}

void open(int cbd[10][10],int u[10][10], int i, int j)   //周围无炸弹时的展开函数(递归展开)
{
  u[i][j] = 1;
  if (cbd[i][j] == 0)
  {
    if(i - 1 >= 0 && u[i - 1][j] != 1)open(cbd, u, i - 1, j);  //上
    if(j - 1 >= 0 && u[i][j - 1] != 1)open(cbd, u, i, j - 1);  //左
    if (i + 1 <= 9 && u[i + 1][j] != 1)open(cbd, u, i + 1, j); //下
    if (j + 1 <= 9 && u[i][j + 1] != 1)open(cbd, u, i, j + 1); //右
  }
}

int judge(int u[10][10])    //判断游戏是否通关
{
  int i, j, num = 0;
  for (i = 0; i < 10; i++)
  {
    for (j = 0; j < 10; j++)
    {
      if (u[i][j] == 0 || u[i][j] == -1)num++;
    }
  }
  if (num == 10)return 1;
  else return 0;
}

void fail(int cbd[10][10], int u[10][10])    //游戏失败函数
{
  int i, j;
  for (i = 0; i < 10; i++)          //输出全部炸弹信息
  {
    for (j = 0; j < 10; j++)
    {
      if (cbd[i][j] == 0)printf(" ");
      else if (cbd[i][j] != -1)printf("%2d", cbd[i][j]);
      else printf("●");
    }
    printf("\n");
  }
  printf("请大侠重新来过~\n");
}

void menu(int cbd[10][10],int u[10][10])  //菜单函数
{
  int chs,i,j;
  int boom = 10;    //剩余炸弹数
  int num = 0;     //步数
  while (1)
  {
    system("cls");
    show(cbd,u);
    printf("还有%d个炸弹\n",boom);
    printf("1.扫描  2.标记  3.取消标记\n");
    printf("请输入选项:>");
    scanf("%d", &chs);
    if (chs > 3 || chs < 1) {
      printf("请输入正确选项!\n");
      system("pause");
      continue;
    }
    printf("请输入坐标:>");
    scanf("%d %d", &i, &j);
    if (i < 1 || i>10)
    {
      printf("请输入正确坐标!\n");
      system("pause");
      continue;
    }
    i--;      //输入行列数处理(适用数组下标)
    j--;
    if (chs == 1)
    {
      if (cbd[i][j] == -1) {
        if (num == 0) {   //若第一步扫描到炸弹,就重新初始化棋盘
          init(cbd);
          show(cbd, u);
          open(cbd, u, i, j);
          num++;
          continue;
        }
        else
        {
          fail(cbd, u);  //否则游戏失败,循环跳出
          break;
        }
      }
      if (u[i][j] == 1)    //重复扫描时的处理
      {
        printf("该位置已经扫描过了!\n");
        system("pause");
        continue;
      }
      open(cbd, u, i, j);
      num++;
    }
    else if(chs == 2)
    {
      if (u[i][j] == 1) {
        printf("该位置已经扫描过了!\n"); //只能标记未扫描到的
        system("pause");
        continue;
      }
      u[i][j] = -1;
      boom --;
    }
    else if (chs == 3)
    {
      if (u[i][j] != -1) {
        printf("该位置没有标记!\n");    //只能取消标记过的
        system("pause");
        continue;
      }
      u[i][j] = 0;
      boom++;
    }
    if (judge(u))    //判断游戏是否通关
    {
      printf("Old Fe 666!\n");    //老铁666!,循环跳出
      break;
    }
  }
}

int main()
{
  int cbd[10][10] = { 0 };    //保存炸弹信息的二维数组
  int u[10][10] = { 0 };     //保存是否翻开信息的二维数组
  init(cbd);      //数组初始化
  menu(cbd, u);    //进入菜单
  return 0;
}

Tips:在扫描到周围无炸弹的格子时,要将此格子周围的部分依次打开,直到上下左右都出现炸弹数字为止,这里要用到递归的方法,我的顺序为依次递归处理上、左、下、右的格子,这里顺序可以任意。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言代码实现扫雷小游戏

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 主页面: 游戏页面: 虽然页面比较low,但我已经尽力了 具体代码实现: #include<stdio.h> #include<windows.h> #include<conio.h> #include<stdlib.h> #include<time.h> int n;//记录已经探索的区域数 int x,y;//光标的横纵坐标 int T;//判断游戏是否失败,T=1

  • C语言开发简易版扫雷小游戏

    前言: 想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了. 之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什么注释[果然那时候太年轻]!现在看了也是被那时候的自己逗笑了,就修改了一些小bug,增加了算是详尽而清楚的注释,嗯,MSDN上面对各种函数的解释很详细的[又锻炼一下英语],顺便让开头和结尾的展示"动"了起来,就当作1.5的版本好了. 这个只是给出了一个实现的思路,其中肯定也有很多不合理的地

  • C语言实现扫雷游戏

    本文将介绍如何用C语言多文件编程实现扫雷 该示例扫雷程序可实现以下几个功能: 自定义雷数 踩雷后会将所有雷显示出来 地图大小易修改 Mine_clearance.h #pragma once #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 11 #define COL 11 #define 踩雷 0 #define 玩家胜利

  • C语言实现简易扫雷小游戏

    我们经常在电脑上面玩的扫雷游戏,很考验我们的判断能力,但是实现一个扫雷游戏并不是很困难,只要多注意一些细节就好,就可以将一个简单的扫雷游戏写出来! 接下来先介绍扫雷游戏要实现的功能: 首先,要对雷阵进行初始化,在初始化的时候要注意要定义两个数组,一个是让我们扫雷的阵,另外一个就是显示某一个地方的周围的雷的总个数的矩阵,在初始化的时候要注意为了避免传址的问题,我们把它写在主函数里面. char mine[rows][cols]; char show[rows][cols]; int i = 0;

  • C语言实现简单扫雷小程序

    扫雷是一款大众类的益智小游戏.游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输. 首先带大家简单来了解一下扫雷的游戏机制: 随便点一个格子,会有一块,上面的数字就代表数字周围八个格子会有几个雷,是1他周围就只有1个雷,2就有两个雷,以此类推,直到找出全部没有雷的格子就算玩家赢.只要点到一个有雷的格子就判定玩家输. 了解了 机制之后就来编写程序.将程序分为test.c.game.c和game.h三个部分.其中test.c中编写主函数,game.c中

  • C语言实现简单扫雷游戏

    本文实例为大家分享了C语言实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 步骤 1.首先打印游戏选择菜单 2.地图及初始化 1).展示给玩家的地图(show_map) 2).地雷的图(mine_map可知地雷的位置) 3.打印地图 4.用户输入坐标,并检查坐标的合理性 5.判断当前位置是否有地雷,没有则出现数字(表示周围格子中有几个地雷) 6.打印新的地图 7.重复3~6步骤,直到踩雷游戏结束,或胜利. 8重新继续游戏或退出! 代码 主函数及游戏选择菜单 #include<stdio.h>

  • C语言代码实现扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 该游戏我们也是利用数组完成,设置俩个数组一个mine数组,一个show数组. mine数组存放雷,show数组显示棋盘并且显示该位置是否有雷或者显示该位置周围有几个雷. 数组大小有讲究,我们宏定义变量 ROW COL 为9 定义ROWS COLS为11,我们显示的是9X9的棋盘,也是将雷设置在9X9的位置内,但是我们设置数组是设置11X11,因为这样方便我们遍历9X9棋盘四边位置上某位置四周雷的数目,不然的话会发生越界错

  • 基于C语言实现的扫雷游戏代码

    本文详细讲述了基于C语言实现的扫雷游戏代码,代码中备有比较详细的注释,便于读者阅读和理解.希望对学习游戏开发的朋友能有一点借鉴价值. 完整的实例代码如下: /* 模拟扫雷游戏 */ #include <graphics.h> #include <math.h> #include <stdio.h> #include <dos.h> #include <stdlib.h> #include <conio.h> #include <

  • C语言实现简单扫雷小游戏

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <time.h> /* 用 C 语言写一个简单的扫雷游戏 */ // 1.写一个游戏菜单 Menu() // 2.开始游戏 // 1.初始化二维数组 Init_Interface() // 2.打印游戏界面 Print_Interfa

  • C语言实现扫雷程序

    使用C语言实现简单的扫雷程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现. game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的扫雷程序,我们需要创建两个二维数组,一个保存我们随机生成的雷,另外一个向外界展示. //使用宏定义定义常量,方便之后对数组的使用 #define ROW 11 //雷 #define COL 11 #define ROWS 9 //棋盘 #define COL

随机推荐