左键操作事件

文章目录
最近想着使用Qt实现一个简单版的扫雷 。今天来给大家分享一下自己的实现思路 。实现效果
这是最后的实现效果
下载
源码地址:
gitee:
类的介绍

左键操作事件

文章插图
#pragma onceclass MineMap{public:MineMap();~MineMap();void createMap();void restartGame();void createMap(int cow, int col, int minecount);bool onLeftDown(int x, int y);bool onRightDown(int x, int y);int onLeftRightDown(int x, int y);bool isWin();void floatCoordinateRestore();private:int m_win;int m_x;int m_y;int m_mineCount;int** m_map;int m_timer;int m_mine;friend class MainWindow;int m_floatX;int m_floatY;};
这个类是地雷类,主要是利用一个二级指针来管理地雷 。
当用户点击扫雷区后会在该类进行处理 ,并改变存储的值 。
#pragma once#include #include "minemap.h"#include #include "ui_mainwindow.h"class MainWindow : public QMainWindow{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void init();private:Ui::MainWindowClass ui;MineMap m_minemap;int offsetx;int offsety;QTimer* m_time;QTimer* m_floatTime;protected:void paintEvent(QPaintEvent*);void mousePressEvent(QMouseEvent* e);//鼠标点击事件public slots:void onTimer();void onFloatTimer();void action_easy();void action_intermediate();void action_advance();};
该类主要负责绘制操作
函数功能介绍 数字含义介绍
【左键操作事件】for (int i = 0; i < m_minemap.m_x; i++){for (int j = 0; j < m_minemap.m_y; j++){if (m_minemap.m_map[i][j] > 90)painter.drawPixmap(i * 20 + offsetx, j * 20 + 40 + offsety, bmpmap, 200, 0, 20, 20);if (m_minemap.m_map[i][j] >= 0 && m_minemap.m_map[i][j] <= 8)painter.drawPixmap(i * 20 + offsetx, j * 20 + 40 + offsety, bmpmap, m_minemap.m_map[i][j] * 20, 0, 20, 20);if (m_minemap.m_map[i][j] == -1)painter.drawPixmap(i * 20 + offsetx, j * 20 + 40 + offsety, bmpmap, 180, 0, 20, 20);if (m_minemap.m_map[i][j] == -2)painter.drawPixmap(i * 20 + offsetx, j * 20 + 40 + offsety, bmpmap, 240, 0, 20, 20);if (m_minemap.m_map[i][j] >= 49 && m_minemap.m_map[i][j] <= 58)painter.drawPixmap(i * 20 + offsetx, j * 20 + 40 + offsety, bmpmap, 220, 0, 20, 20);if (m_minemap.m_map[i][j] < -10)painter.drawPixmap(i * 20 + offsetx, j * 20 + 40 + offsety, bmpmap, 0, 0, 20, 20);}}
处理规则:目前的规则是开始的时候99代表该区域为雷,其他部分为100-108,值-100代表该地方周围的雷数,例如101代表周围四周有一个雷 。插旗后-50,即范围为50-58,-1代表该区域为雷,-2代表用户排的该区域的雷为错误的 。由于存在双击操作,目前的双击操作如果该区域没有点开的话会有个弹起的操作,所以目前是减去120,即 左键操作事件
bool MineMap::onLeftDown(int x, int y){if (m_win == 0 || m_win == 2)return false;if (x < 0 || x >= m_x || y < 0 || y >= m_y || (m_map[x][y] >= 0 && m_map[x][y] <= 8))return false;if (m_map[x][y] >= 51 && m_map[x][y] <= 58){m_map[x][y] += 50;m_mineCount++;return true;}if (m_map[x][y] >= 101 && m_map[x][y] <= 108){m_map[x][y] -= 100;isWin();return true;}if (m_map[x][y] == 100){m_map[x][y] -= 100;onLeftDown(x - 1, y - 1);onLeftDown(x, y - 1);onLeftDown(x + 1, y - 1);onLeftDown(x - 1, y);onLeftDown(x + 1, y);onLeftDown(x - 1, y + 1);onLeftDown(x, y + 1);onLeftDown(x + 1, y + 1);}if (m_map[x][y] == 99){//重新开始m_map[x][y] = -2;for (int i = 0; i < m_x; i++){for (int j = 0; j < m_y; j++){if (m_map[i][j] == 99){m_map[i][j] = -1;}if (m_map[i][j] == 49){m_map[i][j] = -1;}if (m_map[i][j] >= 50 && m_map[i][j] <= 58){m_map[i][j] = -2;}}}m_win = 0;}return true;}
点击区域后进行判断该区域是什么值,如果是大于100的话直接减去100,如果等于100的话说明该区域附件都不是雷,目前利用递归操作将四周都点开 。