Qt实现简单的推箱子游戏

一. 实现效果图:

初始:

箱子放到正确的位置: 

游戏失败: 

游戏成功:

二. 工程目录

三.  代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "map.h"
#include "person.h"
#include "postion.h"
#include <QMainWindow>
#include <QPaintEvent>
#include <QPainter>
#include <QKeyEvent>
#include <QDebug>
#include <QFont>
#include <QPen>

#define SCREEN_WIDTH 960 // 屏幕宽度
#define SCREEN_HEIGHT 768 // 屏幕高度
#define LINE 9 // 地图行数
#define COLUMN 12 // 地图列数
#define LEVEL 1 // 关卡
#define SIZE 61 // 格子(地图上墙,箱子...)尺寸
#define X_SHIFT 110 // x偏移量
#define Y_SHIFT 130 // y偏移量
#define BLACKGROUND_PATH ":/images/blackground" // 背景图片
#define WALL_PATH ":/images/wall" // 墙图片
#define FLOOR_PATH ":/images/floor" // 空地图片
#define DES_PATH ":/images/des" // 目的图片
#define MAN_PATH ":/images/man" // 人图片
#define BOX_PATH ":/images/box" // 箱子图片
#define BOX_1_PATH ":/images/box_1" // 箱子推到指定位置图片
#define MAX_STEP 65 // 最大步数限制

extern int map[LINE][COLUMN];

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    struct Person man; // 人的位置
    struct Postion pre_pos; // 之前的位置
    int step;
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void initmap();
    void gameControl(enum Direction);
    void changeMap(int line, int column, enum Map);
    bool isOver();
protected:
    void paintEvent(QPaintEvent *);
    void keyPressEvent(QKeyEvent *);
public slots:
    void gameOverControl();
    void gameSuccessControl();
signals:
    void change();
    void gameover();
    void gamesuccess();
};
#endif // MAINWINDOW_H

map.h

#ifndef MAP_H
#define MAP_H

#define LINE 9 // 地图行数
#define COLUMN 12 // 地图列数

enum Map { // 地图属性
    WALL, // 墙
    FLOOR, // 空地
    DES, // 目的地
    MAN, // 人
    BOX, // 箱子
    HIT, // 箱子到达目的地
    NUL = -1 // 记录上一个位置
};

#endif // MAP_H

 person.h

#ifndef PERSON_H
#define PERSON_H


struct Person {
    int x; // 人所在行
    int y; // 人所在列
};

enum Direction { //人的方向
    UP,
    DOWN,
    LEFT,
    RIGHT
};

#endif // PERSON_H

postion.h

#ifndef POSTION_H
#define POSTION_H
#include "map.h"

struct Postion {
    Map p;
};

#endif // POSTION_H

 mainwindow.cpp

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值