扫雷介绍
《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。
扫雷游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数),计时器(位于右上角,记录游戏时间)和一个笑脸图标(点击用以重置整个扫雷界面),确定大小的矩形雷区中按照算法布置一定数量的地雷,玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。
游戏的基本操作包括左键单击(Left Click)、左键双击(Chording)两种。其中左键用于打开安全的格子,推进游戏进度;左键双击标记地雷,以辅助判断;
左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。
左键双击:在判断为地雷的方块上按下右键,可以标记地雷(显示为小红旗)。重复一次操作可取消标记。
图片资源
步骤
步骤1:创建QT项目
终端输入:qtcreator或点击桌面qt图标。启动Qt创造器。
选择菜单"file/file or project",在"新建"对话框中依次选择"application"和"QT widgets Application", 并点击"choose..."
在"项目介绍和位置"中指定项目的名称为:UdpSender,并选择存储路径,Qt会在该路径下创建工程目录,点击"next"
在"Class information"中选择"QDialog"作为"Base class",并将"class name"设置为"Mine",点击"next" ,点击"finsh"。
步骤2:编写头文件
ifndef MINE_H
define MINE_H
include <QDialog>
include <QTimer>
include <QPushButton>
namespace Ui {
class Mine;
}
class Mine : public QDialog
{
Q_OBJECT
public:
explicit Mine(int x, int y,QWidget *parent = 0);
~Mine();
private:
void init();//初始化数据
void paintEvent(QPaintEvent *);//绘图事件
void mousePressEvent(QMouseEvent *e);//鼠标点击事件
void mouseReleaseEvent(QMouseEvent *);//鼠标释放事件
void mouseDoubleClickEvent(QMouseEvent *e);//鼠标双击事件
void sui(int x, int sy);//随机布雷
void Ment();//统计雷周围的数字
void Open(int x,int y);//递归展开
void Explode();//点击到雷后,展开所有的雷
int pan();//判断游戏是否结束
private slots:
void on_timer();
void on_mouse();
private:
Ui::Mine *ui;
int wx;//窗口的大小
int hy;
int mapx;//根据窗口的大小设置雷的行数(设置数组的大小)
int mapy;//根据窗口的大小设置雷的列数
int map[50][50];//虚拟地图
int map2[50][50];//真实地图
int size;//雷的数量
int Ssize;//剩余雷的数量
bool xiao;//判断是否点击笑脸
bool One;//判断是否是第一次点击雷区
QTimer timer;//定时器,计算游戏时长
int Time;//游戏的时长
QTimer mouseTimer;//定时器,用以判断是鼠标双击还是单击
QPushButton* button;//按钮,用以关闭的窗口
};
#endif // MINE_H
步骤3:初始化成员数据
初始化类成员编写init函数
void Mine::init(){
Time = 0;//初始化时长为0
xiao = false;//设置笑脸没有被点击
timer.stop();//停止计算时长定时器
mouseTimer.stop();//停止计算是否双击定时器
One = true;//设置是第一次点击雷区
wx = width();//获取窗口宽度
hy = height();//获取窗口高度
memset(map2,0,sizeof(map2));//将真实地图全部设置为0
for(int x=0;x<50;x++){//将虚拟地图全部设置为9,待点击状态
for(int y=0;y<50;y++){
map[x][y]=9;
}
}
//根据窗口的大小计算出雷区的行和列
mapy = (wx-32)/25;
if(mapx>50){
mapx=50;
}
mapx = (hy-117)/25;
if(mapy>50){
mapy=50;
}
//计算出雷的个数,
size = (mapx*mapy)/2-(mapx*mapy)/3;
Ssize = size;//初始化剩余雷的个数和雷的个数相同
//定时器连接槽函数
connect(&timer,SIGNAL(timeout()),this,SLOT(on_timer()));
connect(&am