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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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;elsemainmap->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_OBJECTpublic: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);}}}
- QT 推箱子小游戏编写
- Qt实现推箱子小游戏
- 推箱子小游戏
- 推箱子小游戏--控制台
- 推箱子小游戏
- 推箱子小游戏源码
- 推箱子小游戏实现
- C++ 小游戏之推箱子
- 推箱子小游戏v1.5
- Java实现推箱子小游戏
- c语言小游戏,推箱子
- js实现推箱子小游戏
- JAVA课程设计 推箱子小游戏
- 做推箱子小游戏的一些总结
- 012-C语言小游戏之推箱子
- C语言实现推箱子小游戏
- 微信HTML5小游戏之推箱子
- 【Java】Java实现推箱子的小游戏
- ISCC 2012 真实关第一题
- 在Eclipse中配置Struts2第一个HelloWorld项目
- strings.xml中占位符使用
- JDOM入门实例:读取与创建xml文档
- ubuntu下安装mysql
- QT 推箱子小游戏编写
- Eclipse快捷键大全(转载)
- Android视频慢慢来1
- gridControl1 中添加checkbox 列
- MFC中动态创建对象的一点思考
- ibatis数据库连接配置
- 有序 循环数组的二分查找
- 解QC9不支持IE 7,IE 8访问
- 你一生追求的是利益还是快乐?