QT 推箱子小游戏编写

来源:互联网 发布:android实现java线程池 编辑:程序博客网 时间:2024/04/19 00:06

 

 
 
主要使用以下几个类:
1、QPainter绘制地图
2、QMenu、QAction制作菜单栏
3、QSound播放音乐(追求好的效果可使用Phonon)
4、QKeyEvent接收键盘事件 控制人物行走及推箱子
 
 
主要代码:
 
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMenu>
#include <QAction>
#include <QMenuBar>
#include <QStatusBar>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QLCDNumber>
#include <QSpacerItem>
#include <QMessageBox>
#include <QKeyEvent>
#include <QSound>
#include <QTimer>
#include <QPushButton>
#include "mappaint.h"
#include "define.h"
#include "choosedlg.h"
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
//*******************菜单栏************************
    QMenu *gameMenu;//游戏菜单
    QMenu *musicMenu;//音乐菜单
    QMenu *helpMenu;//帮助
    QAction *beginGameAction;//开始游戏
    QAction *chooseGameAction;//选择关卡
    QAction *restartGameAction;//重新开始
    QAction *endGameAction;//结束游戏
    QAction *openMusicAction;//打开音乐
    QAction *closeMusicAction;//关闭音乐
    QAction *aboutAction;//关于我们
    void createMenu();
    void createAction();
//******************数据设计*************************
    int map[LEVELNUM+1][MAPH][MAPV];
    int man[LEVELNUM+1][2];
    int box[LEVELNUM+1];
    int boxNum;
    int chooseNum;
    QSound *bells;
    QTimer *timer;
    void createMap();
//******************界面布局****************************
    QWidget *widget;
    mapPaint *mainmap;
    QLabel *levelLabel;
    QLabel *stepLabel;
    QLCDNumber *levelLCD;
    QLCDNumber *stepLCD;
    QPushButton *restartButton;
//*************游戏控制**********************
    void keyPressEvent(QKeyEvent *e);
    void keyUp();
    void keyLeft();
    void keyRight();
    void keyDown();
    void boxNumCheck();
    void startGame(int x);
public slots:
//******************菜单栏——槽**********************
    void beginGameSlot();
    void chooseGameSlot();
    void restartGameSlot();
    void endGameSlot();
    void openMusicSlot();
    void closeMusicSlot();
    void aboutSlot();
    void levelLCDShow();//关卡显示
    void stepLCDShow();//步数显示
    void soundSlot();
};
#endif // MAINWINDOW_H
 

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    //***********建立菜单栏***********
    createAction();
    createMenu();
    //***********布局*****************
    widget=new QWidget;
    setCentralWidget(widget);
    mainmap=new mapPaint;
    levelLabel=new QLabel(tr("当前关卡"));
    levelLCD=new QLCDNumber;
    stepLabel=new QLabel(tr("当前行走步数"));
    stepLCD=new QLCDNumber;
    restartButton=new QPushButton(tr("重新开始"));
    connect(restartButton,SIGNAL(clicked()),this,SLOT(restartGameSlot()));
    restartButton->setEnabled(false);
    QVBoxLayout *rightLayout=new QVBoxLayout;
    rightLayout->addWidget(levelLabel);
    rightLayout->addWidget(levelLCD);
    rightLayout->addWidget(stepLabel);
    rightLayout->addWidget(stepLCD);
    rightLayout->addWidget(restartButton);
    rightLayout->addSpacing(MAPV*30-150);
    QHBoxLayout *mainLayout=new QHBoxLayout;
    mainLayout->addWidget(mainmap);
    mainLayout->addLayout(rightLayout);
    widget->setLayout(mainLayout);
    //**************数据初始化*****************
    timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(soundSlot()));
    bells=new QSound("./a.wav");
    mainmap->levelNow=0;
    mainmap->stepNow=0;
    mainmap->man_h=0;
    mainmap->man_v=0;
    mainmap->BeginOrEnd=-1;
    mainmap->update();
    boxNum=0;
    levelLCD->display(mainmap->levelNow);
    stepLCD->display(mainmap->stepNow);
    createMap();
    //**************程序整体设定****************
    setWindowTitle(tr("推箱子小游戏----散云轩出品001"));
    widget->setFocus();
    statusBar()->showMessage(tr("欢迎进入推箱子小游戏。"));
}
void MainWindow::createAction()
{
    beginGameAction=new QAction(tr("开始游戏(B)"),this);
    beginGameAction->setShortcut(QKeySequence("Ctrl+B"));
    beginGameAction->setStatusTip(tr("开始一场新游戏。"));
    connect(beginGameAction,SIGNAL(triggered()),this,SLOT(beginGameSlot()));
    chooseGameAction=new QAction(tr("选择关卡(C)"),this);
    chooseGameAction->setShortcut(QKeySequence("Ctrl+C"));
    chooseGameAction->setStatusTip(tr("选择游戏关卡。"));
    connect(chooseGameAction,SIGNAL(triggered()),this,SLOT(chooseGameSlot()));
    restartGameAction=new QAction(tr("重新开始(R)"),this);
    restartGameAction->setShortcut(QKeySequence("Ctrl+R"));
    restartGameAction->setStatusTip(tr("重新开始本局。"));
    restartGameAction->setEnabled(false);
    connect(restartGameAction,SIGNAL(triggered()),this,SLOT(restartGameSlot()));
    endGameAction=new QAction(tr("结束游戏(E)"),this);
    endGameAction->setShortcut(QKeySequence("Ctrl+E"));
    endGameAction->setStatusTip(tr("结束当前游戏。"));
    endGameAction->setEnabled(false);
    connect(endGameAction,SIGNAL(triggered()),this,SLOT(endGameSlot()));
    openMusicAction=new QAction(tr("打开音乐(O)"),this);
    openMusicAction->setShortcut(QKeySequence(tr("Ctrl+O")));
    openMusicAction->setStatusTip(tr("开启音乐。"));
    connect(openMusicAction,SIGNAL(triggered()),this,SLOT(openMusicSlot()));
    closeMusicAction=new QAction(tr("关闭音乐(P)"),this);
    closeMusicAction->setShortcut(QKeySequence("Ctrl+P"));
    closeMusicAction->setStatusTip(tr("关闭音乐。"));
    closeMusicAction->setEnabled(false);
    connect(closeMusicAction,SIGNAL(triggered()),this,SLOT(closeMusicSlot()));
    aboutAction=new QAction(tr("关于我们"),this);
    aboutAction->setShortcut(QKeySequence("Ctrl+A"));
    aboutAction->setStatusTip(tr("关于我们的信息。"));
    connect(aboutAction,SIGNAL(triggered()),this,SLOT(aboutSlot()));
}
void MainWindow::createMenu()
{
    gameMenu=menuBar()->addMenu(tr("游戏"));
    gameMenu->addAction(beginGameAction);
    gameMenu->addAction(chooseGameAction);
    gameMenu->addAction(restartGameAction);
    gameMenu->addSeparator();
    gameMenu->addAction(endGameAction);
    musicMenu=menuBar()->addMenu(tr("音乐"));
    musicMenu->addAction(openMusicAction);
    musicMenu->addAction(closeMusicAction);
    helpMenu=menuBar()->addMenu(tr("帮助"));
    helpMenu->addAction(aboutAction);
}
void MainWindow::beginGameSlot()
{
    startGame(1);
}
void MainWindow::chooseGameSlot()
{
    chooseDlg l;
    l.exec();
    chooseNum=l.chooseNum;
    startGame(chooseNum);
}
void MainWindow::startGame(int x)
{
    widget->setFocus();
    endGameAction->setEnabled(true);
    restartGameAction->setEnabled(true);
    restartButton->setEnabled(true);
    mainmap->man_h=man[x][0];
    mainmap->man_v=man[x][1];
    boxNum=0;
    for(int i=0;i<MAPH;i++)
        for(int j=0;j<MAPV;j++)
            mainmap->mapNow[i][j]=map[x][i][j];
    mainmap->mapNow[mainmap->man_h][mainmap->man_v]=MAN;
    mainmap->levelNow=x;
    mainmap->stepNow=0;
    stepLCDShow();
    levelLCDShow();
    mainmap->update();
    levelLCDShow();
}
void MainWindow::restartGameSlot()
{
    startGame(mainmap->levelNow);
}
void MainWindow::endGameSlot()
{
    endGameAction->setEnabled(false);
    restartGameAction->setEnabled(false);
    restartButton->setEnabled(false);
    mainmap->levelNow=0;
    mainmap->stepNow=0;
    boxNum=0;
    mainmap->BeginOrEnd=1;
    mainmap->update();
    QMessageBox::information(this,tr("游戏结束"),tr("游戏已结束。"),QMessageBox::Ok);
}
void MainWindow::openMusicSlot()
{
    openMusicAction->setEnabled(false);
    closeMusicAction->setEnabled(true);
    bells->play();
    timer->start(300000);
}
void MainWindow::soundSlot()
{
    openMusicSlot();
}
void MainWindow::closeMusicSlot()
{
    timer->stop();
    bells->stop();
    closeMusicAction->setEnabled(false);
    openMusicAction->setEnabled(true);
}
void MainWindow::aboutSlot()
{
    QMessageBox::information(this,tr("关于我们"),tr("散云轩出品001号,感谢使用!\n联系方式:QQ 575626476"),QMessageBox::Ok);
}
void MainWindow::createMap()
{
    int i,j;
    //***********第一关*****************
    man[1][0]=8;man[1][1]=7;//人初始位置
    box[1]=4;
    for(i=0;i<MAPH;i++)
        for(j=0;j<MAPV;j++)
            map[1][i][j]=0;
    map[1][4][6]=Q0100; map[1][4][7]=Q0101; map[1][4][8]=Q0001;
    map[1][5][6]=Q1100;map[1][5][7]=GOAL;map[1][5][8]=Q0011;
    map[1][6][6]=Q1100;map[1][6][7]=GROUND;map[1][6][8]=Q0111;
    map[1][6][9]=Q0101; map[1][6][10]=Q0101;map[1][6][11]=Q0001;
    map[1][7][4]=Q0100; map[1][7][5]=Q0101; map[1][7][6]=Q1101;
    map[1][7][7]=BOX; map[1][7][8]=BOX; map[1][7][9]=GROUND;
    map[1][7][10]=GOAL;map[1][7][11]=Q0011;
    map[1][8][4]=Q1100;map[1][8][5]=GOAL;map[1][8][6]=BOX;
    map[1][8][7]=GROUND;map[1][8][8]=GROUND;map[1][8][9]=Q1011;
    map[1][8][10]=Q1010;map[1][8][11]=Q0010;
    map[1][9][4]=Q1000;map[1][9][5]=Q1010;map[1][9][6]=Q1010;
    map[1][9][7]=Q1110;map[1][9][8]=BOX;map[1][9][9]=Q0011;
    map[1][10][7]=Q1100;map[1][10][8]=GOAL;map[1][10][9]=Q0011;
    map[1][11][7]=Q1000;map[1][11][8]=Q1010;map[1][11][9]=Q0010;
    //***************第二关***************
    man[2][0]=6;man[2][1]=9;
    box[2]=3;
    for(i=0;i<MAPH;i++)
        for(j=0;j<MAPV;j++)
            map[2][i][j]=0;
    map[2][3][8]=Q0100;map[2][3][12]=Q0001;
    map[2][3][9]=Q0101;map[2][3][10]=Q0101;map[2][3][11]=Q0101;
    map[2][4][4]=Q0100;map[2][4][8]=Q1101;
    map[2][4][5]=Q0101;map[2][4][6]=Q0101;map[2][4][7]=Q0101;
    map[2][4][9]=GROUND;map[2][4][10]=GROUND;map[2][4][11]=GROUND;
    map[2][4][12]=Q0011;
    map[2][5][4]=Q1100;map[2][5][5]=GROUND;map[2][5][6]=GROUND;
    map[2][5][7]=Q1111;map[2][5][8]=Q1111;map[2][5][9]=BOX;
    map[2][5][10]=BOX;map[2][5][11]=GROUND;map[2][5][12]=Q0011;
    map[2][6][4]=Q1100;map[2][6][12]=Q0011;
    map[2][6][5]=GROUND;map[2][6][6]=GROUND;map[2][6][7]=GROUND;map[2][6][8]=BOX;
    map[2][6][9]=GROUND;map[2][6][10]=GROUND;map[2][6][11]=GROUND;
    map[2][7][4]=Q1100;map[2][7][8]=Q1011;map[2][7][12]=Q0010;
    map[2][7][5]=GROUND;map[2][7][6]=GROUND;map[2][7][7]=GROUND;
    map[2][7][9]=Q1010;map[2][7][10]=Q1010;map[2][7][11]=Q1010;
    map[2][8][4]=Q1000;map[2][8][5]=Q1110;map[2][8][6]=Q1111;
    map[2][8][7]=GROUND;map[2][8][8]=Q0011;
    map[2][9][5]=Q1100;map[2][9][6]=GROUND;map[2][9][7]=GROUND;
    map[2][9][8]=Q0111;map[2][9][9]=Q0101;map[2][9][10]=Q0001;
    map[2][10][5]=Q1100;map[2][10][6]=GROUND;map[2][10][7]=GOAL;
    map[2][10][8]=GOAL;map[2][10][9]=GOAL;map[2][10][10]=Q0011;
    map[2][11][5]=Q1000;map[2][11][10]=Q0010;
    map[2][11][6]=Q1010;map[2][11][7]=Q1010;map[2][11][8]=Q1010;map[2][11][9]=Q1010;
    //********************第三关*********************************
    man[3][0]=5;man[3][1]=8;
    box[3]=4;
    for(i=0;i<MAPH;i++)
        for(j=0;j<MAPV;j++)
            map[3][i][j]=0;
    map[3][3][6]=Q0100;map[3][3][9]=Q0001;map[3][3][7]=Q0101;map[3][3][8]=Q0101;
    map[3][4][5]=Q0100;map[3][4][6]=Q1101;map[3][4][7]=GROUND;map[3][4][8]=GROUND;
    map[3][4][9]=Q0111;map[3][4][10]=Q0101;map[3][4][11]=Q0001;
    map[3][5][5]=Q1100;map[3][5][6]=GOAL;map[3][5][7]=GOAL;map[3][5][8]=GROUND;
    map[3][5][9]=BOX;map[3][5][10]=GROUND;map[3][5][11]=Q0011;
    map[3][6][5]=Q1100;map[3][6][6]=GOAL;map[3][6][7]=GOAL;map[3][6][8]=GROUND;
    map[3][6][9]=Q1111;map[3][6][10]=GROUND;map[3][6][11]=Q0011;
    map[3][7][5]=Q1100;map[3][7][6]=Q1111;map[3][7][7]=Q1111;map[3][7][8]=BOX;
    map[3][7][9]=Q1111;map[3][7][10]=GROUND;map[3][7][11]=Q0011;
    map[3][8][5]=Q1100;map[3][8][6]=GROUND;map[3][8][7]=GROUND;map[3][8][8]=GROUND;
    map[3][8][9]=Q1111;map[3][8][10]=GROUND;map[3][8][11]=Q0011;
    map[3][9][5]=Q1100;map[3][9][6]=GROUND;map[3][9][7]=BOX;map[3][9][8]=GROUND;
    map[3][9][9]=GROUND;map[3][9][10]=GROUND;map[3][9][11]=Q0011;
    map[3][10][5]=Q1100;map[3][10][6]=GROUND;map[3][10][7]=GROUND;map[3][10][8]=BOX;
    map[3][10][9]=GROUND;map[3][10][10]=Q1011;map[3][10][11]=Q0010;
    map[3][11][5]=Q1000;map[3][11][6]=Q1010;map[3][11][7]=Q1110;map[3][11][8]=GROUND;
    map[3][11][9]=GROUND;map[3][11][10]=Q0011;
    map[3][12][7]=Q1000;map[3][12][8]=Q1010;map[3][12][9]=Q1010;map[3][12][10]=Q0010;
}
void MainWindow::levelLCDShow()
{
    levelLCD->display(mainmap->levelNow);
}
void MainWindow::stepLCDShow()
{
    stepLCD->display(mainmap->stepNow);
}
void MainWindow::keyPressEvent(QKeyEvent *e)
{
    if(!(mainmap->levelNow==0))
    {
        switch (e->key())
        {
        case Qt::Key_Up:keyUp();break;
        case Qt::Key_Left:keyLeft();break;
        case Qt::Key_Right:keyRight();break;
        case Qt::Key_Down:keyDown();break;
        case Qt::Key_W:keyUp();break;
        case Qt::Key_A:keyLeft();break;
        case Qt::Key_D:keyRight();break;
        case Qt::Key_S:keyDown();break;
        default:break;
        }
    }
}
void MainWindow::keyUp()
{
    int manx=mainmap->man_h;
    int many=mainmap->man_v;
    if((mainmap->mapNow[manx][many+1]==BOX)||(mainmap->mapNow[manx][many+1]==GET))
    {
        if(mainmap->mapNow[manx][many+2]==GOAL)
        {
            bool t=false;
            if(mainmap->mapNow[manx][many+1]==BOX)
            {
                boxNum++;t=true;
            }
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx][many+1]=MAN;
            mainmap->mapNow[manx][many+2]=GET;
            mainmap->man_v++;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
            if(t)
                boxNumCheck();
        }
        else if(mainmap->mapNow[manx][many+2]==GROUND)
        {
            if(mainmap->mapNow[manx][many+1]==GET)
                boxNum--;
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx][many+1]=MAN;
            mainmap->mapNow[manx][many+2]=BOX;
            mainmap->man_v++;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
        }
    }
    else if((mainmap->mapNow[manx][many+1]==GOAL)||(mainmap->mapNow[manx][many+1]==GROUND))
    {
        if (map[mainmap->levelNow][manx][many]==BOX)
            mainmap->mapNow[manx][many]=GROUND;
        else
            mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
        mainmap->mapNow[manx][many+1]=MAN;
        mainmap->man_v++;
        mainmap->stepNow++;
        stepLCDShow();
        mainmap->update();
    }
}
void MainWindow::keyLeft()
{
    int manx=mainmap->man_h;
    int many=mainmap->man_v;
    if((mainmap->mapNow[manx-1][many]==BOX)||(mainmap->mapNow[manx-1][many]==GET))
    {
        if(mainmap->mapNow[manx-2][many]==GOAL)
        {
            bool t=false;
            if(mainmap->mapNow[manx-1][many]==BOX)
            {
                boxNum++;t=true;
            }
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx-1][many]=MAN;
            mainmap->mapNow[manx-2][many]=GET;
            mainmap->man_h--;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
            if(t)
                boxNumCheck();
        }
        else if(mainmap->mapNow[manx-2][many]==GROUND)
        {
            if(mainmap->mapNow[manx-1][many]==GET)
                boxNum--;
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx-1][many]=MAN;
            mainmap->mapNow[manx-2][many]=BOX;
            mainmap->man_h--;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
        }
    }
    else if((mainmap->mapNow[manx-1][many]==GOAL)||(mainmap->mapNow[manx-1][many]==GROUND))
    {
        if (map[mainmap->levelNow][manx][many]==BOX)
            mainmap->mapNow[manx][many]=GROUND;
        else
            mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
        mainmap->mapNow[manx-1][many]=MAN;
        mainmap->man_h--;
        mainmap->stepNow++;
        stepLCDShow();
        mainmap->update();
    }
}
void MainWindow::keyRight()
{
    int manx=mainmap->man_h;
    int many=mainmap->man_v;
    if((mainmap->mapNow[manx+1][many]==BOX)||(mainmap->mapNow[manx+1][many]==GET))
    {
        if(mainmap->mapNow[manx+2][many]==GOAL)
        {
            bool t=false;
            if(mainmap->mapNow[manx+1][many]==BOX)
            {
                boxNum++;t=true;
            }
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx+1][many]=MAN;
            mainmap->mapNow[manx+2][many]=GET;
            mainmap->man_h++;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
            if(t)
                boxNumCheck();
        }
        else if(mainmap->mapNow[manx+2][many]==GROUND)
        {
            if(mainmap->mapNow[manx+1][many]==GET)
                boxNum--;
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx+1][many]=MAN;
            mainmap->mapNow[manx+2][many]=BOX;
            mainmap->man_h++;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
        }
    }
    else if((mainmap->mapNow[manx+1][many]==GOAL)||(mainmap->mapNow[manx+1][many]==GROUND))
    {
        if (map[mainmap->levelNow][manx][many]==BOX)
            mainmap->mapNow[manx][many]=GROUND;
        else
            mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
        mainmap->mapNow[manx+1][many]=MAN;
        mainmap->man_h++;
        mainmap->stepNow++;
        stepLCDShow();
        mainmap->update();
    }
}
void MainWindow::keyDown()
{
    int manx=mainmap->man_h;
    int many=mainmap->man_v;
    if((mainmap->mapNow[manx][many-1]==BOX)||(mainmap->mapNow[manx][many-1]==GET))
    {
        if(mainmap->mapNow[manx][many-2]==GOAL)
        {
            bool t=false;
            if(mainmap->mapNow[manx][many-1]==BOX)
            {
                boxNum++;t=true;
            }
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx][many-1]=MAN;
            mainmap->mapNow[manx][many-2]=GET;
            mainmap->man_v--;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
            if(t)
                boxNumCheck();
        }
        else if(mainmap->mapNow[manx][many-2]==GROUND)
        {
            if(mainmap->mapNow[manx][many-1]==GET)
                boxNum--;
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx][many-1]=MAN;
            mainmap->mapNow[manx][many-2]=BOX;
            mainmap->man_v--;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
        }
    }
    else if((mainmap->mapNow[manx][many-1]==GOAL)||(mainmap->mapNow[manx][many-1]==GROUND))
    {
        if (map[mainmap->levelNow][manx][many]==BOX)
            mainmap->mapNow[manx][many]=GROUND;
        else
            mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
        mainmap->mapNow[manx][many-1]=MAN;
        mainmap->man_v--;
        mainmap->stepNow++;
        stepLCDShow();
        mainmap->update();
    }
}
void MainWindow::boxNumCheck()
{
    if(boxNum==box[mainmap->levelNow])
    {
        endGameAction->setEnabled(false);
        restartGameAction->setEnabled(false);
        restartButton->setEnabled(false);
        if(mainmap->levelNow==LEVELNUM)
        {
            QMessageBox::information(this,tr("恭喜通关"),tr("恭喜你已通关!"),QMessageBox::Ok);
            mainmap->levelNow=0;
            mainmap->stepNow=0;
            boxNum=0;
            mainmap->BeginOrEnd=1;
            mainmap->update();
        }
        else
        {
            QMessageBox::information(this,tr("恭喜过关"),tr("恭喜你完成本关!进入下一关"),QMessageBox::Ok);
            startGame(mainmap->levelNow+1);
        }
    }
}
 
 
 

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    //***********建立菜单栏***********
    createAction();
    createMenu();
    //***********布局*****************
    widget=new QWidget;
    setCentralWidget(widget);
    mainmap=new mapPaint;
    levelLabel=new QLabel(tr("当前关卡"));
    levelLCD=new QLCDNumber;
    stepLabel=new QLabel(tr("当前行走步数"));
    stepLCD=new QLCDNumber;
    restartButton=new QPushButton(tr("重新开始"));
    connect(restartButton,SIGNAL(clicked()),this,SLOT(restartGameSlot()));
    restartButton->setEnabled(false);
    QVBoxLayout *rightLayout=new QVBoxLayout;
    rightLayout->addWidget(levelLabel);
    rightLayout->addWidget(levelLCD);
    rightLayout->addWidget(stepLabel);
    rightLayout->addWidget(stepLCD);
    rightLayout->addWidget(restartButton);
    rightLayout->addSpacing(MAPV*30-150);
    QHBoxLayout *mainLayout=new QHBoxLayout;
    mainLayout->addWidget(mainmap);
    mainLayout->addLayout(rightLayout);
    widget->setLayout(mainLayout);
    //**************数据初始化*****************
    timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(soundSlot()));
    bells=new QSound("./a.wav");
    mainmap->levelNow=0;
    mainmap->stepNow=0;
    mainmap->man_h=0;
    mainmap->man_v=0;
    mainmap->BeginOrEnd=-1;
    mainmap->update();
    boxNum=0;
    levelLCD->display(mainmap->levelNow);
    stepLCD->display(mainmap->stepNow);
    createMap();
    //**************程序整体设定****************
    setWindowTitle(tr("推箱子小游戏----散云轩出品001"));
    widget->setFocus();
    statusBar()->showMessage(tr("欢迎进入推箱子小游戏。"));
}
void MainWindow::createAction()
{
    beginGameAction=new QAction(tr("开始游戏(B)"),this);
    beginGameAction->setShortcut(QKeySequence("Ctrl+B"));
    beginGameAction->setStatusTip(tr("开始一场新游戏。"));
    connect(beginGameAction,SIGNAL(triggered()),this,SLOT(beginGameSlot()));
    chooseGameAction=new QAction(tr("选择关卡(C)"),this);
    chooseGameAction->setShortcut(QKeySequence("Ctrl+C"));
    chooseGameAction->setStatusTip(tr("选择游戏关卡。"));
    connect(chooseGameAction,SIGNAL(triggered()),this,SLOT(chooseGameSlot()));
    restartGameAction=new QAction(tr("重新开始(R)"),this);
    restartGameAction->setShortcut(QKeySequence("Ctrl+R"));
    restartGameAction->setStatusTip(tr("重新开始本局。"));
    restartGameAction->setEnabled(false);
    connect(restartGameAction,SIGNAL(triggered()),this,SLOT(restartGameSlot()));
    endGameAction=new QAction(tr("结束游戏(E)"),this);
    endGameAction->setShortcut(QKeySequence("Ctrl+E"));
    endGameAction->setStatusTip(tr("结束当前游戏。"));
    endGameAction->setEnabled(false);
    connect(endGameAction,SIGNAL(triggered()),this,SLOT(endGameSlot()));
    openMusicAction=new QAction(tr("打开音乐(O)"),this);
    openMusicAction->setShortcut(QKeySequence(tr("Ctrl+O")));
    openMusicAction->setStatusTip(tr("开启音乐。"));
    connect(openMusicAction,SIGNAL(triggered()),this,SLOT(openMusicSlot()));
    closeMusicAction=new QAction(tr("关闭音乐(P)"),this);
    closeMusicAction->setShortcut(QKeySequence("Ctrl+P"));
    closeMusicAction->setStatusTip(tr("关闭音乐。"));
    closeMusicAction->setEnabled(false);
    connect(closeMusicAction,SIGNAL(triggered()),this,SLOT(closeMusicSlot()));
    aboutAction=new QAction(tr("关于我们"),this);
    aboutAction->setShortcut(QKeySequence("Ctrl+A"));
    aboutAction->setStatusTip(tr("关于我们的信息。"));
    connect(aboutAction,SIGNAL(triggered()),this,SLOT(aboutSlot()));
}
void MainWindow::createMenu()
{
    gameMenu=menuBar()->addMenu(tr("游戏"));
    gameMenu->addAction(beginGameAction);
    gameMenu->addAction(chooseGameAction);
    gameMenu->addAction(restartGameAction);
    gameMenu->addSeparator();
    gameMenu->addAction(endGameAction);
    musicMenu=menuBar()->addMenu(tr("音乐"));
    musicMenu->addAction(openMusicAction);
    musicMenu->addAction(closeMusicAction);
    helpMenu=menuBar()->addMenu(tr("帮助"));
    helpMenu->addAction(aboutAction);
}
void MainWindow::beginGameSlot()
{
    startGame(1);
}
void MainWindow::chooseGameSlot()
{
    chooseDlg l;
    l.exec();
    chooseNum=l.chooseNum;
    startGame(chooseNum);
}
void MainWindow::startGame(int x)
{
    widget->setFocus();
    endGameAction->setEnabled(true);
    restartGameAction->setEnabled(true);
    restartButton->setEnabled(true);
    mainmap->man_h=man[x][0];
    mainmap->man_v=man[x][1];
    boxNum=0;
    for(int i=0;i<MAPH;i++)
        for(int j=0;j<MAPV;j++)
            mainmap->mapNow[i][j]=map[x][i][j];
    mainmap->mapNow[mainmap->man_h][mainmap->man_v]=MAN;
    mainmap->levelNow=x;
    mainmap->stepNow=0;
    stepLCDShow();
    levelLCDShow();
    mainmap->update();
    levelLCDShow();
}
void MainWindow::restartGameSlot()
{
    startGame(mainmap->levelNow);
}
void MainWindow::endGameSlot()
{
    endGameAction->setEnabled(false);
    restartGameAction->setEnabled(false);
    restartButton->setEnabled(false);
    mainmap->levelNow=0;
    mainmap->stepNow=0;
    boxNum=0;
    mainmap->BeginOrEnd=1;
    mainmap->update();
    QMessageBox::information(this,tr("游戏结束"),tr("游戏已结束。"),QMessageBox::Ok);
}
void MainWindow::openMusicSlot()
{
    openMusicAction->setEnabled(false);
    closeMusicAction->setEnabled(true);
    bells->play();
    timer->start(300000);
}
void MainWindow::soundSlot()
{
    openMusicSlot();
}
void MainWindow::closeMusicSlot()
{
    timer->stop();
    bells->stop();
    closeMusicAction->setEnabled(false);
    openMusicAction->setEnabled(true);
}
void MainWindow::aboutSlot()
{
    QMessageBox::information(this,tr("关于我们"),tr("散云轩出品001号,感谢使用!\n联系方式:QQ 575626476"),QMessageBox::Ok);
}
void MainWindow::createMap()
{
    int i,j;
    //***********第一关*****************
    man[1][0]=8;man[1][1]=7;//人初始位置
    box[1]=4;
    for(i=0;i<MAPH;i++)
        for(j=0;j<MAPV;j++)
            map[1][i][j]=0;
    map[1][4][6]=Q0100; map[1][4][7]=Q0101; map[1][4][8]=Q0001;
    map[1][5][6]=Q1100;map[1][5][7]=GOAL;map[1][5][8]=Q0011;
    map[1][6][6]=Q1100;map[1][6][7]=GROUND;map[1][6][8]=Q0111;
    map[1][6][9]=Q0101; map[1][6][10]=Q0101;map[1][6][11]=Q0001;
    map[1][7][4]=Q0100; map[1][7][5]=Q0101; map[1][7][6]=Q1101;
    map[1][7][7]=BOX; map[1][7][8]=BOX; map[1][7][9]=GROUND;
    map[1][7][10]=GOAL;map[1][7][11]=Q0011;
    map[1][8][4]=Q1100;map[1][8][5]=GOAL;map[1][8][6]=BOX;
    map[1][8][7]=GROUND;map[1][8][8]=GROUND;map[1][8][9]=Q1011;
    map[1][8][10]=Q1010;map[1][8][11]=Q0010;
    map[1][9][4]=Q1000;map[1][9][5]=Q1010;map[1][9][6]=Q1010;
    map[1][9][7]=Q1110;map[1][9][8]=BOX;map[1][9][9]=Q0011;
    map[1][10][7]=Q1100;map[1][10][8]=GOAL;map[1][10][9]=Q0011;
    map[1][11][7]=Q1000;map[1][11][8]=Q1010;map[1][11][9]=Q0010;
    //***************第二关***************
    man[2][0]=6;man[2][1]=9;
    box[2]=3;
    for(i=0;i<MAPH;i++)
        for(j=0;j<MAPV;j++)
            map[2][i][j]=0;
    map[2][3][8]=Q0100;map[2][3][12]=Q0001;
    map[2][3][9]=Q0101;map[2][3][10]=Q0101;map[2][3][11]=Q0101;
    map[2][4][4]=Q0100;map[2][4][8]=Q1101;
    map[2][4][5]=Q0101;map[2][4][6]=Q0101;map[2][4][7]=Q0101;
    map[2][4][9]=GROUND;map[2][4][10]=GROUND;map[2][4][11]=GROUND;
    map[2][4][12]=Q0011;
    map[2][5][4]=Q1100;map[2][5][5]=GROUND;map[2][5][6]=GROUND;
    map[2][5][7]=Q1111;map[2][5][8]=Q1111;map[2][5][9]=BOX;
    map[2][5][10]=BOX;map[2][5][11]=GROUND;map[2][5][12]=Q0011;
    map[2][6][4]=Q1100;map[2][6][12]=Q0011;
    map[2][6][5]=GROUND;map[2][6][6]=GROUND;map[2][6][7]=GROUND;map[2][6][8]=BOX;
    map[2][6][9]=GROUND;map[2][6][10]=GROUND;map[2][6][11]=GROUND;
    map[2][7][4]=Q1100;map[2][7][8]=Q1011;map[2][7][12]=Q0010;
    map[2][7][5]=GROUND;map[2][7][6]=GROUND;map[2][7][7]=GROUND;
    map[2][7][9]=Q1010;map[2][7][10]=Q1010;map[2][7][11]=Q1010;
    map[2][8][4]=Q1000;map[2][8][5]=Q1110;map[2][8][6]=Q1111;
    map[2][8][7]=GROUND;map[2][8][8]=Q0011;
    map[2][9][5]=Q1100;map[2][9][6]=GROUND;map[2][9][7]=GROUND;
    map[2][9][8]=Q0111;map[2][9][9]=Q0101;map[2][9][10]=Q0001;
    map[2][10][5]=Q1100;map[2][10][6]=GROUND;map[2][10][7]=GOAL;
    map[2][10][8]=GOAL;map[2][10][9]=GOAL;map[2][10][10]=Q0011;
    map[2][11][5]=Q1000;map[2][11][10]=Q0010;
    map[2][11][6]=Q1010;map[2][11][7]=Q1010;map[2][11][8]=Q1010;map[2][11][9]=Q1010;
    //********************第三关*********************************
    man[3][0]=5;man[3][1]=8;
    box[3]=4;
    for(i=0;i<MAPH;i++)
        for(j=0;j<MAPV;j++)
            map[3][i][j]=0;
    map[3][3][6]=Q0100;map[3][3][9]=Q0001;map[3][3][7]=Q0101;map[3][3][8]=Q0101;
    map[3][4][5]=Q0100;map[3][4][6]=Q1101;map[3][4][7]=GROUND;map[3][4][8]=GROUND;
    map[3][4][9]=Q0111;map[3][4][10]=Q0101;map[3][4][11]=Q0001;
    map[3][5][5]=Q1100;map[3][5][6]=GOAL;map[3][5][7]=GOAL;map[3][5][8]=GROUND;
    map[3][5][9]=BOX;map[3][5][10]=GROUND;map[3][5][11]=Q0011;
    map[3][6][5]=Q1100;map[3][6][6]=GOAL;map[3][6][7]=GOAL;map[3][6][8]=GROUND;
    map[3][6][9]=Q1111;map[3][6][10]=GROUND;map[3][6][11]=Q0011;
    map[3][7][5]=Q1100;map[3][7][6]=Q1111;map[3][7][7]=Q1111;map[3][7][8]=BOX;
    map[3][7][9]=Q1111;map[3][7][10]=GROUND;map[3][7][11]=Q0011;
    map[3][8][5]=Q1100;map[3][8][6]=GROUND;map[3][8][7]=GROUND;map[3][8][8]=GROUND;
    map[3][8][9]=Q1111;map[3][8][10]=GROUND;map[3][8][11]=Q0011;
    map[3][9][5]=Q1100;map[3][9][6]=GROUND;map[3][9][7]=BOX;map[3][9][8]=GROUND;
    map[3][9][9]=GROUND;map[3][9][10]=GROUND;map[3][9][11]=Q0011;
    map[3][10][5]=Q1100;map[3][10][6]=GROUND;map[3][10][7]=GROUND;map[3][10][8]=BOX;
    map[3][10][9]=GROUND;map[3][10][10]=Q1011;map[3][10][11]=Q0010;
    map[3][11][5]=Q1000;map[3][11][6]=Q1010;map[3][11][7]=Q1110;map[3][11][8]=GROUND;
    map[3][11][9]=GROUND;map[3][11][10]=Q0011;
    map[3][12][7]=Q1000;map[3][12][8]=Q1010;map[3][12][9]=Q1010;map[3][12][10]=Q0010;
}
void MainWindow::levelLCDShow()
{
    levelLCD->display(mainmap->levelNow);
}
void MainWindow::stepLCDShow()
{
    stepLCD->display(mainmap->stepNow);
}
void MainWindow::keyPressEvent(QKeyEvent *e)
{
    if(!(mainmap->levelNow==0))
    {
        switch (e->key())
        {
        case Qt::Key_Up:keyUp();break;
        case Qt::Key_Left:keyLeft();break;
        case Qt::Key_Right:keyRight();break;
        case Qt::Key_Down:keyDown();break;
        case Qt::Key_W:keyUp();break;
        case Qt::Key_A:keyLeft();break;
        case Qt::Key_D:keyRight();break;
        case Qt::Key_S:keyDown();break;
        default:break;
        }
    }
}
void MainWindow::keyUp()
{
    int manx=mainmap->man_h;
    int many=mainmap->man_v;
    if((mainmap->mapNow[manx][many+1]==BOX)||(mainmap->mapNow[manx][many+1]==GET))
    {
        if(mainmap->mapNow[manx][many+2]==GOAL)
        {
            bool t=false;
            if(mainmap->mapNow[manx][many+1]==BOX)
            {
                boxNum++;t=true;
            }
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx][many+1]=MAN;
            mainmap->mapNow[manx][many+2]=GET;
            mainmap->man_v++;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
            if(t)
                boxNumCheck();
        }
        else if(mainmap->mapNow[manx][many+2]==GROUND)
        {
            if(mainmap->mapNow[manx][many+1]==GET)
                boxNum--;
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx][many+1]=MAN;
            mainmap->mapNow[manx][many+2]=BOX;
            mainmap->man_v++;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
        }
    }
    else if((mainmap->mapNow[manx][many+1]==GOAL)||(mainmap->mapNow[manx][many+1]==GROUND))
    {
        if (map[mainmap->levelNow][manx][many]==BOX)
            mainmap->mapNow[manx][many]=GROUND;
        else
            mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
        mainmap->mapNow[manx][many+1]=MAN;
        mainmap->man_v++;
        mainmap->stepNow++;
        stepLCDShow();
        mainmap->update();
    }
}
void MainWindow::keyLeft()
{
    int manx=mainmap->man_h;
    int many=mainmap->man_v;
    if((mainmap->mapNow[manx-1][many]==BOX)||(mainmap->mapNow[manx-1][many]==GET))
    {
        if(mainmap->mapNow[manx-2][many]==GOAL)
        {
            bool t=false;
            if(mainmap->mapNow[manx-1][many]==BOX)
            {
                boxNum++;t=true;
            }
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx-1][many]=MAN;
            mainmap->mapNow[manx-2][many]=GET;
            mainmap->man_h--;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
            if(t)
                boxNumCheck();
        }
        else if(mainmap->mapNow[manx-2][many]==GROUND)
        {
            if(mainmap->mapNow[manx-1][many]==GET)
                boxNum--;
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx-1][many]=MAN;
            mainmap->mapNow[manx-2][many]=BOX;
            mainmap->man_h--;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
        }
    }
    else if((mainmap->mapNow[manx-1][many]==GOAL)||(mainmap->mapNow[manx-1][many]==GROUND))
    {
        if (map[mainmap->levelNow][manx][many]==BOX)
            mainmap->mapNow[manx][many]=GROUND;
        else
            mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
        mainmap->mapNow[manx-1][many]=MAN;
        mainmap->man_h--;
        mainmap->stepNow++;
        stepLCDShow();
        mainmap->update();
    }
}
void MainWindow::keyRight()
{
    int manx=mainmap->man_h;
    int many=mainmap->man_v;
    if((mainmap->mapNow[manx+1][many]==BOX)||(mainmap->mapNow[manx+1][many]==GET))
    {
        if(mainmap->mapNow[manx+2][many]==GOAL)
        {
            bool t=false;
            if(mainmap->mapNow[manx+1][many]==BOX)
            {
                boxNum++;t=true;
            }
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx+1][many]=MAN;
            mainmap->mapNow[manx+2][many]=GET;
            mainmap->man_h++;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
            if(t)
                boxNumCheck();
        }
        else if(mainmap->mapNow[manx+2][many]==GROUND)
        {
            if(mainmap->mapNow[manx+1][many]==GET)
                boxNum--;
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx+1][many]=MAN;
            mainmap->mapNow[manx+2][many]=BOX;
            mainmap->man_h++;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
        }
    }
    else if((mainmap->mapNow[manx+1][many]==GOAL)||(mainmap->mapNow[manx+1][many]==GROUND))
    {
        if (map[mainmap->levelNow][manx][many]==BOX)
            mainmap->mapNow[manx][many]=GROUND;
        else
            mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
        mainmap->mapNow[manx+1][many]=MAN;
        mainmap->man_h++;
        mainmap->stepNow++;
        stepLCDShow();
        mainmap->update();
    }
}
void MainWindow::keyDown()
{
    int manx=mainmap->man_h;
    int many=mainmap->man_v;
    if((mainmap->mapNow[manx][many-1]==BOX)||(mainmap->mapNow[manx][many-1]==GET))
    {
        if(mainmap->mapNow[manx][many-2]==GOAL)
        {
            bool t=false;
            if(mainmap->mapNow[manx][many-1]==BOX)
            {
                boxNum++;t=true;
            }
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx][many-1]=MAN;
            mainmap->mapNow[manx][many-2]=GET;
            mainmap->man_v--;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
            if(t)
                boxNumCheck();
        }
        else if(mainmap->mapNow[manx][many-2]==GROUND)
        {
            if(mainmap->mapNow[manx][many-1]==GET)
                boxNum--;
            if (map[mainmap->levelNow][manx][many]==BOX)
                mainmap->mapNow[manx][many]=GROUND;
            else
                mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
            mainmap->mapNow[manx][many-1]=MAN;
            mainmap->mapNow[manx][many-2]=BOX;
            mainmap->man_v--;
            mainmap->stepNow++;
            stepLCDShow();
            mainmap->update();
        }
    }
    else if((mainmap->mapNow[manx][many-1]==GOAL)||(mainmap->mapNow[manx][many-1]==GROUND))
    {
        if (map[mainmap->levelNow][manx][many]==BOX)
            mainmap->mapNow[manx][many]=GROUND;
        else
            mainmap->mapNow[manx][many]=map[mainmap->levelNow][manx][many];
        mainmap->mapNow[manx][many-1]=MAN;
        mainmap->man_v--;
        mainmap->stepNow++;
        stepLCDShow();
        mainmap->update();
    }
}
void MainWindow::boxNumCheck()
{
    if(boxNum==box[mainmap->levelNow])
    {
        endGameAction->setEnabled(false);
        restartGameAction->setEnabled(false);
        restartButton->setEnabled(false);
        if(mainmap->levelNow==LEVELNUM)
        {
            QMessageBox::information(this,tr("恭喜通关"),tr("恭喜你已通关!"),QMessageBox::Ok);
            mainmap->levelNow=0;
            mainmap->stepNow=0;
            boxNum=0;
            mainmap->BeginOrEnd=1;
            mainmap->update();
        }
        else
        {
            QMessageBox::information(this,tr("恭喜过关"),tr("恭喜你完成本关!进入下一关"),QMessageBox::Ok);
            startGame(mainmap->levelNow+1);
        }
    }
}
 
#ifndef MAPPAINT_H
#define MAPPAINT_H
#include <QWidget>
#include <QPainter>
#include <QPixmap>
#include <QMessageBox>
#include "define.h"
class mapPaint : public QWidget
{
    Q_OBJECT
public:
    explicit mapPaint(QWidget *parent = 0);
    void paintEvent(QPaintEvent *);
    int map_h,map_v;
    int levelNow;
    int stepNow;
    int man_h,man_v;
    int mapNow[MAPH][MAPV];
    QPixmap *pain[19];
    int BeginOrEnd;
    void paintUp_3(int x_old,int x_new);
    void paintUp_2(int x_old);
};
#endif // MAPPAINT_H
 
#include "mappaint.h"
mapPaint::mapPaint(QWidget *parent) :
    QWidget(parent)
{
    map_h=MAPH*30;
    map_v=MAPV*30;
    setMinimumSize(map_h,map_v);
    pain[0]=new QPixmap("./0000.png");
    pain[1]=new QPixmap("./0001.png");
    pain[2]=new QPixmap("./0010.png");
    pain[3]=new QPixmap("./0011.png");
    pain[4]=new QPixmap("./0100.png");
    pain[5]=new QPixmap("./0101.png");
    pain[6]=new QPixmap("./box.png");
    pain[7]=new QPixmap("./0111.png");
    pain[8]=new QPixmap("./1000.png");
    pain[9]=new QPixmap("./goal.png");
    pain[10]=new QPixmap("./1010.png");
    pain[11]=new QPixmap("./1011.png");
    pain[12]=new QPixmap("./1100.png");
    pain[13]=new QPixmap("./1101.png");
    pain[14]=new QPixmap("./1110.png");
    pain[15]=new QPixmap("./1111.png");
    pain[16]=new QPixmap("./ground.png");
    pain[17]=new QPixmap("./get.png");
    pain[18]=new QPixmap("./man.png");
}
void mapPaint::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.translate(0,map_v);
    if(levelNow==0)
    {
        if(BeginOrEnd==-1)
        {
            QPixmap begin("./begin.png");
            p.drawPixmap(0,-map_v,begin);
        }
        if(BeginOrEnd==1)
        {
            QPixmap end("./end.png");
            p.drawPixmap(0,-map_v,end);
        }
    }
    else
    {
        int i,j;
        for(i=0;i<MAPH;i++)
            for(j=0;j<MAPV;j++)
            {
                QPixmap l=*pain[mapNow[i][j]];
                p.drawPixmap(i*30,-j*30,l);
            }
    }
}
 
 
原创粉丝点击