【C语言】数组的应用实例:扫雷游戏

简介: 扫雷的游戏规则扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败。游戏主区域由很多个方格组成。使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷。

目录

扫雷的游戏规则

扫雷游戏运行步骤

一、代码构成

    游戏模块图

二、游戏代码和讲解

    程序步骤

1.进入游戏界面

2.用switch语句来实现选择

3.建立数组并初始化

       建立两个 char类型的数组

       数组初始化

4.初始化棋盘

5.建立打印棋盘函数

6.建立布置雷函数

7.建立排查雷

      建立输入排查的坐标

      排查周围雷的个数

三、全部代码如下

四、感谢阅读


扫雷的游戏规则


扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败。

游戏主区域由很多个方格组成。使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷。


扫雷游戏运行步骤

image.png


一、代码构成


游戏模块图

image.png

步骤跟三子棋相同,以下是链接


C语言—三子棋 代码构成

https://blog.csdn.net/m0_74014525/article/details/129589918


建议头文件game.c和game.c和test.c文件

image.png


二、游戏代码和讲解


程序步骤

image.png

1.进入游戏界面


#include<stdio.h>intmain()
{
menu();
return0;
}
voidmenu()
{
printf("************************\n");
printf("****** 扫雷  游戏 ******\n");
printf("****** 1.开始游戏 ******\n");
printf("****** 0.退出游戏 ******\n");
printf("************************\n");
}

image.png

2.用switch语句来实现选择

intmain()
{
intinput=0;
srand((unsignedint)time(NULL));
do    {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
        {
case1:
printf("游戏开始\n");
game();
break;
case0:
printf("退出游戏\n");
break;
default:
printf("输入错误,重新选择\n");
break;
        }
    } while (input);
return0;
}


输入 1                      打印游戏开始

输入 0                      打印退出游戏

输入其他数字          打印输出错误,重新选择

输入其他数字不为0  while循环条件不为0  继续循环


3.建立数组并初始化


建立两个 char类型的数组

用define定义数量   方便后期更改棋盘大小


#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2

定义两个数字   9和11

方便后期布置雷和展示棋盘


数组初始化


//建立数组   char类型方正数组   9*9棋盘  //为了方便判断两个棋盘是11*11的//在头文件中定义变量 ROW    COL    和  ROWS   COLS//发现的雷charboard[ROWS][COLS] = { 0 };
//布置好的雷charmine[ROWS][COLS] = { 0 };


4.初始化棋盘

建立 棋盘初始化函数  

在game.h进行函数声明


voidNewBoard(charboards[ROWS][COLS],intcows, intcols, charset);

在game.c中进行函数实现


voidNewBoard(charboards[ROWS][COLS], intcows, intcols, charset)
{
inti=0;
for (i=0; i<cows; i++)
    {
intj=0;
for (j=0; j<cols; j++)
        {
boards[i][j] =set;
        }
    }
}

在test.c中调用函数


//初始化函数名   NewBoard();NewBoard(board,ROWS,COLS,'*');
NewBoard(mine, ROWS, COLS,'0');

这里传输   ' * '  ' 0 '  可以在一个函数中实现两个数组的初始化

' * '  ' 0 ' 传给char set    来接受 将两个数组一个初始化成' * ' ,一个初始化成 ' 0 '


5.建立打印棋盘函数

在game.h进行函数声明


voidPintBoard(charboards[ROWS][COLS], intcow, intcol);

在game.c中进行函数实现


voidPintBoard(charboards[ROWS][COLS], intcow, intcol)
{
inti=0;
printf("****** 扫  雷 ******\n");
for (i=0; i<=cow; i++)
    {
printf("%d ", i);
    }
printf("\n");
for (i=1; i<=cow; i++)
    {
intj=0;
printf("%d ", i);
for (j=1; j<=col; j++)
        {
printf("%c ", boards[i][j]);
        }
printf("\n");
    }
}

在test.c中调用函数


PintBoard(board, ROW, COL);
PintBoard(mine, ROW, COL);

这里进行将数组 mine,board传入函数进行打印

在打印的时候并将数组行列打印出来


6.建立布置雷函数

在game.h进行函数声明


voidSetMine(charmine[ROWS][COLS], intcow, intcol);

在game.c中进行函数实现


voidSetMine(charmine[ROWS][COLS], intcow, intcol)
{
intcount=EASY_HARD;
while (count)
    {
intx=rand() %cow+1;
inty=rand() %col+1;
if (mine[x][y] =='0')
        {
mine[x][y] ='1';
count--;
        }
    }
}

在test.c中调用函数


SetMine(mine, ROW, COL);

这里使用srand函数来生成随机数  

需要用到    #include      #include   两个库函数

用rand进行调用,将rand的随机数%(模)9+1得到1-9随机数


7.建立排查雷


建立输入排查的坐标

在game.h进行函数声明


voidFindMine(charmine[ROWS][COLS], charboard [ROWS][COLS], intcow, intcol);

在game.c中进行函数实现


intGetmine(charmine[ROWS][COLS],intx,inty)
{
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');
}
voidFindMine(charmine[ROWS][COLS], charboard[ROWS][COLS], intcow, intcol)
{
intx=0;
inty=0;
intwin=0;
while (win<cow*col-EASY_HARD)
    {
printf("请输入坐标:>");
scanf("%d %d", &x, &y);
if (x>=1&&x<=cow&&y>=1&&y<=col)
        {
if (mine[x][y] =='1')
            {
printf("哈哈哈你被炸死了\n");
PintBoard(mine, ROW, COL);
break;
            }
else            {
//如果该坐标不是雷  统计周围的雷的数量intcount=Getmine(mine, x, y);
board[x][y] ='0'+count;
PintBoard(board, ROW, COL);
win++;
            }
        }
else        {
printf("非法坐标 ,重新输入\n");
        }
    }
if (win==col*cow-EASY_HARD)
    {
printf("恭喜你成功通关了\n");
    }
}

在test.c中调用函数


FindMine(mine, board,ROW, COL);

排查周围雷的个数


image.png

intGetmine(charmine[ROWS][COLS],intx,inty)
{
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');
}

将周围'1'相加-'0' 得到雷的个数  在board数组上显示

当排查完没有雷的个数等于row*col-雷的个数的时   游戏结束恭喜玩家通关


三、全部代码如下

头文件函数game.h

#pragma once#include<stdio.h>#include<time.h>#include<stdlib.h>#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define  EASY_HARD 10voidNewBoard(charboards[ROWS][COLS],intcows, intcols, charset);
voidPintBoard(charboards[ROWS][COLS], intcow, intcol);
voidSetMine(charmine[ROWS][COLS], intcow, intcol);
voidFindMine(charmine[ROWS][COLS], charboard [ROWS][COLS], intcow, intcol);

函数game.c


#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"voidNewBoard(charboards[ROWS][COLS], intcows, intcols, charset)
{
inti=0;
for (i=0; i<cows; i++)
    {
intj=0;
for (j=0; j<cols; j++)
        {
boards[i][j] =set;
        }
    }
}
voidPintBoard(charboards[ROWS][COLS], intcow, intcol)
{
inti=0;
printf("****** 扫  雷 ******\n");
for (i=0; i<=cow; i++)
    {
printf("%d ", i);
    }
printf("\n");
for (i=1; i<=cow; i++)
    {
intj=0;
printf("%d ", i);
for (j=1; j<=col; j++)
        {
printf("%c ", boards[i][j]);
        }
printf("\n");
    }
}
voidSetMine(charmine[ROWS][COLS], intcow, intcol)
{
intcount=EASY_HARD;
while (count)
    {
intx=rand() %cow+1;
inty=rand() %col+1;
if (mine[x][y] =='0')
        {
mine[x][y] ='1';
count--;
        }
    }
}
intGetmine(charmine[ROWS][COLS],intx,inty)
{
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');
}
voidFindMine(charmine[ROWS][COLS], charboard[ROWS][COLS], intcow, intcol)
{
intx=0;
inty=0;
intwin=0;
while (win<cow*col-EASY_HARD)
    {
printf("请输入坐标:>");
scanf("%d %d", &x, &y);
if (x>=1&&x<=cow&&y>=1&&y<=col)
        {
if (mine[x][y] =='1')
            {
printf("哈哈哈你被炸死了\n");
PintBoard(mine, ROW, COL);
break;
            }
else            {
//如果该坐标不是雷  统计周围的雷的数量intcount=Getmine(mine, x, y);
board[x][y] ='0'+count;
PintBoard(board, ROW, COL);
win++;
            }
        }
else        {
printf("非法坐标 ,重新输入\n");
        }
    }
if (win==col*cow-EASY_HARD)
    {
printf("恭喜你成功通关了\n");
    }
}

test.c测试逻辑文件


#define _CRT_SECURE_NO_WARNINGS 1
//扫雷  游戏
#include"game.h"
void menu()
{
  printf("************************\n");
  printf("****** 扫雷  游戏 ******\n");
  printf("****** 1.开始游戏 ******\n");
  printf("****** 0.退出游戏 ******\n");
  printf("************************\n");
}
void game()
{
  //建立数组   char类型方正数组   9*9棋盘  
  //为了方便判断两个棋盘是11*11的
  //在头文件中定义变量 ROW    COL    和  ROWS   COLS
  //发现的雷
  char board[ROWS][COLS] = { 0 };
  //布置好的雷
  char mine[ROWS][COLS] = { 0 };
  //初始化棋盘
  //board初始化全为'0'
  //mine初始化全为'*'
  //建立函数   定义函数   函数在game中实现
  //初始化函数名   NewBoard();
  NewBoard(board,ROWS,COLS,'*');
  NewBoard(mine, ROWS, COLS,'0');
  //打印棋盘
  PintBoard(board, ROW, COL);
  //布置雷
  SetMine(mine, ROW, COL);
  //这里下面  打开透视
  //PintBoard(mine, ROW, COL);
  //排查雷
  FindMine(mine, board,ROW, COL);
}
int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));
  do 
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      printf("游戏开始\n");
      game();
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("输入错误,重新选择\n");
      break;
    }
  } while (input);
    return 0;
}

四、感谢阅读


如这篇博客对大家有帮助的话,希望 三连 支持一下 !!!

如果有错误感谢大佬的斧正

如有 其他见解发到评论区,一起学习 一起进步。

目录
相关文章
|
1天前
|
C语言
C语言期末习题之数组逆序存放
C语言期末习题之数组逆序存放
8 0
TU^
|
1天前
|
存储 C语言
C语言实现扫雷游戏
扫雷游戏是一款十分经典的游戏,运用到C语言中的数组,循环和条件语句,随机数的生成,函数,递归等知识点。
TU^
15 1
|
1天前
|
存储 算法 搜索推荐
C语言数组
C语言数组
9 3
|
1天前
|
存储 C语言
c语言数组的概念与使用
c语言数组的概念与使用
8 1
|
2天前
|
人工智能 C语言
c语言:初步实现扫雷游戏
c语言:初步实现扫雷游戏
13 0
|
2天前
|
存储 C语言
Leetcode—— 删除排序数组中的重复项——C语言
Leetcode—— 删除排序数组中的重复项——C语言
【C语言】函数递归实现——扫雷小游戏(详细步骤)
【C语言】函数递归实现——扫雷小游戏(详细步骤)
【C语言】函数递归实现——扫雷小游戏(详细步骤)
|
3天前
|
编译器 C语言 C++
c语言常见字符函数、内存函数(详讲)
c语言常见字符函数、内存函数(详讲)
TU^
|
1天前
|
C语言
C语言内存函数和字符串函数模拟实现
C语言内存函数和字符串函数模拟实现
TU^
8 0
|
1天前
|
C语言
c语言内存函数
c语言内存函数
8 0