【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;
}

四、感谢阅读


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

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

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

目录
相关文章
|
2天前
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
一文彻底搞明白C语言的数组
|
2月前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
206 6
|
2月前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
103 5
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
103 5
|
3月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
3月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
83 1
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
101 1
【C语言】函数递归实现——扫雷小游戏(详细步骤)
【C语言】函数递归实现——扫雷小游戏(详细步骤)
【C语言】函数递归实现——扫雷小游戏(详细步骤)
|
1月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
69 23
|
2天前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
10 1
一文彻底搞清楚C语言的函数