C语言实现扫雷小游戏

简介: 本文讲解:C语言实现扫雷小游戏

 目录

1、设计框架

2、设计流程

2.1菜单

2.2初始化雷阵

2.3生成雷

2.4玩家输入坐标

2.5显示有多少个雷

3、所有程序的源码

3.1game.h

3.2game.c

3.3test.c


前言:

大家好,我是拳击哥。今天给大家展现的是C语言实现扫雷小游戏教程和源码的展示,相信大家都知道扫雷游戏的规则,那怎么用C语言实现呢?下面我就来讲解。


1、设计框架

首先,我们要有一个菜单来选择我是开始游戏还是退出游戏。其次我们要设计控制开始或退出后程序的走向。设计完菜单后,我们要初始化雷阵,然后玩家排雷。每排一次我们要判断雷阵周围有几个雷,直到所有的雷都被排完了我们就胜利了,反之排到雷了我们就输了。有了以上思想后,我们再来看程序流程与代码吧。

image.gif编辑


2、设计流程

我们要设计五个函数

    • 菜单
    • 初始化雷阵
    • 生成雷
    • 玩家输入坐标
    • 显示周围有多少个雷

    在编上述几个函数之前,我们先创建三个文件。为了程序的条理清晰,我们要模块化程序,因此创建三个文件。分别为:test.c、game.c、game.h这三个文件

    image.gif编辑

    game.h头文件我们把上述几个模块函数的声明放在里面,包括库函数的头文件,我们都可以放在里面。等到game.c和test.c文件要用的时候,我们直接引用game.h头文件就行。


    2.1菜单

    菜单就是一个简易的黑框款,里面有开始、退出两个选择。选择1就开始,选择0就退出。它的代码为:

    //test.c
    void menu()
    {
      printf("+------------------+\n");
      printf("|------1.开始------|\n");
      printf("|------0.退出------|\n");
      printf("+------------------+\n");
    }

    image.gif

    菜单函数我命名为menu,并且把这个函数放在了test.c里面。

    image.gif编辑


    2.2初始化雷阵

    我们初始化雷阵我们需要两个雷盘,一个是用来排雷的雷盘,一个是显示给用户看的雷盘。排雷的雷阵里面我们可以设置雷的个数,并且用户是看不到这个雷阵的。我设置的雷盘是9*9的雷盘我们来看代码:

    //game.h
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #define EasyGame 20
    #define H 9
    #define L 9
    #define HS H+2
    #define LS L+2
    //game.h
    void InitB(char board[HS][LS], int h, int l, char rat);
    //test.c
    void test()
    {
      char mine[HS][LS] = { 0 };
      char show[HS][LS] = { 0 };
      InitB(mine, HS, LS, '0');
      InitB(show, HS, LS, '*');
      PrintB(mine, H, L);
      PrintB(show, H, L);
      SetB(mine, H, L);
      FindB(mine, show, H, L);
    }
    //game.c
    void InitB(char board[HS][LS], int h, int l, char rat)
    {
      for (int i = 0; i < h; i++)
      {
        for (int j = 0; j < l; j++)
        {
          board[i][j] = rat;
        }
      }
    }

    image.gif

    我给初始化雷阵函数起名为InitBmine是排雷雷阵,show是用户展现雷阵。那么我在test.c里面初始化这两个雷阵并且调用InitB函数来修改雷阵,mine雷阵我设置全为‘0’,show雷阵我设置全为‘*’。注意是字符类型的。InitB函数的InitB函数的定义放在game.c里面,InitB函数的声明放在game.h里面。

    可能有的朋友说不是9*9的雷阵为啥传参给InitB是11*11,因为我们在判断周围有多少雷的时候假设我们输入的是第9行的坐标那么9*9的雷阵就越界了,因此我传给InitB的是雷阵是9*9我们只需要在9*9里面生成雷就好了,外面那一层里面始终是字符'0'。这样判断的时候不会造成数组越界。

    image.gif编辑


    2.3生成雷

    生成雷我们在排雷雷阵mine里面生成,你可以任意设置你想要的雷数。

    //game.h
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #define EasyGame 20
    #define H 9
    #define L 9
    #define HS H+2
    #define LS L+2
    //game.h
    #define EasyGame 20
    //game.h
    void SetB(char mine[HS][LS], int h, int l);
    //test.c
    void test()
    {
      char mine[HS][LS] = { 0 };
      char show[HS][LS] = { 0 };
      SetB(mine, H, L);
    }
    //game.c
    void SetB(char mine[HS][LS], int h, int l)
    {
      int count = EasyGame;
      while(count)
      {
        int x = rand() % h + 1;
        int y = rand() % l + 1;
        if (mine[x][y] == '0')
        {
          mine[x][y] = '1';
          count--;
        }
      }
    }

    image.gif

    我给生成雷函数名为SetB,EasyGame是雷数,我设置的是20个你也可以修改。 设置雷就把原来初始化雷为'0'改成'1',注意是字符0和1。

    image.gif编辑


    2.4玩家输入坐标

    玩家输入坐标,首先得判断这个坐标之前有没有被输入过。再判断是不是雷,是雷就被炸死了。不是雷就显示用户雷阵中该坐标周围有几个雷,这时候就需要调用一个找到该坐标附近雷数的函数get_mine

    //game.h
    void FindB(char mine[HS][LS], char show[HS][LS], int h, int l);
    //game.c
    int get_mine(char mine[HS][LS], int x, int y)
    {
      return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]) - 8 * '0';
    }
    //game.c
    void FindB(char mine[HS][LS], char show[HS][LS], int h, int l)
    {
      int x = 0;
      int y = 0;
      int win = 0;
      while (win<(h*l-EasyGame))
      {
        printf("请输入您要排查的坐标:>");
        scanf("%d %d", &x, &y);
        if (x >= 1 && x <= h && y >= 1 && y <= l)
        {
          if (show[x][y] != '*')
          {
            printf("坐标已重名,请重新输入:>\n");
            continue;
          }
          if (mine[x][y] == '1')
          {
            printf("很遗憾你被炸死了...\n");
            PrintB(mine, H, L);
            break;
          }
          else
          {
            int n=get_mine(mine, x, y);
            show[x][y] = n+'0';
            PrintB(show, H, L);
            win++;
          }
        }
        else
        {
          printf("请输入正确的坐标:>\n");
        }
      }
      if (win == (h * l - EasyGame))
        printf("恭喜你,排雷成功!\n");
    }

    image.gif

    判断坐标有没有输入过。只要show雷阵里面的该坐标(输入的坐标)!=*就证明这个坐标未输入过,当然如果恰好你输入的是雷就被炸死了,没有就显示周围的雷数。


    2.5显示有多少个雷

    get_mine函数是怎么判断呢,假设我输入的坐标是5,5我要知道该坐标周围有几个雷这时候。把周围8个坐标加起来然后减去8*'0',假设周围有3个雷那么就是5*'0'+3*'1'-8*'0'得到的就是数字3,数字3再加字符'0'就得到了字符'3'然后赋值给show雷阵中的该坐标,这样就达成了显示该坐标有几个雷。

    image.gif编辑

    win是每输入一次坐标就自增一次,直到win<(h*l-EasyGame)也就是win等于没有雷的坐标总数时退出循环。

    最后判断输赢的是行乘以列然后减去EasyGame,如果win等于h*l-EasyGame那么所有的雷就找到了。


    3、所有程序的源码

    3.1game.h

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #define EasyGame 20
    #define H 9
    #define L 9
    #define HS H+2
    #define LS L+2
    void InitB(char board[HS][LS], int h, int l, char rat);
    void PrintB(char show[HS][LS], int h, int l);
    void SetB(char mine[HS][LS], int h, int l);
    void FindB(char mine[HS][LS], char show[HS][LS], int h, int l);

    image.gif

    3.2game.c

    #include"game.h"
    void InitB(char board[HS][LS], int h, int l, char rat)
    {
      for (int i = 0; i < h; i++)
      {
        for (int j = 0; j < l; j++)
        {
          board[i][j] = rat;
        }
      }
    }
    void PrintB(char show[HS][LS], int h, int l)
    {
      printf("-----扫雷游戏------\n");
      for (int i = 0; i <= l; i++)
      {
        printf("%d ", i);
      }
      printf("\n");
      for (int i = 1; i <= h; i++)
      {
        printf("%d ", i);
        for (int j = 1; j <= l; j++)
        {
          printf("%c ", show[i][j]);
        }
        printf("\n");
      }
      printf("-----扫雷游戏------\n");
    }
    void SetB(char mine[HS][LS], int h, int l)
    {
      int count = EasyGame;
      while(count)
      {
        int x = rand() % h + 1;
        int y = rand() % l + 1;
        if (mine[x][y] == '0')
        {
          mine[x][y] = '1';
          count--;
        }
      }
    }
    int get_mine(char mine[HS][LS], int x, int y)
    {
      return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]) - 8 * '0';
    }
    void FindB(char mine[HS][LS], char show[HS][LS], int h, int l)
    {
      int x = 0;
      int y = 0;
      int win = 0;
      while (win<(h*l-EasyGame))
      {
        printf("请输入您要排查的坐标:>");
        scanf("%d %d", &x, &y);
        if (x >= 1 && x <= h && y >= 1 && y <= l)
        {
          if (show[x][y] != '*')
          {
            printf("坐标已重名,请重新输入:>\n");
            continue;
          }
          if (mine[x][y] == '1')
          {
            printf("很遗憾你被炸死了...\n");
            PrintB(mine, H, L);
            break;
          }
          else
          {
            int n=get_mine(mine, x, y);
            show[x][y] = n+'0';
            PrintB(show, H, L);
            win++;
          }
        }
        else
        {
          printf("请输入正确的坐标:>\n");
        }
      }
      if (win == (h * l - EasyGame))
        printf("恭喜你,排雷成功!\n");
    }

    image.gif

    3.3test.c

    #include"game.h"
    void test()
    {
      char mine[HS][LS] = { 0 };
      char show[HS][LS] = { 0 };
      InitB(mine, HS, LS, '0');
      InitB(show, HS, LS, '*');
      PrintB(show, H, L);
      SetB(mine, H, L);
      FindB(mine, show, H, L);
    }
    void menu()
    {
      printf("+------------------+\n");
      printf("|------1.开始------|\n");
      printf("|------0.退出------|\n");
      printf("+------------------+\n");
    }
    int main()
    {
      srand((unsigned int)time(NULL));
      int input = 0;
      do
      {
        menu();
        printf("请输入您选择的数:>");
        scanf("%d", &input);
        switch (input)
        {
        case 0:printf("您已退出游戏!\n"); break;
        case 1:test(); break;
        default:printf("请输入正确的数字:>\n"); break;
        }
      } while (input);
      return 0;
    }

    image.gif


    本期博客就到这里结束了,如有不懂可在评论区留言

    image.gif编辑

    Never Give Up



    相关文章
    |
    1月前
    |
    C语言
    扫雷游戏(用C语言实现)
    扫雷游戏(用C语言实现)
    100 0
    |
    3月前
    |
    机器学习/深度学习 C语言
    九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
    【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
    42 1
    九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
    |
    1月前
    |
    C语言 C++
    【C语言】编写“猜数字“小游戏
    【C语言】编写“猜数字“小游戏
    |
    2月前
    |
    定位技术 API C语言
    C语言——实现贪吃蛇小游戏
    本文介绍了一个基于Windows控制台的贪吃蛇游戏的实现方法。首先,需调整控制台界面以便更好地显示游戏。接着,文章详细描述了如何使用Win32 API函数如`COORD`、`GetStdHandle`、`GetConsoleCursorInfo`等来控制控制台的光标和窗口属性。此外,还介绍了如何利用`GetAsyncKeyState`函数实现键盘监听功能。文中还涉及了`&lt;locale.h&gt;`库的使用,以支持本地化字符显示。
    60 1
    C语言——实现贪吃蛇小游戏
    |
    2月前
    |
    存储 安全 算法
    C 语言——实现扫雷小游戏
    本文介绍了使用二维数组创建棋盘并实现扫雷游戏的方法。首先,通过初始化数组创建一个9x9的棋盘,并添加行列标识以便操作。接着,利用随机数在棋盘上布置雷。最后,通过判断玩家输入的坐标来实现扫雷功能,包括显示雷的数量和处理游戏胜利或失败的情况。文中提供了完整的代码实现。
    45 1
    C 语言——实现扫雷小游戏
    |
    1月前
    |
    C语言 定位技术 API
    【C语言】实践:贪吃蛇小游戏(附源码)(二)
    【C语言】实践:贪吃蛇小游戏(附源码)
    【C语言】实践:贪吃蛇小游戏(附源码)(二)
    |
    1月前
    |
    C语言 开发者
    C语言实现猜数字小游戏(详细教程)
    C语言实现猜数字小游戏(详细教程)
    |
    1月前
    |
    存储 算法 安全
    C语言实现扫雷游戏
    C语言实现扫雷游戏
    |
    1月前
    |
    C语言
    初学者指南:使用C语言实现简易版扫雷游戏
    初学者指南:使用C语言实现简易版扫雷游戏
    37 0
    |
    1月前
    |
    C语言
    C语言扫雷游戏(详解)
    C语言扫雷游戏(详解)
    40 0