一. 实现效果图:
初始:

箱子放到正确的位置:

游戏失败:

游戏成功:

二. 工程目录

三. 代码
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

最低0.47元/天 解锁文章
1825

被折叠的 条评论
为什么被折叠?



