本项目最终运行在三星6818 SOC芯片的开发板上,效果图
1.在Ubuntu下用QCreateor开发,新建QT项目
2.构件游戏菜单界面
在QT下的界面UI编辑界面,编辑四个菜单按钮:游戏,难度,其他,关闭。
并添加其相应子菜单,(1)游戏菜单下,有开始/重新开始, 结束本局游戏两个字菜单;
(2)难度:初级:9*9,中级:10*15,高级:10*17
(2)其他:作者,版本
3.建立雷和旗帜的对象,item.h 和item.c
#ifndef ITEM_H
#define ITEM_H
#include
class Item
{
public:
Item();
Item(QPoint pos);
QPoint m_pos; //位置
bool m_bIsMine; //是否是雷
bool m_bMarked; //是否已标记为雷
int m_nNumber; //数字
bool m_bOpen; //是否已打开,且非雷
};
#endif // ITEM_H
//item.c
#include "item.h"
Item::Item()
{
m_pos = QPoint(-1,-1);
m_nNumber = 0;
m_bIsMine = false;
m_bMarked = false;
m_bOpen = false;
}
Item::Item(QPoint pos)
{
m_pos = pos;
m_nNumber = 0;
m_bIsMine = false;
m_bMarked = false;
m_bOpen = false;
}
4.编写游戏主界面
(1)初始化界面及雷的位置
void MainWindow::InitItems()
{
//随机初始化雷
m_Mines.clear();
for(int i = 0; i rowItems;
for(int j=0; jm_bIsMine = true;
}
rowItems.append(pItem);
}
m_items.append(rowItems);
}
//计算雷附近格子的数字
for(int i=0; im_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::ReleaseItems()
{
for (int i=0; i
(2)绑定相应的点击事件,对用户操作进行处理
在主函数中,绑定相应事件函数
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->mainToolBar->hide();
setFixedSize(800,480);
connect(ui->gameStart,SIGNAL(triggered()),this,SLOT(OnMenuNewGame()));
connect(ui->gameEnd,SIGNAL(triggered()),this,SLOT(GameEnd()));
connect(ui->menuClose,SIGNAL(aboutToShow()),this,SLOT(ExitGame()));
connect(ui->action_9_9, SIGNAL(triggered()), this, SLOT(OnMenuLevel1()));
connect(ui->action_10_15, SIGNAL(triggered()), this, SLOT(OnMenuLevel2()));
connect(ui->action_10_17, SIGNAL(triggered()), this, SLOT(OnMenuLevel3()));
connect(ui->author,SIGNAL(triggered()),this,SLOT(AboutGame()));
connect(&m_cTimer,SIGNAL(timeout()),this,SLOT(slotTimerTimeOut()));
m_FlagImage = QPixmap(":/game/pic/flag.png"); //旗帜
m_BombImage = QPixmap(":/game/pic/bomb.png"); //雷
m_nRows = 9;
m_nColumes = 15;
m_nMineCount = 10;
gameInfo = "作者:电子信息工程学院 16物联网;
NewGame();
}
其中,void OnMenuNewGame(); //开始游戏
void OnMenuLevel1(); //选择初级难度
void OnMenuLevel2(); //选择中级难度
void OnMenuLevel3(); //选择高级难度
void slotTimerTimeOut(); //
void mouseClicked(); //鼠标单击游戏区域
void mouseDoubleClickEvent(QMouseEvent *); //鼠标双击游戏区域
void ExitGame(); //退出游戏
void GameEnd(); //结束本局游戏
void AboutGame(); // 关于游戏信息
以上就是我们要实现的相应的处理函数
void MainWindow::mouseDoubleClickEvent(QMouseEvent *e){
e = e;
//m_cTimer.stop();
//得到鼠标处的格子坐标
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 (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;
}
}
}
void MainWindow::OnMenuNewGame()
{
NewGame();
}
void MainWindow::OnMenuLevel1()
{
m_nRows = 9;
m_nColumes = 9;
m_nMineCount = 10;
NewGame();
}
void MainWindow::OnMenuLevel2()
{
m_nRows = 10;
m_nColumes = 15;
m_nMineCount = 25;
NewGame();
}
void MainWindow::OnMenuLevel3()
{
m_nRows = 10;
m_nColumes = 18;
m_nMineCount = 40;
NewGame();
}
void MainWindow::mouseClicked()
{
//QString Qpos_y(pos_y);
//qDebug("Position_Pressed: x: %f \n" , pos_y);
qDebug()<<"CButton::mouseClicked"<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;
}
}
}
}
void MainWindow::GameEnd(){
m_bGameFail = true;
for (int i=0; im_bIsMine)
{
m_items[i][j]->m_bMarked = true;
}
else
{
m_items[i][j]->m_bMarked = false;
m_items[i][j]->m_bOpen = true;
}
}
}
}
void MainWindow::AboutGame(){
//QMessageBox::information(NULL, "关于本游戏",gameInfo, QMessageBox::Yes , QMessageBox::Yes);
QMessageBox::about(NULL,"关于本游戏",gameInfo);
}
void MainWindow::ExitGame(){
close();
5,代码编写完成后,我们首先在Ubuntu环境下运行测试
7.交叉,编译,将程序打包下载至目标开发板
(1)首先在项目目录下进行交叉编译,生成适用于6818开发板的QT程序,其中红框的即为交叉编译命令,最终生成可执行性文件
(2)将编译好的程序下载至开发板,
将开发板用串口和与PC相连,打开SecureCRT连接至开发板
利用tftp32 将QT程序下载至开发板 tftp ipaddress -g -r file_name
修改权限:chmod 777 MineSwee
执行QT程序:./MineSwee
最后,就可以在开发板,玩自己的扫雷游戏啦。。。
附上GitHub完整源码:MineSwee扫雷游戏