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

需求分析

  • 这里是一个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. Jscript 随记
  2. 微信小程序 - this.triggerEvent()
  3. c3p0数据库连接池+mysql数据库基本使用方法
  4. 数据库事务的介绍和使用
  5. linux网络共享文件夹,[Linux] - Windows与Linux网络共享文件夹挂载方法
  6. python虚拟环境管理工具_Python虚拟环境和包管理工具Pipenv的使用详解--看完这一篇就够了...
  7. python分布式对象存储_推荐:一款分布式的对象存储服务
  8. 测试基础-06-测试计划编写
  9. 【VMCloud云平台】SCDPM(四)如何保护数据库(一)
  10. ffmpeg将视频流转化成图片帧,将图片帧转化为视频(基本无损)
  11. php微博自动评论,新浪微博自动评论工具
  12. android 添加文件打开方式
  13. Mini-USB接口的引脚定义与USB与miniUSB接口区别
  14. android targetsdkversion 版本 调低,targetSdkVersion 更改的问题
  15. h5单页,微信浏览器唤醒APP
  16. 公司MES项目现场落地实施总结
  17. Array 属性和方法
  18. MySQLdb._exceptions.OperationalError: (1045, “Access denied for user ‘root‘@‘localhost‘ (using passw
  19. mysql inner join 链接三个或多个表
  20. react-sortablejs 实现自定义表单设计

热门文章

  1. 如何用CNN玩转AlphaGo版的五子棋?
  2. 接上个文章(mzsock
  3. uni-app学习路线与建议
  4. 「MacTeX 小笔记」准备篇
  5. 微信小程序如何获取用户绑定手机号
  6. 免费!中文!10个最佳Python学习网站推荐
  7. 【回文串问题】分割回文串
  8. PPP、PPPOE、PPTP、L2TP应用场合
  9. Dev-C++ 中t添加EasyX绘图库
  10. 常用文本编辑器(NotePad++,UtraEdit)