基于C语言实现简易的扫雷游戏

 更新时间:2022年06月06日 11:31:25   作者:东区东区!  
这篇文章主要为大家详细介绍了基于C语言实现简易的扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

对于C语言学习者来说,在完成C语言初级学习之后,扫雷游戏是一个很好的知识的总结和练习。

扫雷即在一个棋盘中,随机放入一定数量的雷,玩家通过输入坐标,得到坐标上的信息(以此点为中心四周8个格子内地雷数量的总和),来判断此格子是否有地雷,从而依照此法排查出整个棋盘上所有的地雷。

本项目采用9*9的棋盘,放入地雷的数量可以依照个人设置。

首先声明总的头文件

#ifndef _UTILI_H_
#define _UTILI_H_
 
#include<stdio.h>
#include<time.h>   //后面需要地雷的随机放置,需要时间函数
 
#endif /* _UTILI_H_ */

接下来我们需要对整个项目所有需要用的函数进行声明,放置在一个头文件中:

#ifndef _GAME_H_  //条件编译
#define _GAME_H_
 
#include"utili.h"
 
#define QUIT 0    //0退出 1 进入游戏
#define GAME 1
 
#define ROW 9    //定义9*9的扫雷界面
#define COL 9
#define ROWS ROW+2  //左右两边加1行1列,为了统计周围雷个数
#define COLS COL+2
 
#define GAME_LEVEL 20
 
void InitBoard(char board[ROWS][COLS], char set);    //设置界面
void DisplayBoard(char board[ROWS][COLS], int row, int col);   //展示界面
 
void SetMine(char mine[ROWS][COLS], int row, int col);   //设置雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);  //找雷
 
void StartGame();
 
#endif /* _GAME_H_ */

整个游戏各个部分功能进行编写代码,分别实现不同的功能:

#include"Game.h"
 
void InitBoard(char board[ROWS][COLS], char set)   //初始化棋盘,在后台执行扫雷任务时
{
    for(int i=0; i<ROWS; ++i)                  //实际上是在11 * 11 的棋盘 上进行的          
    {
        for(int j=0; j<COLS; ++j)
        {
            board[i][j] = set;
        }
    }
}
 
void DisplayBoard(char board[ROWS][COLS], int row, int col)  
{
    for(int i=0; i<=row; ++i)    //在界面显示时,我们的棋盘实际展示的时9 * 9的界面
    {
        printf("%d ", i);
    }
    printf("\n");
 
 
    for(int i=1; i<=row; ++i)
    {
        printf("%d ", i);
        for(int j=1; j<=col; ++j)
        {
            printf("%c ", board[i][j]);
        }
        printf("\n");
    }
}
 
void SetMine(char mine[ROWS][COLS], int row, int col)
{
    int count = GAME_LEVEL;
    srand(time(0));             //通过随机数获得棋盘上随机的地雷放置
    while(count)
    {
        int x = rand() % row + 1; //1 ~ ROW     //取余,保证放置在棋盘内
        int y = rand() % col + 1; //1 ~ COL
        if(mine[x][y] == '0')
        {
            mine[x][y] = '1';             //有地雷的格子内0被赋值为1,但注意这个1为字符
            count--;
        }
    }
}
 
int GetMineCount(char mine[ROWS][COLS], int x, int y)   //获得以格子为中心周围8个格子地雷数
{
    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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int win = 0;
    int x, y;
    while(win < row*col-GAME_LEVEL)   //判断赢的条件
    {
        printf("请输入要排雷的位置:>");
        scanf("%d %d", &x, &y);
 
        if(x<1||x>row || y<1 || y>col)
        {
            printf("输入的排雷位置非法,请重新输入.....\n");
            continue;
        }
 
        if(mine[x][y] == '1')
        {
            printf("很遗憾,你被Over.\n");
            DisplayBoard(mine, ROW, COL);
            break;
        }
 
        //统计雷的个数
        int count = GetMineCount(mine, x, y);
        show[x][y] = count + '0';
 
        system("cls");
        DisplayBoard(show, ROW, COL);
 
        win++;
    }
 
    if(win >=  row*col-GAME_LEVEL)
    {
        printf("恭喜你,排雷成功.\n");
    }
}
 
void StartGame()
{
    //定义棋盘
    char mine[ROWS][COLS];
    char show[ROWS][COLS];
 
    //初始化棋盘
    InitBoard(mine, '0');
    InitBoard(show, '*');
 
    //埋雷
    SetMine(mine, ROW, COL);
 
    //显示棋盘
    DisplayBoard(show, ROW, COL);
 
    //扫雷
    FindMine(mine, show, ROW, COL);
}

编写主函数:

#include"Game.h"
 
int main(int argc, char *argv[])
{
    int select = 1;
    while(select)
    {
        printf("*************************************\n");
        printf("*          简 易 扫 雷 游 戏        *\n");
        printf("*************************************\n");
        printf("*             [1] Play              *\n");
        printf("*             [0] Quit              *\n");
        printf("*************************************\n");
        printf("请选择:>");
        scanf("%d", &select);
 
        if(select == QUIT)
            break;
 
        if(select != GAME)
        {
            printf("输入的操作有误,请重新输入......\n");
            continue;
        }
 
        //开始游戏
        StartGame();
    }
    printf("游戏结束,拜拜.\n");
    return 0;
}

代码在VS2015上正常执行,整个游戏过程没出现问题。

游戏还可以有许多改进的地方,如增加计时功能,点到附件无雷的格子时展示所有相邻的无雷格子等,后续还可以丰富完善。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++利用Socket实现主机间的UDP/TCP通信

    C++利用Socket实现主机间的UDP/TCP通信

    这篇文章主要为大家详细介绍了C++如何利用Socket实现主机间的UDP/TCP通信功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-01-01
  • C++用两个栈实现一个队列(面试官的小结)

    C++用两个栈实现一个队列(面试官的小结)

    这篇文章主要给大家介绍了关于C++用两个栈实现一个队列的相关资料,这是来自一名面试官的小结,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • 树形结构的3中搜索方式示例分享

    树形结构的3中搜索方式示例分享

    树的3中常见搜索方式,包括二叉树方式(每一层只有0和1)、满m叉树(每一层都有0 到m - 1)、子集树,也称为全排列树,需要的朋友可以参考下
    2014-02-02
  • C语言数据在内存中的存储详解

    C语言数据在内存中的存储详解

    本篇文章是C语言编程篇,主要为大家介绍C语言编程中数据在内存中存储解析,有需要的朋友可以借鉴参考下,希望可以有所帮助
    2021-09-09
  • 详解C++11中的线程锁和条件变量

    详解C++11中的线程锁和条件变量

    C++ 11允许开发者们以标准的、不依赖于平台的方式编写多线程程序。这篇文章概述了标准库对于线程和同步操作机制的支持。这些都是非常重要的知识,希望读者们可以认真看一下
    2021-06-06
  • C++实现栈与分析栈的知识点

    C++实现栈与分析栈的知识点

    这篇文章主要介绍了C++实现栈与分析栈的知识点,栈(stack)是计算机中常用的一种线性数据结构,经常有资料使用“操作受限”来形容栈,因为它的压入栈和弹出栈操作只能在栈顶进行,下文更多相关资料,需要的小伙伴可以参考一下
    2022-03-03
  • C/C++左旋字符串实现代码举例

    C/C++左旋字符串实现代码举例

    在C/C++语言中没有专门的字符串变量,通常用字符数组来存放字符串,下面这篇文章主要给大家介绍了关于C/C++左旋字符串实现的相关资料,需要的朋友可以参考下
    2023-12-12
  • C++左值和右值学习笔记

    C++左值和右值学习笔记

    这篇文章主要为大家介绍了C++左值和右值学习笔记的重点讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • C语言超详细讲解函数指针的运用

    C语言超详细讲解函数指针的运用

    函数指针是一个指针变量,它可以存储函数的地址,然后使用函数指针,下面这篇文章主要给大家介绍了关于C语言进阶教程之函数指针的相关资料,需要的朋友可以参考下
    2022-06-06
  • C++示例讲解观察者设计模式

    C++示例讲解观察者设计模式

    观察者模式是极其重要的一个设计模式,也是我几年开发过程中使用最多的设计模式,本文首先概述观察者模式的基本概念和Demo实现,接着是观察者模式在C++中的应用,最后是对观察者模式的应用场景和优缺点进行总结
    2022-12-12

最新评论