基于ARM的嵌入式的QT开发扫雷游戏

本项目最终运行在三星6818 SOC芯片的开发板上,效果图

基于ARM的嵌入式的QT开发扫雷游戏_第1张图片基于ARM的嵌入式的QT开发扫雷游戏_第2张图片基于ARM的嵌入式的QT开发扫雷游戏_第3张图片

1.在Ubuntu下用QCreateor开发,新建QT项目

2.构件游戏菜单界面

在QT下的界面UI编辑界面,编辑四个菜单按钮:游戏,难度,其他,关闭。

并添加其相应子菜单,(1)游戏菜单下,有开始/重新开始, 结束本局游戏两个字菜单;

                        (2)难度:初级:9*9,中级:10*15,高级:10*17

                          (2)其他:作者,版本

基于ARM的嵌入式的QT开发扫雷游戏_第4张图片

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环境下运行测试

基于ARM的嵌入式的QT开发扫雷游戏_第5张图片

7.交叉,编译,将程序打包下载至目标开发板

(1)首先在项目目录下进行交叉编译,生成适用于6818开发板的QT程序,其中红框的即为交叉编译命令,最终生成可执行性文件

基于ARM的嵌入式的QT开发扫雷游戏_第6张图片

(2)将编译好的程序下载至开发板,

将开发板用串口和与PC相连,打开SecureCRT连接至开发板

利用tftp32 将QT程序下载至开发板 tftp ipaddress -g -r file_name

修改权限:chmod 777 MineSwee

执行QT程序:./MineSwee

基于ARM的嵌入式的QT开发扫雷游戏_第7张图片

最后,就可以在开发板,玩自己的扫雷游戏啦。。。

附上GitHub完整源码:MineSwee扫雷游戏

你可能感兴趣的:(嵌入式开发,ARM,应用开发,arm开发,qt,游戏)