网易首页 > 网易号 > 正文 申请入驻

QT项目四:扫雷游戏

0
分享至

1,简介

QT开发的扫雷小游戏,这个相对比较简单,用了几个小时。


2,效果


3,设计思路

背景:一个灰色大矩形

游戏区:默认是初级难度,9*9的矩形阵。可变成16*16,16*30。

每个小矩形元素类 Item.h:


#ifndef ITEM_H#define ITEM_H#includeclass Itempublic:Item();Item(QPoint pos);QPoint m_pos; //位置bool m_bIsMine; //是否是雷bool m_bMarked; //是否已标记为雷int m_nNumber; //数字bool m_bOpen; //是否已打开,且非雷#endif // ITEM_H//是否是雷bool m_bMarked; //是否已标记为雷
int m_nNumber; //数字bool m_bOpen; //是否已打开,且非雷
#endif // ITEM_H//是否是雷bool m_bMarked; //是否已标记为雷
int m_nNumber; //数字bool m_bOpen; //是否已打开,且非雷
#endif // ITEM_H

MainWindow.h:


#ifndef MAINWINDOW_H#define MAINWINDOW_H#include "item.h"#includenamespace Ui {class MainWindow;#define RECT_WIDTH 30#define RECT_HEIGHT 30#define START_X 100#define START_Y 100class MainWindow : public QMainWindowQ_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();void InitItems();void ReleaseItems();void NewGame();void GameSuccess();void GameFail();void OpenEmptyItem(QPoint pt); //点击空白元素(相邻雷数为0)时,递归查找相邻的空白元素,以及空白元素附近的数字元素(数字是雷数)bool FindAll();bool PointInGameArea(QPoint pt); //判断坐标是否超过游戏区域protected:void paintEvent(QPaintEvent *);void mousePressEvent(QMouseEvent *);private slots:void OnMenu_NewGame();void OnMenu_Settings();void OnMenu_Level1();void OnMenu_Level2();void OnMenu_Level3();private:void DrawChessboard();void DrawItems();void DrawItem(QPainter& painter,Item* pItem);private:Ui::MainWindow *ui;QPixmap m_FlagImage; //小红旗图片QPixmap m_BombImage; //爆炸图片int m_nRows; //行数int m_nColumes; //列数int m_nMineCount; //雷数QVector m_Mines; //雷点QVector> m_items; //所有元素bool m_bGameFail; //是否是游戏失败,失败了需要显示雷#endif // MAINWINDOW_H//爆炸图片
int m_nRows; //行数int m_nColumes; //列数int m_nMineCount; //雷数QVector m_Mines; //雷点QVector> m_items; //所有元素bool m_bGameFail; //是否是游戏失败,失败了需要显示雷
#endif // MAINWINDOW_H//爆炸图片
int m_nRows; //行数int m_nColumes; //列数int m_nMineCount; //雷数QVector m_Mines; //雷点QVector> m_items; //所有元素bool m_bGameFail; //是否是游戏失败,失败了需要显示雷
#endif // MAINWINDOW_H

随机初始化雷点:


void MainWindow::InitItems()//随机初始化雷m_Mines.clear();for(int i = 0; iqsrand(QTime::currentTime().msec());int x = qrand()%m_nColumes;int y = qrand()%m_nRows;while(m_Mines.contains(QPoint(x,y)))x = qrand()%m_nColumes;y = qrand()%m_nRows;m_Mines.append(QPoint(x,y));//建立2维数组保存所有元素位置,方便索引for(int i=0; iQVector rowItems;for(int j=0; jQPoint pos = QPoint(i,j);Item* pItem = new Item(pos);if(m_Mines.contains(pos)) //该位置是雷pItem->m_bIsMine = true;rowItems.append(pItem);m_items.append(rowItems);//计算雷附近格子的数字for(int i=0; ifor(int j=0; jif (m_items[i][j]->m_bIsMine)continue;int nCountMines = 0;//求每个点附近的8个点的是雷的总数for (int m=-1;m<=1;m++)for (int n=-1; n<=1;n++)if (m==0 && n==0)continue;QPoint ptNew = QPoint(i+m,j+n);if (!PointInGameArea(ptNew))continue;if (m_items[i+m][j+n]->m_bIsMine)nCountMines++;m_items[i][j]->m_nNumber = nCountMines;

核心函数,鼠标点击处理:


void MainWindow::mousePressEvent(QMouseEvent * e)//得到鼠标处的格子坐标QPoint pt;pt.setX( (e->pos().x() - START_X ) / RECT_WIDTH);pt.setY( (e->pos().y() - START_X ) / RECT_HEIGHT);//是否点在游戏区域内if (!PointInGameArea(pt))return;Item* pItem = m_items[pt.x()][pt.y()];//左键打开元素,右键插旗帜标记if(e->button()==Qt::LeftButton)//不是已标记的或已打开的空白点,也就是未处理的if(!pItem->m_bMarked && !pItem->m_bOpen)//如果是雷,就GAME OVERif (pItem->m_bIsMine)//QMessageBox::information(NULL, "GAME OVER","FAIL!", QMessageBox::Yes , QMessageBox::Yes);GameFail();return;else//打开pItem->m_bOpen = true;if (pItem->m_nNumber == 0)//如果数字是0,也就是不含任何相邻雷的元素,那么递归打开所有的相邻数字是0的元素//也就是点到一个空白处,一下打开一大片的效果OpenEmptyItem(pt);//如果已找到所有雷if (FindAll())QMessageBox::information(NULL, "GAME OVER","SUCCESS!", QMessageBox::Yes , QMessageBox::Yes);//GameSuccess();return;else if(e->button()==Qt::RightButton)//已标记过的,取消标记if (pItem->m_bMarked)pItem->m_bMarked = false;else if (!pItem->m_bOpen)//没标记也没打开,就是未处理的,就插旗帜标记上pItem->m_bMarked = true;if (FindAll())QMessageBox::information(NULL, "GAME OVER","SUCCESS!", QMessageBox::Yes , QMessageBox::Yes);//GameSuccess();return;

其中OpenEmptyItem函数,可能会打开空白一大片:


//运气好时点到一个空白元素,可能打开挨着的一大片void MainWindow::OpenEmptyItem(QPoint pt)//对于空白元素,有上下左右4个方向挨着的空白元素,就打开并继续查找空白元素QVector directions; //新建一个空list,里面可以装QPoint类型元素directions.push_back(QPoint(-1,0)); //插入一个QPoint,代表左方向directions.push_back(QPoint(1,0)); //插入一个QPoint,代表右方向directions.push_back(QPoint(0,-1)); //插入一个QPoint,代表下方向directions.push_back(QPoint(0,1)); //插入一个QPoint,代表上方向for (int i=0; i //遍历directions,对4个方向处理QPoint ptNew = pt + directions[i]; //原格子pt,加上上面的一个单位的方向值,就是这个方向相邻的一个格子if (!PointInGameArea(ptNew))continue;Item* pItem = m_items[ptNew.x()][ptNew.y()];if (!pItem->m_bIsMine && !pItem->m_bOpen && !pItem->m_bMarked && pItem->m_nNumber == 0)pItem->m_bOpen = true;//对于找到的空白元素,在它的8个方向上有数字元素就打开QVector directions2 = directions;directions2.push_back(QPoint(-1,-1));directions2.push_back(QPoint(1,1));directions2.push_back(QPoint(1,-1));directions2.push_back(QPoint(-1,1));for (int j=0; jQPoint ptNew2 = ptNew + directions2[j];if(!PointInGameArea(ptNew2))continue;Item* pItem2 = m_items[ptNew2.x()][ptNew2.y()];if (!pItem2->m_bIsMine && !pItem2->m_bOpen && !pItem2->m_bMarked && pItem2->m_nNumber > 0)pItem2->m_bOpen = true;//递归查找上下左右4个方向的空白元素OpenEmptyItem(ptNew);


//是否找完bool MainWindow::FindAll()bool bFindAll = true;//遍历二维数组 QVector> m_itemsfor (int i=0; ifor (int j=0;j//只要存在一个雷没被标记,或存在一个非雷被没打开,都不算找完Item* pItem = m_items[i][j];if (pItem->m_bIsMine)if (!pItem->m_bMarked)bFindAll = false;elseif (!pItem->m_bOpen)bFindAll = false;return bFindAll;

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
黎姿父亲节带家人出游,86岁黎爸爸被黎姿推着走,满头白发好慈祥

黎姿父亲节带家人出游,86岁黎爸爸被黎姿推着走,满头白发好慈祥

树娃
2024-06-19 13:44:44
宝马新一代X3首发!配两种外观/升级3系统同款内饰

宝马新一代X3首发!配两种外观/升级3系统同款内饰

爱卡汽车
2024-06-19 08:40:08
伟伟道来|这一次,G7薅羊毛薅到了根上

伟伟道来|这一次,G7薅羊毛薅到了根上

经济观察报
2024-06-18 16:31:04
《人民日报》:“很严峻,未来五年,这样做才能守住钱袋子”

《人民日报》:“很严峻,未来五年,这样做才能守住钱袋子”

蓝色海边
2024-06-18 22:21:00
央视顾永菲:吞服300颗安眠药自杀,经抢救7天7夜,如今生活怎样

央视顾永菲:吞服300颗安眠药自杀,经抢救7天7夜,如今生活怎样

贾文彬的史书
2024-06-17 22:03:23
两性关系:女人过了55岁,为何大部分女性反而更加“需要”男性?

两性关系:女人过了55岁,为何大部分女性反而更加“需要”男性?

四象八卦
2024-06-19 04:17:18
“封杀”不到2年,再看李易峰如今的处境,他很可恨,但也很可悲

“封杀”不到2年,再看李易峰如今的处境,他很可恨,但也很可悲

暮云春树树
2024-06-16 15:50:04
又一家大型银行突然倒闭!中国富豪上亿资金一夜清零

又一家大型银行突然倒闭!中国富豪上亿资金一夜清零

漫步风雨中
2024-06-16 09:50:58
美记:勇士球员小佩顿还有最后一天决定是否执行球员选项

美记:勇士球员小佩顿还有最后一天决定是否执行球员选项

懂球帝
2024-06-19 20:34:09
中央定调:2024年70岁及以上老人可享“3项优待”,包括农民在内

中央定调:2024年70岁及以上老人可享“3项优待”,包括农民在内

天下纵览
2024-04-13 12:39:22
著名国家一级演员被爆免职?沦落到无戏可演!他竟过着这种生活!

著名国家一级演员被爆免职?沦落到无戏可演!他竟过着这种生活!

华人星光
2024-06-18 16:22:12
1992年一老人被扣押,交警:这里我说了算!司机一个电话震动全市

1992年一老人被扣押,交警:这里我说了算!司机一个电话震动全市

阿胡
2023-12-10 13:38:43
现在的年轻人已经不再尊重电脑了

现在的年轻人已经不再尊重电脑了

差评
2024-06-17 14:26:12
癞蛤蟆也能吃天鹅肉,NBA糙汉娶到仙女,羡煞众人

癞蛤蟆也能吃天鹅肉,NBA糙汉娶到仙女,羡煞众人

元爸体育
2024-04-25 07:15:02
菲律宾突发粮食危机,美趁火打劫,没了中国援助,马科斯只剩画饼

菲律宾突发粮食危机,美趁火打劫,没了中国援助,马科斯只剩画饼

国学璀璨
2024-06-19 17:12:35
陈水扁天安门前留影,蔡英文参加汪辜会谈:台独分子多是变色龙

陈水扁天安门前留影,蔡英文参加汪辜会谈:台独分子多是变色龙

黄娜老师
2024-06-19 09:46:24
菲律宾已成坏榜样,东盟国家不忍了,柬埔寨后,印尼也大声批评!

菲律宾已成坏榜样,东盟国家不忍了,柬埔寨后,印尼也大声批评!

史小纪
2024-06-17 15:10:05
俄罗斯,踩中国线了

俄罗斯,踩中国线了

新动察
2024-03-14 09:44:14
传射建功,当选MVP!33岁老将打消质疑,助德国出线,创64年纪录

传射建功,当选MVP!33岁老将打消质疑,助德国出线,创64年纪录

阿超他的体育圈
2024-06-20 02:39:40
迈巴赫S级新车型曝光!限量发售30台/售价超200万

迈巴赫S级新车型曝光!限量发售30台/售价超200万

爱卡汽车
2024-06-19 17:13:54
2024-06-20 03:06:44
新能源自动驾驶
新能源自动驾驶
专注于半导体行业资讯
873文章数 336关注度
往期回顾 全部

科技要闻

618观察:谁为高强度的低价竞争买单?

头条要闻

丁进勇辞去越共中央政治局委员和河内市委书记职务

头条要闻

丁进勇辞去越共中央政治局委员和河内市委书记职务

体育要闻

欧洲杯最大的混子,非他莫属

娱乐要闻

黄一鸣“杀疯了” 直播间卖大葱养孩子

财经要闻

深化科创板改革 证监会发布八条措施

汽车要闻

双肾格栅变化大/内饰焕新 新一代宝马X3官图发布

态度原创

旅游
房产
时尚
健康
军事航空

旅游要闻

遭遇极端高温天气导致希腊多名游客死亡

房产要闻

17.9亿!终于,有民企在三亚大手笔拿地了!周边房价10万+!

几个小物件,打造宅家时的「inner peace」

晚餐不吃or吃七分饱,哪种更减肥?

军事要闻

以色列涉嫌在加沙使用重型炸弹 或多次违反战争法

无障碍浏览 进入关怀版