文章目录

  • 前言
  • 一、扫雷小游戏整体思路讲解。
  • 二、game.c各游戏功能函数的讲解
    • 1.InitBoard 初始化数组函数讲解
    • 2.DisplayBoard 打印格子函数讲解
    • 3.Setmine 电脑生成雷 函数讲解
    • 4.GetMineCount 格子表示周围雷的个数 函数讲解
    • 5.FindMine 排雷函数实现
    • game.c源代码展示:
  • 三.game.h 头文件代码展示
  • 总结

前言

在完成三子棋小游戏后(三子棋具体实现参考博主上一篇代码),相信我们一定对分模块完成代码,分别实现不用的功能的编程思想有了稍加深刻的理解与认识,接下来为了巩固与练习自己的思维,我们可以试着完成相对三子棋更加难一丢丢的扫雷小游戏,下面就和博主一起来完成扫雷游戏的代码实现把~

附上gitee地址(完整代码都已上传,需要的话可自行查阅):
https://gitee.com/yang-xinshang


一、扫雷小游戏整体思路讲解。

和三子棋小游戏一样。这次我们的代码依旧书写在 test.c (游戏整体实现思路), game.c(游戏功能函数实现),以及 game.h (代码用到的所有头文集,函数声明,符号定义存放位置)来书写我们的扫雷代码。
在进行扫雷小游戏整体思路讲解之前,我们先来看一看test.c 源代码:

在游戏代码实现开始前我们先要明确一个点:如果玩家选择的点在边界上,坚持周围是否有雷的时候数组就会出现越界,所以我们初始化棋盘(二维数组时应该多出一行一列),我们的扫雷不写太难,棋盘就定义为9x9二维数组,所以初始化时候就初始化成11x11的二位数组。(定义内容放在 game.h)文件中

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void meum()
{printf("********************************\n");printf("*********   1.play   ***********\n");printf("*********   0.exit   ***********\n");printf("********************************\n");}
void game()
{char mine[ROWS][COLS] = { 0 }; //存放雷的信息char show[ROWS][COLS] = { 0 };// 存放排查出的雷的信息// 初始化棋盘InitBoard(mine, ROWS, COLS,'0' );InitBoard(show, ROWS, COLS,'*' );DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);Setmine(mine, ROW, COL);FindMine(mine,show, ROW, COL);}int main()
{srand((unsigned int)time(NULL));int input = 0;do{meum();printf("请选择:\n");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}

这里我们可以看到游戏整个流程大致是这样的:
先用do…while语句实现游戏功能的选择循环实现,并定义出菜单meum()函数将其打印,接下来就是重点游戏函数的实现,放在 game.c文件中。

二、game.c各游戏功能函数的讲解

1.InitBoard 初始化数组函数讲解

代码如下:

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

在这里我们将游戏数组(mine)初始化全为 0 ,展现数组(show)初始化全为 * 。

2.DisplayBoard 打印格子函数讲解

代码如下(示例):

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;printf("-----------------------------\n");for (i = 0; i <= 9 ; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){int j = 0;printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("-----------------------------\n");}

在这里将上面初始化好的数组(格子)打印出来,并且打印上每行每列的坐标,注意横纵坐标从1开始,方便玩家输入坐标,并且打印上分割线。

3.Setmine 电脑生成雷 函数讲解

看代码:

void Setmine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1; // 1-9int y = rand() % col + 1;if (board[x][y] != '1'){board[x][y] = '1';count--;}}
}

EASY_COUNT是我们定义出来的雷的个数,为10个。这里随机数生成方面和三子棋类似(方法具体讲解参考上文),注意的是我们要的是1-9之间的数字,所以在随机数子生成后加1。 雷以 ‘1‘ (字符1)的形式放在格子中。

4.GetMineCount 格子表示周围雷的个数 函数讲解

代码如下:

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return (mine[x][y - 1] + mine[x][y + 1] + mine[x - 1][y] + mine[x + 1][y] + mine[x - 1][y - 1] + mine[x + 1][y + 1] + mine[x + 1][y - 1]) + mine[x + 1][y + 1] - 8 * '0';
}

这里把周围坐标正确表示即可计算。需要注意一个知识点: eg. ‘3’-‘0’=3 字符3-字符0=数字0,以此类推。

5.FindMine 排雷函数实现

代码如下:

void FindMine(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) //一共10个雷,71个空格子,排出即获胜。{printf("请输入你要排查的坐标: ");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾,游戏失败\n"); //踩雷DisplayBoard(mine, ROW, COL); //打印出看结果}else{int count = GetMineCount(mine, x, y);show[x][y] = count + '0'; //空格子计数周围雷DisplayBoard(show, ROW, COL);win++; //排出一个win自增1}}else{printf("坐标非法,请重新输入\n");}}if (win == row*col - EASY_COUNT){printf("恭喜你!排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

需要注意的点在代码中注释展示。

game.c源代码展示:

下面放上整个game.c源代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;printf("-----------------------------\n");for (i = 0; i <= 9 ; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){int j = 0;printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("-----------------------------\n");}void Setmine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1; // 1-9int y = rand() % col + 1;if (board[x][y] != '1'){board[x][y] = '1';count--;}}
}int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return (mine[x][y - 1] + mine[x][y + 1] + mine[x - 1][y] + mine[x + 1][y] + mine[x - 1][y - 1] + mine[x + 1][y + 1] + mine[x + 1][y - 1]) + mine[x + 1][y + 1] - 8 * '0';
}void FindMine(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 (mine[x][y] == '1'){printf("很遗憾,游戏失败\n");DisplayBoard(mine, ROW, COL);}else{int count = GetMineCount(mine, x, y);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);win++;}}else{printf("坐标非法,请重新输入\n");}}if (win == row*col - EASY_COUNT){printf("恭喜你!排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

三.game.h 头文件代码展示

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define EASY_COUNT 10#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2void InitBoard(char board[ROWS][COLS], int row, int col, char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void Setmine(char board[ROWS][COLS], int row,int col);
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);
int GetMineCount(char board[ROWS][COLS], int x, int y);

这里放上整个项目需要用到的头文集以及函数声明,符号定义即可。(分开书写能使代码风格整体良好)


总结

以上就是整个扫雷游戏的实现思路以及源代码,欢迎大家指正~
以上就是今天要讲的扫雷小游戏实现,本文仅仅简单介绍了简单的扫雷小游戏,然而依旧还有更多的功能等待大家去实现,欢迎大家补充讨论!

如果觉得文章对自己有帮助,欢迎大家多多点赞评论,跪谢!!!

用C语言实现扫雷小游戏(附上思路+项目展示+源代码)相关推荐

  1. 用C语言实现三子棋游戏(附上思路+项目展示+源代码)

    文章目录 前言 一.三子棋游戏整体实现思路 二.实现步骤 分模板实现 (以及具体应用实列) 1.test.c 源文件讲解: 2. game.c 源文件讲解: 3.game.h 源文件讲解 三 game ...

  2. 用C语言实现 静态通讯录+动态通讯录+文件实现“退出保存信息版本”(附上思路+项目展示+源代码)

    前言 : 在生活中我们经常会遇到通讯录的使用,比如存进一个新的联系人的信息,或者对其删除,修改,查找:那这些神奇的功能是如何实现的?我们不禁好奇.今天,这篇博文将教会大家实现一个静态的或者动态的通讯录 ...

  3. c语言字符游动程序,C语言实现扫雷小游戏详解

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 一.实现功能 首先显示一个小菜单,选择是否玩游戏.当用户选择退出时,程序运行结束,当用户选择玩游戏时,将提示用户输入扫雷位 ...

  4. 只用c语言不用图片的游戏,使用C语言实现扫雷小游戏

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 游戏规则 在一个9*9的地图上一共有十个雷,翻开所有不是雷的位置 游戏即为胜利, 如果踩到雷,游戏结束 设计思路 1.创建 ...

  5. 【C语言】扫雷小游戏详解

    [C语言]扫雷小游戏详解 前言: 还记得大明湖畔的夏雨荷,电脑课上的扫雷吗? ---------------------------是 他 吗--------------------------- 没 ...

  6. C语言实现扫雷小游戏 纯小白 非黑窗口

    C语言实现一个普通的扫雷小游戏 纯小白所编(含代码非黑窗口!) 扫雷 主要功能 1.创建一个图形界面 2.了解扫雷游戏的原理 3.随机生成雷的位置 4.为整个数组加密,并在雷周围的位置加一 5.导入图 ...

  7. 用c语言实现扫雷小游戏。

    相信小伙伴在学习c语言的时候想做一些小趣事,下面就是用c语言来实现一个扫雷小游戏,不过是简单的实现扫雷(只是通过数组的方式来实现),适合新手学习. 我用的是vs敲的这个代码,大家可以用vs运行(可能有 ...

  8. C语言实现扫雷小游戏(排雷时可展开)

    游戏介绍 扫雷想必大家都听说过吧?我们今天写的小游戏就是扫雷,只不过我们只使用C语言写.我们能够做到的就是实现扫雷的基本逻辑,没有图形化界面. 源代码 这次游戏程序的写法和上一次的三子棋的模式很像,也 ...

  9. C语言编写扫雷小游戏

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992377 扫 ...

最新文章

  1. 陶哲轩实分析 习题 13.4.6
  2. python集合类型的四种操作符_深入解析Python中的集合类型操作符
  3. ITK:将真实和虚构图像转换为复杂图像
  4. 数据分析——朴素贝叶斯原理示意图
  5. 关于抢红包的_关于抢红包的话题800字作文
  6. c语言最简单的程序编写,C语言简单程序编写.doc
  7. 基础知识(五)对齐变换相关函数
  8. 让数据库支持SQL 2005 CLR 的必要条件
  9. 10-10-020-简介-kafka的ZK上面的存储
  10. 初探12306售票算法(一)- 理论
  11. 今天研究成功ASP动态管理数据表及字段
  12. Java后台基础设施
  13. 怎么在HTML图片中加文字,html+css怎么在图片上添加文字
  14. 从零开始学习音视频编程技术(十三) 录屏软件开发之屏幕录像
  15. SQLMap常用命令介绍
  16. ES6学习——新的语法:Temporal Dead Zone(TDZ)
  17. OceanBase数据库 OBCA考试认证通过感言
  18. S-SDLC(Secure Software Development Lifecycle) 安全编码规范
  19. 理想倍频器/分频器对相噪/杂散的影响
  20. 当“气象+”遇到水文——技术篇

热门文章

  1. 决策树算法之cart剪枝
  2. 计算机网络-物理层设备
  3. 计算机视觉还能撑多久?
  4. 如何具体学习计算机视觉
  5. OpenCV中的透视变换介绍
  6. java中的关键字static(静态变量)和final定义常量
  7. JPA(七):映射关联关系------映射双向多对一的关联关系
  8. CentOS7关闭防火墙
  9. 在Ubuntu14.04安装F.lux
  10. 分层PHP性能分析工具--xhprof