扫雷小游戏(C语言实现)

简介: 扫雷小游戏(C语言实现)

认识游戏

相信大家对扫雷都不陌生!每台电脑必备的小游戏!


image.png

游戏规则

就是在规定的时间将埋藏的地雷全部找到,即游戏胜利!


胜利条件:你需要在不点错雷的情况下尽可能快的将所有的雷都标记出来,如果你点错,就得重新开始,所以扫雷也有一定的运气成分。


简单说

就是将所有不是雷的地方全部标记出来,剩下地雷,游戏胜利,如果标记点到了地雷,游戏失败!


如何找到不是地雷标记出来呢?

image.png

每点开一个小格子,如果是雷,就游戏结束,如果不是就会出现数字,出现的数字表示,周围一圈雷的个数!

image.png

2表示周围一圈的地雷数为2个。

根据这些数字即可将地雷全部排除走向胜利!


游戏框架

游戏框架和三子棋一样!


//游戏框架
  int input = 0;
  do 
  {
  menu();//菜单
  scanf("%d", &input); //选择
  switch (input)
  {
  case 1:game();
    break;
  case 0:printf("退出游戏\n");
    break;
  default:printf("输入错误,请重新输入\n");
    break;
  }
  } while (input);

我们写小游戏的框架基本上都是这样!


游戏实现

游戏的实现是我们这个游戏的重点内容!

我们如何才能将游戏实现呢?

先从原理入手!


埋雷

如何买雷呢?

我们所玩的扫雷都是由许多小格子组成的矩阵!

所以我们可以利用二维数组埋地雷!


显示该点周围雷的个数

周围雷数的计算,就是判断改点周围是非为雷,并且计算个数显示给玩家!


判断游戏状态

点到地雷说明游戏结束,将所有地雷找到,游戏胜利。


实现思想

用一个二维数组埋雷

另一个二维数组显示给玩家

image.png

当我们将雷弄成AxA的雷阵藏雷,会发现如果我们进行周围雷数的查找是会发生数组越界,所以我们可以创建(A+2)x(A+2)的雷阵,然后埋雷在AxA中!


void game()
{
  //初始化布雷数组—— > 初始化棋盘数组—— > 
  //设置地雷—— > 显示棋盘—— > 玩家扫雷
  //埋雷
  char mine[ROWS][COLS] = { 0 }; //雷区图
  char show[ROWS][COLS] = { 0 }; //玩家图
  //初始化棋盘
  InitBoard(mine, ROWS, COLS,'0');
  InitBoard(show, ROWS, COLS, '*');
  //设置地雷
  SetMine(mine, ROW, COL,MineCount);
  PrintBoard(show, ROW, COL);
  //玩家扫雷
  int count = ROW*COL-MineCount;
  while (CheckMine(mine,show, ROW, COL))
  {
  count--;
  PrintBoard(show, ROW, COL);
  if (count == 0)
  {
    printf("恭喜你,游戏胜利\n");
    PrintBoard(mine, ROW, COL);
    break;
  }
  }
}
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col, char x)
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
  int j = 0;
  for (j = 0; j < col; j++)
  {
    board[i][j] = x;
  }
  }
  return ;
}
//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col)
{
   int i = 0;
   //打印列号
   for (i = 0; i <= col; i++)
    printf(" %d ", i);
       printf("\n");
  for (i = 0; i < row; i++)
  {
  printf(" %d ", i+1);
  int j = 0;
  for (j = 0; j <col; j++)
  {
    printf(" %c ", board[i][j]);
  }
  printf("\n");
  }
  return;
}
//埋雷
void SetMine(char board[ROW][COL], int row, int col, int count)
{
  while (count)
  {
  int i = rand() % row;
  int j = rand() % col;
  if (board[i][j] == '0')
  {
    board[i][j] = '1';
    count--;
     }
  }
}

核心代码


//查雷
int CheckMine(char mine[ROW][COL],char show[ROW][COL], int row, int col)
{
  printf("请输入你要扫雷的坐标:>");
  while (1)
  {
  int i = 0, j = 0;
  scanf("%d%d", &i, &j);
  if (i >=1 && i <= row && j >=1 && j <= col)
  {
    if (mine[i-1][j-1] != '1')
    {
    int  count=IsMineCount(mine,i-1,j-1);
    show[i-1][j-1] = count+'0';
    return 1;
    }
    else
    {
    printf("很遗憾,你被炸死了\n");
    PrintBoard(mine, ROW, COL);
    return 0;
    }
  }
  }
}
int  IsMineCount(char mine[ROW][COL], int x, int y)
{
  int count = 0;
  int i= 0;
  for (i = x - 1; i <= x + 1; i++)
  {  
  int j = 0;
  for (j = y - 1; j <=y + 1; j++)
  {
    if (mine[i][j] == '1')
    {
    count++;
    }
  }
  }
  return count;
}

效果展示


image.png

image.png



全部代码

test.c文件

#define _CRT_SECURE_NO_WARNINGS 1 
#include"game.h"
void menu()
{
  printf("******************************\n");
  printf("**********    1.play    ******\n");
  printf("**********    0.exit    ******\n");
  printf("******************************\n");
  printf("Input(1/0):>");
}
void game()
{
  //初始化布雷数组—— > 初始化棋盘数组—— > 设置地雷
  //—— > 显示棋盘—— > 玩家扫雷
  //埋雷
  char mine[ROWS][COLS] = { 0 }; //雷区图
  char show[ROWS][COLS] = { 0 }; //玩家图
  //初始化棋盘
  InitBoard(mine, ROWS, COLS,'0');
  InitBoard(show, ROWS, COLS, '*');
  //设置地雷
  SetMine(mine, ROW, COL,MineCount);
  PrintBoard(show, ROW, COL);
  //玩家扫雷
  int count = ROW*COL-MineCount;
  while (CheckMine(mine,show, ROW, COL))
  {
  count--;
  PrintBoard(show, ROW, COL);
  if (count == 0)
  {
    printf("恭喜你,游戏胜利\n");
    break;
  }
  }
}

game.h文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9  
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MineCount 6
void InitBoard(char board[ROWS][COLS],int row,int col,char x);
void SetMine(char board[ROWS][COLS], int row, int col,int count);
void PrintBoard(char board[ROW][COL], int row, int col);
int  CheckMine (char mine[ROWS][COLS], char show[ROW][COL], int row, int col);
int IsMineCount(char mine[ROWS][COLS],int i, int j);

game.c文件

#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col, char x)
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
  int j = 0;
  for (j = 0; j < col; j++)
  {
    board[i][j] = x;
  }
  }
  return ;
}
void SetMine(char board[ROW][COL], int row, int col, int count)
{
  while (count)
  {
  int i = rand() % row;
  int j = rand() % col;
  if (board[i][j] == '0')
  {
    board[i][j] = '1';
    count--;
     }
  }
}
void PrintBoard(char board[ROW][COL], int row, int col)
{
   int i = 0;
   //打印列号
   for (i = 0; i <= col; i++)
    printf(" %d ", i);
       printf("\n");
  for (i = 0; i < row; i++)
  {
  printf(" %d ", i+1);
  int j = 0;
  for (j = 0; j <col; j++)
  {
    printf(" %c ", board[i][j]);
  }
  printf("\n");
  }
  return;
}
int CheckMine(char mine[ROW][COL],char show[ROW][COL], int row, int col)
{
  printf("请输入你要扫雷的坐标:>");
  while (1)
  {
  int i = 0, j = 0;
  scanf("%d%d", &i, &j);
  if (i >=1 && i <= row && j >=1 && j <= col)
  {
    if (mine[i-1][j-1] != '1')
    {
    int  count=IsMineCount(mine,i-1,j-1);
    show[i-1][j-1] = count+'0';
    return 1;
    }
    else
    {
    printf("很遗憾,你被炸死了\n");
    return 0;
    }
  }
  }
}
int  IsMineCount(char mine[ROW][COL], int x, int y)
{
  int count = 0;
  int i= 0;
  for (i = x - 1; i <= x + 1; i++)
  {  
  int j = 0;
  for (j = y - 1; j <=y + 1; j++)
  {
    if (mine[i][j] == '1')
    {
    count++;
    }
  }
  }
  return count;
}

目录
相关文章
|
2月前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
104 0
|
2月前
|
C语言 C++
【C语言】编写“猜数字“小游戏
【C语言】编写“猜数字“小游戏
|
2月前
|
C语言 定位技术 API
【C语言】实践:贪吃蛇小游戏(附源码)(二)
【C语言】实践:贪吃蛇小游戏(附源码)
【C语言】实践:贪吃蛇小游戏(附源码)(二)
|
2月前
|
C语言
初学者指南:使用C语言实现简易版扫雷游戏
初学者指南:使用C语言实现简易版扫雷游戏
37 0
|
2月前
|
C语言
C语言扫雷游戏(详解)
C语言扫雷游戏(详解)
40 0
|
2月前
|
C语言
【C语言】实践:贪吃蛇小游戏(附源码)(三)
【C语言】实践:贪吃蛇小游戏(附源码)
|
2月前
|
存储 API C语言
【C语言】实践:贪吃蛇小游戏(附源码)(一)
【C语言】实践:贪吃蛇小游戏(附源码)
|
2月前
|
C语言
C语言贪吃蛇小游戏来啦!
C语言贪吃蛇小游戏来啦!
31 0
|
2月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
36 3
|
16天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
31 6