前言

利用C/C++实现简易版扫雷,扫雷,一款很多人都玩不明白的游戏,其实这个游戏原理很简单,就是通过你的第一次下坐标排雷(大概率不会被炸死)来说明周围有几颗雷,就是你所下坐标的周边八个位置,1表示有一颗雷,2表示有两颗,以此类推。

看到这里可能有的同学已经知道怎么玩这个小游戏了,我这里把游戏获胜的图放出来

说了这么多总算是到今天的主角出场了:利用简单的C/C++写出这个小游戏

实现思路

将雷区看作一个n行m列的二维数组,将雷埋在实际雷区中,将玩家输入的坐标与实际雷区中的坐标进行比较,坐标相同则视为踩雷,游戏结束;若不同则视为此坐标排雷成功,通过函数计算出周围雷的数量并将值其赋给镜像雷区,输出给玩家看,起到提示作用,最终通过函数与最开始的预计安全位进行比较,若相等则判定玩家胜利,游戏结束。 所以大概游戏流程为:打印菜单——选择开始——初始化雷区——布置雷——玩家输入坐标——排查雷——结束游戏

同昨天的三子棋一样,使用三个文件,即6_9.c、game2.c、game2.h

文件概述

6_9.c

程序主体,包含main函数、game函数及menu函数,其中srand函数值得注意

game.c

这个源文件主要是实现game函数中的各种功能函数,如初始化雷区函数Rec_board、打印雷区函数Put_board、放置雷函数Put_Boom、判断周围雷数量函数find_boom_num及排雷函数Find_Boom

game.h

自定义的头文件,里面包含了各种声明、各种变量宏定义及各种函数定义

在正式开始之前还是先说明下实际雷区镜像雷区实际雷区就布置雷用的数组,而镜像雷区是给玩家看的数组,两个雷区各司其职,以确保程序正常运行,实际雷区镜像雷区除内容外其他完全一致!

代码

6_9.c

#define _CRT_SECURE_NO_WARNINGS 1//屏蔽“scanf 4996”问题#include"game2.h"//stdio.h包含于此void menu(){printf("\n$$$$$$$$$$$$$$$$$$$$$$\n");printf("$$$$$$  1.Paly  $$$$$$\n");printf("$$$$$$  0.Exit  $$$$$$\n");printf("$$$$$$$$$$$$$$$$$$$$$$\n\n");}//菜单void game(){char mine[ROWS][COLS] = { 0 };//定义数组char show[ROWS][COLS] = { 0 };Rec_board(mine,ROWS,COLS,'0');//初始化实际雷区为'0'Rec_board(show, ROWS, COLS, '*');//初始化镜像雷区为*//Put_board(mine, ROW, COL);//测试用Put_board(show, ROW, COL);//打印镜像雷区//布置雷Put_Boom(mine, ROW, COL);//Put_board(mine, ROW, COL);//开挂用//排查雷Find_Boom(mine, show, ROW, COL);}//游戏本体int main(){srand((unsigned int)time(NULL));//通过time获取当前时间戳和srand配合,生成随机数int input = 0;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;}

game2.c

#define _CRT_SECURE_NO_WARNINGS 1//屏蔽4996问题#include"game2.h"int i = 0;int j = 0;void Rec_board(char board[ROWS][COLS], int rows, int cols, char set){for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}//棋盘默认为11*11规格,但只用9*9的大小,其他防止寻找周围雷数时越界!}//初始化雷区,set是雷区或镜像雷区所需要的值,有可能是'0'或*void Put_board(char board[ROWS][COLS], int row, int col){printf("-------扫雷-------\n");for (j = 0; j <= col; j++)//打印纵坐标printf("%d ", j);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 Put_Boom(char board[ROWS][COLS], int row, int col){int count = Boom;int i = 0;while (count){int x = rand() % row + 1;//+1是因为,要用到1到9的雷区,如果不+1,只能得到0到8的雷区int y = rand() % col + 1;//同理if (board[x][y] == '0'){board[x][y] = '1';// '1'代表雷count--;//布置成功一颗 -1}//只有雷布置成功了。count才--,才能跳出while}}//放置雷int find_boom_num(char board[ROWS][COLS], int x, int y){return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + board[x][y - 1] + board[x][y + 1] + board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1] - 8 * '0';}//判断周围有几颗雷void Find_Boom(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){int count = 0;//记录周边雷数while (count < row * col - Boom){int x = 0;int y = 0;int input = 0;printf("请输入一个坐标用以排雷:>");scanf("%d %d", &x, &y);if (mine[x][y] == '1'){printf("\n扫雷失败,你被炸死了!\n");Put_board(mine, ROW, COL);printf("\n\n\n请选择是否重新开始\n\n\n");break;}//失败情况else if (mine[x][y] != '1'){int num = find_boom_num(mine, x, y);show[x][y] = num + '0';Put_board(show, ROW, COL);count++;}//成功情况,主要是获取周围雷数,然后将其赋给镜像雷区if (count == row * col - Boom){printf("\n恭喜排雷成功!\n");Put_board(show, ROW, COL);}//排雷成功的情况}}

game2.h

#pragma once//自定义头文件自己生成的#include<stdio.h>#include<stdlib.h>//srand和rand的头文件#include<time.h>//time函数的头文件#define ROW 9//宏定义行#define COL 9//宏定义列#define ROWS ROW+2//“缓冲区”#define COLS COL+2//“缓冲区”#define Boom 10//宏定义雷数void Rec_board(char board[ROWS][COLS], int rows, int cols, char set);//初始化雷区和镜像雷区void Put_board(char board[ROWS][COLS], int row, int col);//主要打印镜像雷区,实际雷区处于隐藏状态void Put_Boom(char board[ROWS][COLS], int row, int col);//放置雷void Find_Boom(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);//排查雷

代码实现页面

这是个代码间的关系

这是初始运行页面

首次坐标输入界面

一不注意就被炸死了

扫雷成功界面,不建议用9*9的盘玩,因为界面、功能不完善,很难获胜

因为行ROW和列COL是全局宏定义的变量,因此可以轻而易举的更改达到扩大雷区的效果

在这里更改

看看5*5超小页面

总结

扫雷游戏跟三子棋游戏本质上是一样的,都有三个必要条件初始化棋盘(雷区)、玩家输入坐标、电脑生成随机坐标。回看整个代码,无非就是各种函数模块的拼接,难点也不过是理解数组内元素的比较与更换,总的来说,这些小游戏都是提前练手的好选择,在成为大牛的路上努力,加油吧!各位同学!

鸣谢

感谢比特鹏哥关于扫雷两个小时的讲解!

扫雷——Windows上的经典小游戏相关推荐

  1. Windows经典小游戏--扫雷精装版

    Windows经典小游戏–扫雷精装版 最开始玩的电脑游戏就是蜘蛛纸牌和扫雷了,那时候觉得很神奇的事情现在自己也可以做了.下面就展示一下C语言扫雷的代码. 首先创建一个"扫雷"的项目 ...

  2. python拼图游戏代码_GitHub 上哪些勾起回忆的经典小游戏(Python)

    经常有人问我 Python 能开发游戏吗?今天就直接给大家推荐一个汇集多款经典小游戏的Github项目:Free Python Games. 项目地址:grantjenks/free-python-g ...

  3. 【Devc++】8款经典小游戏

    我在CSDN网站上收集了8款c++经典小游戏 1.贪吃蛇 /************************贪吃蛇***********************/ /***************** ...

  4. C语言实训——经典小游戏马里奥开发day 1

    C语言实训--经典小游戏马里奥开发day 1 卷轴式地图 一.关于卷轴式地图 ​ 在之前的开发尝试之中,我曾经使用的是地图移动但是马里奥保持在一个固定的点来实现马里奥的移动,但是我发现了几个问题: 1 ...

  5. 经典小游戏(密室逃脱全集+答案)

    经典小游戏--密室逃脱全集(有答案) 转自月影梦魇原来玩过的一个小游戏 最近想起来想发给大家玩一下   有一点小难度的哦   看谁可以出得来密室   一共有三个密室 这三个游戏是有一点相连的 蓝色房间 ...

  6. C#winform 经典小游戏贪吃蛇V1.0(一)

    关于V1.0   为什么我给这个版本定义为V1.0嘞,因为在这个版本中仅仅实现了蛇的自动行进,按键对蛇的行进方向的操作和吃掉食物蛇身的增长等操作. 但是任何事情都必须一步一步来,当我们完成这个乞丐版的 ...

  7. c++编写手机小游戏代码_经典小游戏大集合(C++ 源码)

    [实例简介] 五子棋 贪吃蛇 俄罗斯方块 黑白棋 连连看 推箱子 扫雷等7个小游戏 C++源码 VC6.0 下编译运行. [实例截图] [核心代码] 经典小游戏大集合(C源码) └── 经典小游戏大集 ...

  8. Java Swing 经典小游戏《飞机大战》———— (四)碰撞检测 游戏状态与得分 玩家升级

    前期回顾 Java Swing 经典小游戏<飞机大战>---- (一)获取素材,创建窗口,添加滚动背景,双缓冲 Java Swing 经典小游戏<飞机大战>---- (二)玩家 ...

  9. 一行Python一行代码制作20款经典小游戏

    今天分享一个有趣的Python游戏库freegames,它包含20余款经典小游戏,像贪吃蛇.吃豆人.乒乓.数字华容道等等,依托于标准库Turtle. 我们不仅可以通过1行代码进行重温这些童年小游戏,还 ...

  10. 树莓派可以玩linux游戏吗,如何在树莓派上玩经典PC游戏

    Raspberry Pi提供了令人难以置信的游戏和其他软件库.您可能知道它为模拟其他平台奠定了良好的基础,但是您知道它可以运行复古的PC软件吗? 在Windows之前,就有MS-DOS.可以通过几种不 ...

最新文章

  1. Pytorch中的序列化容器-度消失和梯度爆炸-nn.Sequential-nn.BatchNorm1d-nn.Dropout
  2. Android 中文 API (93) —— BaseExpandableListAdapter
  3. 科大讯飞回应同传造假:人机耦合才是未来发展之道
  4. sublime 关闭自动更新
  5. 【Flink】Flink的 processingTimeTimersQueue 是如何注册数据的
  6. J2EE中使用MediaInfo库获取视频信息
  7. phpStorm使用技巧总结
  8. c++ 14 新特性
  9. 遗传算法详解 附python代码实现
  10. matlab遗传算法tsp程序,遗传算法解TSP问题的程序
  11. sql server分组排序
  12. 福建农林大学计算机分数线,福建农林大学录取分数线2021是多少分(附历年录取分数线)...
  13. linux shell 操作二进制文件(xxd、dd)
  14. lazy(懒加载)模式和异步加载模式详解
  15. OSError: [Errno 22] Invalid argument: 'C:\\Users\\83815\\Desktop\\result_0111\\1-11-kh-yd\\white\\n
  16. 2021-2027中国内部威胁管理(ITM)软件市场现状及未来发展趋势
  17. 致同:三年行动任务过半 国企改革务实发展
  18. 学习MRI成像的螺旋桨填充
  19. 大学课堂的N种老师类型
  20. 计算机机房搬迁复杂吗,盘点机房搬迁中最容易出现的五个问题

热门文章

  1. Express访问静态资源(express.static)
  2. BinarySerializer
  3. 看点视频解析去水印原理分析过程及源码,rowkey的秘密
  4. Win10 资源管理器导航栏设置
  5. ideaIU-2020.1安装步骤
  6. Tensorflow手写数字识别
  7. Python 代码库之Tuple如何append添加元素
  8. linux安装tailf 命令
  9. 使用PCtoLCD2002字模提取软件
  10. python 主函数传参_Python函数传参详解