【开源项目】扫雷

说明

本项目部分思路参考了王桂林老师的项目课程,在此表示感谢。

项目地址:https://github.com/xiaoxi666/mines_sweeper

开发环境

  1. 开发工具:Qt5.6.1
  2. 开发语言:C++

技术要点

1.数据支撑

  • 由于数据在全局只有唯一一份,故设计为单例模式。默认布局也在这里设置(宽20,高15,雷数50)。
  • 关于布雷:随机算法,注意判断边界,如果确定此位置布雷(我用-1表示),其周围8个方向的数据均加1;
  • 关于游戏设置:
    • 游戏支持自己配置宽度和高度以及地雷数目,这里用到了两套数据,一个为配置数据域,一个为基本数据域,当我们设置成功后,需要转场,这时先删除旧的场景(这时用的是基本数据域),再创建新的场景(这时把配置数据传给基本数据域,就把基本数据域更新了),再把视图设置为当前场景即可;这里的数据传递很巧妙,注意体会;
    • 数据有效性检查利用QIntValidator类自动检查,省去不少功夫(我当前限制宽为1~30,高为1~19,雷数不能超过“宽*高”的一半);

2.图形框架及渲染

  • QGraphicsPixmapItem负责生成每个格子元素item;
  • 利用格子元素生成场景Scene;
  • 将Scene装进QGraphicsView视图中;
  • 注意坐标处理:
    • 视图和场景的坐标由框架自动处理,保证整体视图位于中心位置;
    • 鼠标点击寻找对应的格子元素,利用itemAt函数(注意此函数参数为int,因此无法做到太高精度,这也是整体画面限制大小的一个原因,另外一个原因是视觉的美观性);

3.自动寻路扩展

  • 如果点击的格子周围没有地雷,需要自动扩展,需要考虑两方面因素:一个是底层数据的扩展,一个是视图的扩展;
  • 两者均利用队列的思想实现,探寻周围8个方向的格子元素(底层数据)是否周围没有地雷,如果是的话就将其加入队列,不是的话翻开;需要加上标记表示其是否被翻开过,如果已经被访问过就不需要再加进队列了;
  • 根据基本数据的寻找方向,同步扩展指针坐标(相当于自动鼠标点击),找到对应的格子元素,再根据底层数据做相应操作;我当初想直接基于当前格子元素获取其周围的格子元素,但是没有找到方法,然后就模拟鼠标自动扩展了,欢迎指教;
  • 注意这里可能会出现画面缩放(虽然我最后限制了画面扩展减轻了负担),缩放时需要同步考虑鼠标指针的变换,必须是高精度(int不行,可以用double,但是经过测试雷数太多(大概50*30)的时候double也不够用,因为上层的itemAt函数参数为int);

4.各种标记的处理

  • 我们知道,游戏中有旗子,问号等标记,因此需要单独处理;自动寻路扩展时不会考虑旗子,但是会考虑问号,只要查询其状态再对应处理即可;

5.判赢和判输

  • 输比较好判断,只要点击到地雷,直接判输;
  • 判赢方式:用两个变量分别表示目前还没有被翻开的格子和目前已经标记的地雷数目,如果某时刻两个变量相等,则判赢;注意每次翻格子的时候检查一次即可(不用开多线程进行全局判断);

6.关于画面缩放

  • 我们的格子元素大小应该根据画面大小自动调整,但是我还没做这一点,初步想法是可以添加窗口变化事件,进行处理。现在为了美观,直接最大化了;

项目建立和打包发布

  • 选择Qt Widgets Application项目,添加需要的ui图形文件; 添加类文件;
  • 剩下的就是算法设计和各种事件的处理了;
  • 由于项目采用动态库构建,因此项目打包发布时需要加上各种dll,这里我们用qt自带打包工具windeployqt。具体步骤为(或者参见这里):
    • 将你编译出来的exe文件随意存在一个新的文件夹(名称不要带中文)
    • 用windows自带的cmd命令进入该文件夹,具体命令为:cd /d 你的文件夹路径
    • 执行命令:windeployqt 你的exe程序名
    • 之后你会发现文件夹里面已经自动包含了所需要的dll库
    • 注意!还需另外拷贝几个dll进去(因为好多人的电脑没有相关开发环境),这几个dll分别是:libgccsdw2-1.dll、libstdc++-6.dll、libwinpthread-1.dll,这时一般就没有问题了(如果还提示缺少dll,就自己下载放进去~)

与传统wndows扫雷程序的对比

  • 没有添加应用程序图标,有兴趣可以自己添加;
  • 没有加入步骤计数、时间、音乐,有兴趣可以自己添加;
  • 踩到雷即结束游戏,没有加入地雷连锁爆炸动画;
  • 左右键同时按下功能未实现(具体实现思路很简单:用两个标记位分别标记左右键是否处于按下状态,两者同时为真的时候,进一步检查标记旗,符合要求就打开);
  • 目前三个难度选择未实现,但是可以自己配置宽高以及雷数,选择性更大;
  • 关于随机算法与布局:
    • windows系统自带的程序:随机算法偏弱,但是布局算法更胜一筹,各种数字出现几率更大;
    • 自己开发的程序:随机算法偏强,因此布局算法偏弱,有些大的数字出现几率相对小一点。

附件

  • 源码可以在github下载(里面包含了windows版程序)。
  • windows执行程序以动态链接库的方式给出。程序本身只有78k,dll就有十几M。一定注意验证校验码。
    • MD5: 91A4699F89F275B14E9CB90D721409EE
    • SHA1: AA72FC1C154198CE36276741D96B9729D5BF8281
  • 如果需要在linux上面玩儿,重新编译一下即可;

晒几张运行截图

<!-- /* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */ /* Author: Nicolas Hery - http://nicolashery.com */ /* Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff */ /* Source: https://github.com/nicolahery/markdownpad-github */ /* RESET =============================================================================*/ -->

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏奇点大数据

支付宝如何优化移动端深度学习引擎?

由于移动端资源的限制,大部分深度学习引擎都部署在云端,移动设备获取到输入数据,经过简单的加工,发送给云端,云端服务器经过深度神经网络推断运算,得到结果并反馈给移...

12430
来自专栏Python中文社区

用 Python 从零开始玩微信跳一跳

关注 Python 的人想必都知道 跳一跳辅助外挂 这个项目近来在 Github 上火得不行,相信不少人也可能尝试过一番,并暗暗叹息,为什么我一开始就没有这个...

25260
来自专栏CDA数据分析师

手把手教你如何使用Excel高级筛选

Excel自动筛选在工作中被经常使用,但掌握高级筛选的同学却很少,甚至都不知道高级筛选高级到哪儿了。今天兰色还原一个高大尚的高级筛选功能。 一、高级筛选哪里“高...

21950
来自专栏vue学习

14、商品分类等模块及flex布局

这是这本章节的重点,大家可以看到在我的页面基本布局中大量使用了flex布局,所以我觉得这个很重要。 (1)这是对flex的语法总结的一份思维导图,大家可以看看

17530
来自专栏Golang语言社区

从零到 Go:Google感恩节火鸡涂鸦开发纪实

文是 Google 搜索团队软件工程师 Reinaldo Aguiar 发表在 Go 语言博客的客座文章,他分享了在一天之内完成首款 Go 程序的开发并发布给数...

35280
来自专栏Python爬虫与算法进阶

敲敲级简单的鉴别H图片的小程序

首先,来看一下程序运行结果的截图 ? 功能实现 一、下载SDK pip install qcloud_image 先贴出官方给的实例代码: #!/usr/bi...

34540
来自专栏WeTest质量开放平台团队的专栏

UPA深度性能报告解读

原文链接:http://wetest.qq.com/lab/view/403.html

12620
来自专栏Crossin的编程教室

【每周一坑】缩小图片尺寸

之前我们的题目大多偏向解决数学问题,今天来一道偏应用的: 我们知道,通常来说一张图片的分辨率越高,它就越清晰,但文件占用的空间就越大。有时候我们并不需要那么高的...

31370
来自专栏吉浦迅科技

DAY24:阅读SIMT架构

30630
来自专栏小小詹同学

知乎大神爬取高颜值美女(Python爬虫+人脸检测+颜值检测)

这是一篇来自知乎大神的技术文章

995100

扫码关注云+社区

领取腾讯云代金券