主要使用以下几个类:
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[