要用代码实现一个扫雷游戏也需要写两百多行代码,也是一个不小的工程量了,所以为了逻辑更加清晰明了,我们还是和写三子棋游戏一样创建3个文件来写代码。
1个头文件(game.h),2个.c文件(game.c和test.c)。
game.h文件中主要还是写一些预处理信息、一些需要用到的现有的函数的头文件和自定义函数的声明。

#define _CRT_SECURE_NO_WARNINGS 1
//地雷的总数
#define COUNT 10#define ROW 9//扫雷的行数
#define COL 9//扫雷的列数#define ROWS ROW+2//需要创建的二维数组的行数
#define COLS COL+2//需要创建的二维数组的列数#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h>//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col, int count);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

用#define定义扫雷的行数和列数以及地雷的总数,以便于我们以后要修改数据的时候只需修改#define后面的数据就可以了,而不至于把代码全改一遍。

game.c文件中也还是主要写game.h中自定义函数的具体定义。

#include"game.h"
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("--------------扫雷游戏----------------\n");for (i = 0; i <= row; i++)printf("%d ", i);printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("--------------扫雷游戏----------------\n");
}
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col,int count)
{while (count){int x = rand() % ROW + 1;int y = rand() % COL + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}
//计算该坐标周围8个坐标存在的总雷数
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{int i = 0;int sum = 0;for (i = x - 1; i <= x + 1; i++){int j = 0;for (j = y - 1; j <= y + 1; j++){sum += mine[i][j];}}return sum - 9 * '0';
}
//判断周围雷的数量为0的坐标周围雷的存在情况,实现扫雷中的展开一片现象
void JudgeAround(char mine[ROWS][COLS],char show[ROWS][COLS], int x, int y)
{int i = 0;int j = 0;for (i = x - 1; i <= x + 1; i++){for (j = y - 1; j <= y + 1; j++){if (show[i][j] != ' '&&i!=0&&i!=ROWS-1&&j!=0&&j!=COLS-1){int count = GetMineCount(mine, i, j);show[i][j] = count + '0';if (show[i][j] == '0'){show[i][j] = ' ';JudgeAround(mine, show, i, j);}}}}
}
//计算剩下未知坐标的数量,当其等于雷的总数时表示扫雷成功
int Remain(char show[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;int count = 0;for (i = 1; i <= row; i++){for (j = 1; j <= col; j++){if (show[i][j] == '*')count++;}}return count;
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int ret = 0;while (ret!=COUNT){printf("请输入要排查的坐标:>");int x = 0;int y = 0;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);break;}else{//不是雷,统计该坐标周围雷的个数int count = GetMineCount(mine, x, y);show[x][y] = count + '0';//存放的是数字字符if (show[x][y] == '0')//如果该坐标周围雷的数量为0{show[x][y] = ' ';JudgeAround(mine, show, x, y);}system("cls");DisplayBoard(show, ROW, COL);}}else{printf("坐标非法,请重新输入!\n");}ret = Remain(show, ROW, COL);}if (ret==COUNT){printf("恭喜你,排雷成功!\n");DisplayBoard(mine, ROW, COL);}
}

打印棋盘的时候把横纵坐标打印出来,让玩家更好的知道自己想排的雷的坐标。这其中我觉得模仿扫雷游戏中展开一片(当该坐标周围都没有雷时会展开一大片)的函数比较难写,这其中用到了函数递归,还需要判断边界问题,值得我们大家取好好思考。

test.c文件中就主要写扫雷游戏的主体代码。

#include"game.h"
//菜单
void menu()
{printf("|----------------------|\n");printf("|        1.play        |\n");printf("|        0.exit        |\n");printf("|----------------------|\n");
}
//扫雷游戏的实现
void game()
{char mine[ROWS][COLS];//存放布置好的雷的信息char show[ROWS][COLS];//存放排查出的雷的信息//初始化棋盘InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');//打印棋盘//DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);//布置雷SetMine(mine, ROW, COL, COUNT);//DisplayBoard(mine, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);
}int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:system("cls");game();//扫雷游戏的实现break;case 0:printf("退出游戏!\n");break;default:printf("选择错误,请重新选择!\n");break;}} while (input);return 0;
}

值得注意的是我们用于存放棋盘信息的二维数组需为char型的二维数组,因为刚开始没有排雷的时候我们向玩家展示的应该是全部都为*的棋盘,不能用int型的二维数组存放。

这个代码写出的扫雷游戏我觉得与电脑上的没什么区别了,没有任何bug,有兴趣的博友可以拷贝到自己的编译器里面玩一玩。

扫雷游戏代码+代码分析相关推荐

  1. python扫雷的代码及原理_基于Python实现的扫雷游戏实例代码

    摘要:这篇Python开发技术栏目下的"基于Python实现的扫雷游戏实例代码",介绍的技术点是"Python实现.Python.实例代码.扫雷游戏.扫雷.游戏" ...

  2. python扫雷游戏实验分析_用python写扫雷游戏实例代码分享

    扫雷是一个非常经典的WIN游戏,我们教给大家用python语言来写出这个游戏,以下是全部实例代码: #!/usr/bin/python #coding:utf-8 #python 写的扫雷游戏 imp ...

  3. 用c语言写扫雷游戏倒计时代码,课内资源 - 基于VS2013实现的扫雷小游戏

    1.任务概述 1.1 系统总体目标 本项目的目的在于开发一个扫雷软件,该软件面向游戏玩家用户,具有进行扫雷游戏的功能.游戏玩家将使用系统中的如下功能: 进行游戏 使用自定义游戏规格功能 使用计时器功能 ...

  4. python游戏脚本实例-基于Python实现的扫雷游戏实例代码

    本文实例借鉴mvc模式,核心数据为model,维护1个矩阵,0表无雷,1表雷,-1表已经检测过. 本例使用python的tkinter做gui,由于没考虑可用性问题,因此UI比较难看,pygame更有 ...

  5. C语言小项目 -- 扫雷游戏完整代码(递归展开 + 选择标记)

    大家好,今天我们将一起用C语言实现一个经典小游戏 – 扫雷,Let is go ! 文章目录

  6. python扫雷代码文件_基于Python实现的扫雷游戏实例代码

    # -*- coding: utf-8 -*- import random import sys from Tkinter import * class Model: ""&quo ...

  7. Java 实现经典扫雷游戏 Github代码

    使用Java GUI编写,有分等级.计分.计时.记录.自定义.自动扫雷.存档.读档等功能!                      GitHub地址:https://github.com/Power ...

  8. [安全攻防进阶篇] 一.什么是逆向分析、逆向分析应用及经典扫雷游戏逆向

    从2019年7月开始,我来到了一个陌生的专业--网络空间安全.初入安全领域,是非常痛苦和难受的,要学的东西太多.涉及面太广,但好在自己通过分享100篇"网络安全自学"系列文章,艰难 ...

  9. 一文教你从零开始设计并实现一个Java扫雷游戏

    背景:扫雷这款游戏有着很长的历史,从扫雷被开发出来到现在进行了无数次的优化,这款游戏变得越来越让人爱不释手了,简单的玩法在加上一个好看的游戏界面,每一处的细节都体现了扫雷的魅力.以JAVA语言作为开发 ...

  10. 用js脚本写的仿Windows7的扫雷游戏(高仿真)

    --------------------- 用jquery插件写的一个仿Windows7的扫雷游戏,代码完全公开,欢迎指正交流! 纯网页版,在网页中打开即能玩! 因为想不到太好的算法,可能效率没有wi ...

最新文章

  1. python pca降维_机器学习的降维打击
  2. 原生ajax crossO,Ajax问题,求助
  3. Ubuntu 16.04 更新源
  4. artTemplate-3.0
  5. jQuery+pjax简单示例汇总
  6. 机器视觉:嵌入式视觉系统中的接口
  7. log4j教程 11、日志记录到文件
  8. Volley(六 )—— 从源码带看Volley的缓存机制
  9. matlab幻方变换_幻方变换加密数字全息图
  10. 开氏温度与摄氏度换算_温度是怎么来的,有没有物质没有温度?
  11. bochs模拟器创建映像文件 、写入文件并启动
  12. 因子分析法之因子旋转
  13. Win10 设置默认语言
  14. 人生不过一场旅行,你路过我,我路过你
  15. Net-Speeder为OpenVZ加速
  16. 免费数据库及常用统计网址-数学建模(二十)
  17. CNN用于句子分类时的超参数分析
  18. 百度地图开发者使用教程
  19. svg配合css3动画_如何使用CSS制作节日SVG图标动画
  20. 基于蓝牙主控的智能门锁方案

热门文章

  1. 8.Python进阶_异常处理
  2. Spring框架之控制反转和依赖注入
  3. ASP.NET MVC系列 框架搭建(二)之仓储层的优化
  4. css 选择器的应用
  5. 文字布局(TEXT STYLE)标记(TAGS)
  6. C语言常量定义#define和const区别解析
  7. Java基本语句(注释语句、javadoc、System.out.print和println和printf区别)复习2
  8. Linux 更新 CPU microcode
  9. 打印网页去掉网址html,Print Edit WE插件,编辑\隐藏\删除网页元素,并支持保存和打印新页面...
  10. c语言多位数加减,两个超长正整数的加法