C语言 扫雷详解

简介: C语言 扫雷详解


前言

扫雷这个游戏跟之前的三子棋有着异曲同工之处,相信大家对之前三子棋游戏的理解后,理解这个就很容易了!

一、问题描述

用c语言来实现简单的扫雷游戏

二、基本流程

扫雷的大体的思路如下:

1.开始之前我们还是要先创建相应的菜单;

2.扫雷游戏还是跟之前的三子棋游戏差不多,还是要创建数组来来存放相应的信息:

  • **1.**我们在这里要创建两个数组,分别是mine和show数组,具体功能分别是:
  • mine:用来存放有关炸弹的数组,对其初始化,我们设置为有炸弹的地方显示为‘1’,没有的显示为‘0’;
  • show:我们让它作为查找炸弹位置的数组来使用,开始时为‘*’,后面便是显示周围查出的炸弹的数量。

3.接下来就是初始化二位数组;

4.打印棋盘,每次输入坐标后都打印一次棋盘,以便于观察情况;

5.实现布置雷的操作;

6.实现排查雷的操作:玩家输入一个坐标,若踩雷则会提醒游戏结束;若未踩雷,则在show数组中的相应位置中显示周围一圈雷的个数;

9、游戏结束

三、前期的准备工作

还是跟三子棋一样,我们可以配置不同的环境来存放不同功能的代码,这里就不具体展开。

四、步骤

第一步:

1.首先还是设计一个简单的菜单,实现的功能功能跟三子棋的差不多(输入1开始游戏,输入0突出游戏)

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

2.菜单界面出来之后,便写入相应的代码去进行实现,用while循环的方法来实现菜单的循环打印(Switch函数实现这一功能)

int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));
  do {
    menu();
    printf("请输入数字:>");
    scanf("%d", &input);
    switch (input)
    {
    case 0:
      printf("退出游戏");
      break;
    case 1:
      game();
      break;
    default:
      printf("选择错误,请重新输入");
    }
  } while (input);
  return 0;
}

第二步:

1.设计二维数组来存放信息,便于实现更改还是使用define来定义,通过#define定义常量的方式来设定,方便以后代码的更新;

2、为了之后访问二维数组时不越界,设置棋盘时,行和列都要+2(如果想玩9×9的棋盘,那么在最初设置棋盘时要设置成11×11)

mine来存放布置好的雷的信息
show存放排除出雷的信息
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
#define ROW 9
#define COL   9
#define ROWS ROW+2
#define COLS  COL+2

第三步:

紧接着我们便要对棋盘进行相应的初始化操作:

在test.c中定义(以下相同)

//初始化棋盘
  //mine初始化'0'
  //show初始化为全‘*'
  init_board(mine, ROWS, COLS, '0');
  init_board(show, ROWS, COLS, '*');

在game.c中进行实现

void init_board(char board[ROWS][COLS], int rows, int cols, char set)
{
  int i = 0;
  int j = 0;
  for (i = 0; i < rows; i++)
  {
    for (j = 0; j < cols; j++)
    {
      board[i][j] = set;
    }
  }
}

第四步:

在这一步就是打印我们的棋盘(我们要有写一步就打印一步的习惯,便于更好的进行后继操作)这里就不具体展开

第五步:

1.现在我们便开始布雷的环节,雷的数量我们还是用define来定义,便于修改,通过rand函数(使用rand函数,需要在主函数中对rand函数进行修饰:srand((unsigned int)time(NULL));否则每次生成的随机值将一样)

2.接着还要判断坐标是否被布置,合法性。

void set_mine(char mine[ROWS][COLS], int row, int col)
{
  int count = EASY_COUNT;
  while (count)
  {
    int x = rand() % row + 1;
    int y = rand() % col + 1;
    //判断是否被布置
    if (mine[x][y] == '0')
    {
      mine[x][y]='1';
      count--;
    }
  }
}
srand((unsigned int)time(NULL));

第六步:

最后就是排雷的操作,在扫雷的时候注意坐标的合法性的判断及是否之前被扫过等操作,扫出所有雷即为胜利,“踩”倒雷即为失败,若选中坐标不是雷的坐标,显示周围8个坐标总共有多少雷

//排雷
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
  //计算周围的雷的个数
  return (mine[x - 1][y] +
    mine[x - 1][y - 1] +
    mine[x][y - 1] +
    mine[x + 1][y - 1] +
    mine[x + 1][y] +
    mine[x + 1][y + 1] +
    mine[x][y + 1] +
    mine[x - 1][y + 1] - 8 * '0');
}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
  int x = 0;
  int y = 0;
  int win = 0;
  while(win < row * col - EASY_COUNT)
  {
    printf("请输入要排查雷的坐标:>");
    scanf("%d %d", &x, &y);
    if (x >= 1 && x <= row && y >= 1 && y <= col)
    {
      //坐标被排查过
      if (show[x][y] == '*')
      {
        if (mine[x][y] == '1')
        {
          printf("很遗憾,你踩雷了\n");
          display_board(mine, ROW, COL);
          break;
        }
        else
        {
          int count = get_mine_count(mine, x, y);
          show[x][y] = count + '0';      //加的都是ASCLL码值
          display_board(show, ROW, COL);
          win++;
        }
      }
      else
      {
        printf("该坐标已经被排查过了\n");
      }
    }
    else
    {
      printf("坐标非法,请重新输入");
    }
     }
  if (win == row * col - EASY_COUNT)
  {
    printf("排雷成功\n");
    display_board(mine, ROW, COL);
  }
}

五、总结以及代码

test.c如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
  printf(" ********              1.play         *********\n");
  printf(" ********              0.exit          ********\n");
  printf(" **********************************************\n");
  printf(" **********************************************\n");
}
void game()
{
  //设计两个数组来存放信息
  //mine来存放布置好的雷的信息
  //show存放排除出雷的信息
  char mine[ROWS][COLS] = { 0 };
  char show[ROWS][COLS] = { 0 };
  //初始化棋盘
  //mine初始化'0'
  //show初始化为全‘*'
  init_board(mine, ROWS, COLS, '0');
  init_board(show, ROWS, COLS, '*');
  //打印棋盘
  //display_board(mine, ROW, COL);
  //display_board(show, ROW, COL);
  //布置雷
  set_mine(mine, ROW, COL);
  //display_board(mine, ROW, COL);
  
  //排雷
  display_board(show, ROW, COL);
  
  find_mine(mine, show, ROW, COL);
}
int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));
  do {
    menu();
    printf("请输入数字:>");
    scanf("%d", &input);
    switch (input)
    {
    case 0:
      printf("退出游戏");
      break;
    case 1:
      game();
      break;
    default:
      printf("选择错误,请重新输入");
    }
  } while (input);
  return 0;
}

game.c如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化棋盘
void init_board(char board[ROWS][COLS], int rows, int cols, char set)
{
  int i = 0;
  int j = 0;
  for (i = 0; i < rows; i++)
  {
    for (j = 0; j < cols; j++)
    {
      board[i][j] = set;
    }
  }
}
//打印棋盘
void display_board(char board[ROWS][COLS], int row, int col)
{
  int i = 0;
  int j = 0;
  for (j = 0; j <= col; j++)
  {
    printf("%d  ", j);
  }
  printf("\n");
  for (i = 1; i <= row; i++)
  {
    printf("%d  ", i);
    for (j = 1; j <= col; j++)
    {
      printf("%c  ", board[i][j]);
    }
    printf("\n");
  }
}
//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{
  int count = EASY_COUNT;
  while (count)
  {
    int x = rand() % row + 1;
    int y = rand() % col + 1;
    //判断是否被布置
    if (mine[x][y] == '0')
    {
      mine[x][y]='1';
      count--;
    }
  }
}
//排雷
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
  //计算周围的雷的个数
  return (mine[x - 1][y] +
    mine[x - 1][y - 1] +
    mine[x][y - 1] +
    mine[x + 1][y - 1] +
    mine[x + 1][y] +
    mine[x + 1][y + 1] +
    mine[x][y + 1] +
    mine[x - 1][y + 1] - 8 * '0');
}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
  int x = 0;
  int y = 0;
  int win = 0;
  while(win < row * col - EASY_COUNT)
  {
    printf("请输入要排查雷的坐标:>");
    scanf("%d %d", &x, &y);
    if (x >= 1 && x <= row && y >= 1 && y <= col)
    {
      //坐标被排查过
      if (show[x][y] == '*')
      {
        if (mine[x][y] == '1')
        {
          printf("很遗憾,你踩雷了\n");
          display_board(mine, ROW, COL);
          break;
        }
        else
        {
          int count = get_mine_count(mine, x, y);
          show[x][y] = count + '0';      //加的都是ASCLL码值
          display_board(show, ROW, COL);
          win++;
        }
      }
      else
      {
        printf("该坐标已经被排查过了\n");
      }
    }
    else
    {
      printf("坐标非法,请重新输入");
    }
     }
  if (win == row * col - EASY_COUNT)
  {
    printf("排雷成功\n");
    display_board(mine, ROW, COL);
  }
}

game.h如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
void init_board(char board[ROWS][COLS], int rows, int cols, char set);
void display_board(char board[ROWS][COLS], int row, int col);
void set_mine(char mine[ROWS][COLS], int row, int col);
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

最后还是希望大家多多上手操作!

相关文章
|
2月前
|
C语言
C语言-------扫雷游戏的代码实现
C语言-------扫雷游戏的代码实现
27 0
|
2月前
|
算法 C语言 C++
【C语言-扫雷游戏全功能详解】
【C语言-扫雷游戏全功能详解】
39 1
|
4月前
|
C语言
C语言之详解数组【附三子棋和扫雷游戏实战】(二)
C语言之详解数组【附三子棋和扫雷游戏实战】(二)
|
10天前
|
C语言
以c语言为基础实现的简易扫雷游戏(游戏代码附在文章最后,如有需要请自取)
以c语言为基础实现的简易扫雷游戏(游戏代码附在文章最后,如有需要请自取)
32 1
|
21天前
|
C语言
爱上C语言:扫雷小游戏,展开一片功能实现
爱上C语言:扫雷小游戏,展开一片功能实现
爱上C语言:扫雷小游戏,展开一片功能实现
|
2月前
|
编译器 定位技术 C语言
【C语言实战项目】扫雷游戏
【C语言实战项目】扫雷游戏
27 0
|
2月前
|
存储 Serverless C语言
C语言第十二弹--扫雷
C语言第十二弹--扫雷
|
2月前
|
存储 定位技术 C语言
基于C语言实现扫雷小游戏
本文介绍了使用C语言实现扫雷小游戏的过程。扫雷是一款经典的单机游戏,玩家需要通过点击方格来揭示数字或地雷,最终清除所有非地雷方格。实现过程中,首先定义了游戏所需的数据结构,如游戏地图、玩家信息等。然后,实现了游戏的初始化、渲染、输入处理等核心功能。在游戏逻辑方面,处理了点击事件、数字计算和胜负判断等。通过不断优化和完善,最终完成了基于C语言的扫雷小游戏实现,为玩家提供了一种简单有趣的游戏体验。
25 0
|
2月前
|
机器学习/深度学习 小程序 C语言
C语言初学者:原来我也可以实现扫雷小游戏(简易版)!
C语言初学者:原来我也可以实现扫雷小游戏(简易版)!
|
2月前
|
C语言
【C语言】扫雷(可展开空白版与鼠标操作版)
【C语言】扫雷(可展开空白版与鼠标操作版)
32 0