扫雷群规则资讯

(扫雷群二维码)QT项目四:扫雷游戏微信红包群

发布人:微信有什么抢红包的群 来源:微信抢红包群,支付宝红包群,红包群,红包扫雷群发布时间:2022-08-14 04:11:41 热度:

微信红包群二维码扫雷

1,简介

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

2,效果

3,设计思路

背景:一个灰色大矩形

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

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

ifndef ITEM_Hdefine ITEM_HincludeclassItem{public:Item();Item(QPointpos);QPointm_pos;//位置boolm_bIsMine;//是否是雷boolm_bMarked;//是否已标记为雷intm_nNumber;//数字boolm_bOpen;//是否已打开,且非雷};endif// ITEM_H//是否是雷boolm_bMarked;//是否已标记为雷intm_nNumber;//数字boolm_bOpen;//是否已打开,且非雷};endif// ITEM_H

MainWindow.h:

微信扫雷群图片 红包

ifndef MAINWINDOW_H define MAINWINDOW_H include "item.h" include namespace Ui { class MainWindow; } define RECT_WIDTH 30 define RECT_HEIGHT 30 define START_X 100 define START_Y 100 class MainWindow : public QMainWindow { Q_OBJECT public: 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

随机初始化雷点:

void MainWindow::InitItems() { //随机初始化雷 m_Mines.clear(); for(int i = 0; i

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

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 OVER if (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; im_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; jm_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

10-50红包扫雷群规

... 
上一篇 : (扫雷群二维码)2022美国大型枪击案全程在线:吃鸡群学技术
下一篇 : (微信红包群)10个群内小游戏,各类社群都能用,死群拜拜!红
猜你喜欢的微信抢红包群,支付宝红包群,红包群,红包扫雷群