QT 推箱子小游戏编写

本文介绍如何利用QT框架进行游戏开发,以推箱子为例,讲解信号与槽机制、音乐集成以及定时器的使用,适合对QT编程感兴趣的读者。
摘要由CSDN通过智能技术生成

 

 
 
主要使用以下几个类:
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[
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值