博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++复现经典游戏——扫雷
阅读量:4953 次
发布时间:2019-06-12

本文共 3088 字,大约阅读时间需要 10 分钟。

  国庆小长假,当大家都去看人山人海的时候,我独自一人狂码代码。这两天想要实现的内容是Windows上的一个经典游戏——扫雷。相信90后和一些上班族对此并不陌生。然而,从win8开始,扫雷就不再是Windows上的默认自带游戏了,但是可以通过微软的应用商店进行下载安装(界面更酷炫,游戏模式更丰富)。目前在win10上也暂时没有找到这款游戏。

  这两天再次用Qt基本图形界面框架,来实现扫雷游戏的功能。本想做得酷炫酷炫再酷炫的,但是真正动手写起来的时候,才发现还是有很多技术关没有通过,因此界面写得丑了。这次扫雷程序实现了基本的游戏功能,包含随机布雷、空白块自动扩展、输赢判断等。

  程序界面如下:

游戏界面

  整个扫雷游戏,最主要的一部分是当点击到空白块的时候,如何扩展开来。我在写程序前,也上网查了扫雷相关的东西,发现扫雷程序已经被写烂了,很多人都复现过,毕业设计、课程设计等等。说起来,扫雷程序确实适合用来练手,整个程序功能并不是特别的复杂。

  下面说说我认为的点到空白块的自动扩展算法。

    (1)点击到空白块

    (2)计算该空白块周围一圈雷的个数。若为零,翻开该块并跳至(3)。若不为零,则翻开并显示雷的个数,跳至(4)。

    (3)对周围八个块,重复第二步。

    (4)结束

  以上四步便是空白块自动扩展算法,是不是很简单。但是我刚开始的时候这个东西还是想了很长一段时间。当写程序实现该算法的时候,有一点需要注意的地方,就是翻开的块需要做个标记。对于第三步中,已经翻开的块不需要再执行第(2)步,不然就可能进入死循环。此外,该算法可以使用递归实现或非递归实现。

下面是我的具体实现代码:

1 /*  2  *统计(x,y)周围一圈雷的个数  3  */  4 int MainWindow::sumMine(int x, int y)  5 {  6     int mineNum=0;  7     if(x-1>=0&&y-1>=0&&map[x-1][y-1]==1) mineNum++;  8     if(x-1>=0&&map[x-1][y]==1) mineNum++;  9     if(x-1>=0&&y+1
=0&&map[x][y-1]==1) mineNum++; 11 if(y+1
=0&&map[x+1][y-1]==1) mineNum++; 13 if(x+1
setText(QString::number(mineAround,10)); 29 temp->setTextAlignment(Qt::AlignCenter); 30 temp->setBackgroundColor(QColor(251,246,246)); 31 mapUI->setItem(x,y,temp); 32 mapFlag[x][y]=1; 33 return ; 34 } 35 //翻开(x,y),并从周围八个方向递归,要判断越界 36 37 list
expendList; 38 POINT point; 39 point.x=x; 40 point.y=y; 41 expendList.push_back(point); 42 while (!expendList.empty()) { 43 point=expendList.front(); 44 expendList.pop_front(); 45 x=point.x; 46 y=point.y; 47 mineAround=sumMine(x,y); 48 if(mineAround!=0){ 49 QTableWidgetItem * temp=new QTableWidgetItem; 50 temp->setText(QString::number(mineAround,10)); 51 temp->setTextAlignment(Qt::AlignCenter); 52 temp->setBackgroundColor(QColor(251,246,246)); 53 mapUI->setItem(x,y,temp); 54 mapFlag[x][y]=1; 55 continue; 56 } 57 QTableWidgetItem * temp1=new QTableWidgetItem; 58 temp1->setBackgroundColor(QColor(251,246,246)); 59 temp1->setTextAlignment(Qt::AlignCenter); 60 mapUI->setItem(x,y,temp1); 61 mapFlag[x][y]=1; 62 if(x-1>=0&&y-1>=0&&mapFlag[x-1][y-1]==0){ 63 point.x=x-1; 64 point.y=y-1; 65 66 expendList.push_back(point); 67 } 68 if(x-1>=0&&mapFlag[x-1][y]==0){ 69 point.x=x-1; 70 point.y=y; 71 72 expendList.push_back(point); 73 } 74 if(x-1>=0&&y+1
=0&&mapFlag[x][y-1]==0){ 81 point.x=x; 82 point.y=y-1; 83 84 expendList.push_back(point); 85 } 86 if(y+1
=0&&mapFlag[x+1][y-1]==0){ 93 point.x=x+1; 94 point.y=y-1; 95 96 expendList.push_back(point); 97 } 98 if(x+1

其中map[][]保存着地图信息。mapFlag[][]是地图标志,当该块已经翻开是设置为1,否则为0。

  

 

转载于:https://www.cnblogs.com/xiongmao-cpp/p/4853344.html

你可能感兴趣的文章
DataTable和 DataRow的 区别与联系
查看>>
检索COM 类工厂中CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败
查看>>
mysql数据库中数据类型
查看>>
python-实现生产者消费者模型
查看>>
APP网络优化篇
查看>>
算法18-----判断是否存在符合条件的元素【list】
查看>>
《刑法》关于拐卖妇女儿童犯罪的规定
查看>>
Windows的本地时间(LocalTime)、系统时间(SystemTime)、格林威治时间(UTC-Time)、文件时间(FileTime)之间的转换...
查看>>
alias重启后失效了
查看>>
RestTemplate的Object与Entity的区别
查看>>
Fireworks基本使用
查看>>
c#线程学习笔记一---基本概念
查看>>
2018-4-13
查看>>
两台电脑间的消息传输
查看>>
Linux 标准 I/O 库
查看>>
Spring Data JPA教程, 第八部分:Adding Functionality to a Repository (未翻译)
查看>>
教练技术的小应用
查看>>
.net Tuple特性
查看>>
Java基础常见英语词汇
查看>>
iOS并发编程笔记【转】
查看>>