• 在上一篇文章中已经带大家如何搭建开发环境了

需求分析

  • 这里是一个8*8的地图

地雷随机分布数字表示周围一共有多少颗雷

数字1表示红色区域内有1课雷,2表示有两颗

如何显示数字


右上角没有如何判断呢?行加1或列加一不就越界了吗,所以为了帮面条件判断我们把8行8列改成10行10列

游戏实现

  • 先包含头文件

  • #include <SFML/Graphics.hpp>

  • #include <SFML/Audio.hpp>

  • 初始化窗口大小,就类似于我们要搭台唱戏一样,需要一个舞台这个舞台大小需要多大,我们需要指定一下舞台大小,不指定怎么知道需要多大的舞台呢?这就是初始化

  • 初始化窗口: RenderWindow window(VideoMode(800, 800), “Canxin-MINE”);

  • RenderWindow window(VideoMode(窗口宽度,窗口高度),“窗口右上角的描述信息”);
    宽为x坐标,高为y坐标;

  • 获取当前鼠标点击的x坐标和y坐标

  • Vector2i pos = Mouse::getPosition(window);

  • 我们要把鼠标的x坐标和y坐标转化成行和列,就需要鼠标的x坐标除以方块的像素宽度,y坐标也是一样

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <time.h>using namespace sf;#define SIZE 10      //地图宽度enum {NONE_MINE = 0,MINE = 9, //地雷GROUND,  //地面FLAG     //旗帜
};enum {SUCCESS,FAILURE,GOING
};int unitSize = 64;
int mineData[SIZE + 2][SIZE + 2];  // 0:没有雷 9:有雷(以避免和雷的数字提示混淆)
int showData[SIZE + 2][SIZE + 2];
int mineCount = 0;bool success_flag = false;
bool failure_flag = false;void initMine() {//布雷for (int i = 1; i <= SIZE; i++) {for (int j = 1; j <= SIZE; j++) {showData[i][j] = GROUND; // 设置为未点击状态(“地面”)//布雷if (rand() % 5 == 0) {mineData[i][j] = MINE;mineCount++;}else {mineData[i][j] = NONE_MINE;}}}// 计算雷周围位置的数字显示for (int i = 1; i <= SIZE; i++)for (int j = 1; j <= SIZE; j++){int n = 0;if (mineData[i][j] == MINE) continue;if (mineData[i + 1][j] == MINE) n++;if (mineData[i][j + 1] == MINE) n++;if (mineData[i - 1][j] == MINE) n++;if (mineData[i][j - 1] == MINE) n++;if (mineData[i + 1][j + 1] == MINE) n++;if (mineData[i - 1][j - 1] == MINE) n++;if (mineData[i - 1][j + 1] == MINE) n++;if (mineData[i + 1][j - 1] == MINE) n++;mineData[i][j] = n;}
}int check(RenderWindow* window) {int count = 0;for (int i = 1; i <= SIZE; i++) {for (int j = 1; j <= SIZE; j++) {if (mineData[i][j] == MINE && showData[i][j] == FLAG) {count++;continue;}else if (mineData[i][j] == MINE && showData[i][j] == MINE) {failure_flag = true;return FAILURE;}}}if (count == mineCount) {success_flag = true;return SUCCESS;}return GOING;
}int main()
{srand(time(0));RenderWindow window(VideoMode(800, 800), "Canxin-MINE");    //初始化窗口//加载图片Texture t;t.loadFromFile("images/tiles2.jpg");Sprite s(t);//布雷initMine();Texture t1, t2;t1.loadFromFile("images/victory.png");t2.loadFromFile("images/fail.png");Sprite spriteVictory(t1);Sprite spriteFail(t2);Sound soundOK;SoundBuffer buff1;buff1.loadFromFile("OK.wav");soundOK.setBuffer(buff1);Sound soundFail;SoundBuffer buff2;buff2.loadFromFile("bom.wav");soundFail.setBuffer(buff2);while (window.isOpen()){// 获取鼠标在游戏窗口内的位置坐标Vector2i pos = Mouse::getPosition(window);int x = pos.x / unitSize;int y = pos.y / unitSize;int ret = -1;Event e;while (window.pollEvent(e)){if (x <= 0 || x > SIZE || y <= 0 || y > SIZE) {break;}if (e.type == Event::Closed) //关闭窗口按钮window.close();if (e.type == Event::MouseButtonPressed) {if (e.key.code == Mouse::Left) showData[x][y] = mineData[x][y];else if (e.key.code == Mouse::Right) showData[x][y] = FLAG;ret = check(&window);}}// 清除屏幕window.clear(Color::Yellow);// 绘制雷区的各方块for (int i = 1; i <= SIZE; i++) {for (int j = 1; j <= SIZE; j++) {if (showData[x][y] == 9) showData[i][j] = mineData[i][j];s.setTextureRect(IntRect(showData[i][j] * unitSize, 0, unitSize, unitSize));s.setPosition(i * unitSize, j * unitSize);window.draw(s);}}//int ret = check(&window);if (success_flag) {spriteVictory.setPosition(250, 250);window.draw(spriteVictory);}if (failure_flag) {spriteFail.setPosition(250, 250);window.draw(spriteFail);}if (ret == FAILURE) {soundFail.play();}else if (ret == GOING) {soundOK.play();}// 刷新显示window.display();}//奇牛学院-残芯return 0;
}

百行代码手撸扫雷(下)c/c++相关推荐

  1. 200行代码手撸PageHelper分页插件

    一.pageHelper原理 mybatis 有个插件机制,可以支持外部应用进行任意扩展.它在启动的时候会将 interceptor[拦截器] 添加到mybatis的上下文中. pageHelper就 ...

  2. python写百行代码可运行_56 岁潘石屹学俩月 Python ,写下百行代码

    原标题:56 岁潘石屹学俩月 Python ,写下百行代码 By 超神经 内容导读:跨界王潘石屹在近期迷上了编程,不仅高调宣布学习 Python,拜老师,还隔三差五晒出自己的「编程课作业」,和网友进行 ...

  3. 猜猜乐游戏php源码,C/C++百行代码实现热门游戏消消乐功能的示例代码

    游戏设计 首先我们需要使用第三方框架,这里我使用的是sfml,不会使用sfml在我的上几篇文章当中-扫雷(上)有详细的开发环境搭建介绍 首先准备图片资源 一张背景图片,一张宝石图片 窗口初始化加载图片 ...

  4. php消消乐代码,C/C++百行代码实现热门游戏消消乐功能的示例代码

    游戏设计 首先我们需要使用第三方框架,这里我使用的是sfml,不会使用sfml在我的上几篇文章当中-扫雷(上)有详细的开发环境搭建介绍 首先准备图片资源 一张背景图片,一张宝石图片 窗口初始化加载图片 ...

  5. 鱼佬:百行代码入手数据挖掘赛!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:鱼佬,武汉大学,Datawhale成员 本实践以科大讯飞xData ...

  6. 基于Ganos百行代码实现亿级矢量空间数据在线可视化

    简介: 本文介绍如何使用RDS PG或PolarDB(兼容PG版或Oracle版)的Ganos时空引擎提供的数据库快显技术,仅用百行代码实现亿级海量几何空间数据的在线快速显示和流畅地图交互,且无需关注 ...

  7. Kaggle—So Easy!百行代码实现排名Top 5%的图像分类比赛

    北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文                        ...

  8. python图像分类代码_Kaggle—So Easy!百行代码实现排名Top 5%的图像分类比赛

    Kaggle-So Easy!百行代码实现排名Top 5%的图像分类比赛 作者:七月在线彭老师 说明:本文最初由彭老师授权翟惠良发布在公众号"七月在线实验室"上,现再由July重新 ...

  9. Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋

    Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋 写在前面 需要用到的工具包和参考 游戏设定 初始化 切换下棋方 判断五子连珠(核心) 鼠标点击流程事件 成品展示 打 ...

最新文章

  1. Linux挂载NTFS分区方法
  2. 浅谈产品的用户画像:它并不是万能的
  3. 用python 登录 ssh 与 sftp 通过证书登录系统
  4. 巧用css实现强制不换行、自动换行、强制换行(转)
  5. python3生成器类题目易错写法
  6. CSS3实现文字描边的2种方法
  7. python处理中文编码问题总结
  8. 为什么降雨还不凉快? —— 湿度
  9. char 与 unsigned char的本质区别(转)
  10. PAT A1007 动态规划
  11. Response.Redirect导致session丢失的解决办法
  12. 智慧医疗整体解决方案(图文)
  13. 即时通讯(IM)开源项目OpenIM本周版本发布-v1.0.6
  14. php设置个性域名,利用nginx泛域名解析配置二级域名和多域名,实现二级域名子站,用户个性独立子域名。...
  15. 生日在java中怎么写_怎样用java做个生日提醒?如果同一天有多个人过生日怎么做?...
  16. 模块学习3:PTC052A-200串口摄像头拍照等功能编写
  17. 基于微信小程序的毕业设计题目(36)PHP电影院售票小程序(含开题报告、任务书、中期报告、答辩PPT、论文模板)
  18. MediaCodec之Decoder
  19. 社交产品盈利方式产品模式设计案例
  20. Unreal Engin_Maya插件ArtV1_001初认Artv1创建一个带绑定的人物对其进行简单的设置

热门文章

  1. 太真实,北上广深年薪20W、30W、40W的程序员的生活状态!
  2. 家庭电脑虚拟机安装Linux,外网电脑无法远程控制的解决方法
  3. Jasper实现报表(Java)
  4. mysql删除列命令_MySQL删除列
  5. Linux下安装YASM--编译x264
  6. TableView下拉刷新崩溃
  7. github windows系统监控_你需要的:Windows | 精品软件集
  8. 微信小程序直播 OBS Studio 26.0.2 官方版推流软件
  9. 华硕笔记本键盘突然个别键失灵
  10. alisoft 开放旺旺SDK,我也来凑合一下