推箱子c++代码

以下是一个简单的推箱子游戏的C++代码示例:

#include <iostream>
#include <vector>

using namespace std;

const int ROWS = 5;
const int COLS = 5;

struct Position {
    int row;
    int col;
};

class Game {
private:
    vector<vector<char>> board;
    Position player;
    vector<Position> boxes;
    vector<Position> targets;

public:
    Game() {
        board.resize(ROWS, vector<char>(COLS, ' '));
        player.row = 0;
        player.col = 0;
    }

    void initialize() {
        // 设置初始游戏板
        board[1][1] = '#';
        board[2][2] = '#';
        board[3][3] = '#';
        board[4][4] = '#';

        // 设置初始箱子位置
        boxes.push_back({1, 2});
        boxes.push_back({2, 3});
        boxes.push_back({3, 4});

        // 设置目标位置
        targets.push_back({2, 1});
        targets.push_back({3, 2});
        targets.push_back({4, 3});

        // 设置玩家位置
        player.row = 0;
        player.col = 0;
    }

    void drawBoard() {
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                if (player.row == i && player.col == j) {
                    cout << "P ";
                } else if (isBox(i, j)) {
                    cout << "B ";
                } else if (isTarget(i, j)) {
                    cout << "T ";
                } else {
                    cout << board[i][j] << " ";
                }
            }
            cout << endl;
        }
    }

    bool isBox(int row, int col) {
        for (const auto& box : boxes) {
            if (box.row == row && box.col == col) {
                return true;
            }
        }
        return false;
    }

    bool isTarget(int row, int col) {
        for (const auto& target : targets) {
            if (target.row == row && target.col == col) {
                return true;
            }
        }
        return false;
    }

    bool isGameOver() {
        for (const auto& box : boxes) {
            if (!isTarget(box.row, box.col)) {
                return false;
            }
        }
        return true;
    }

    void movePlayer(int row, int col) {
        int newRow = player.row + row;
        int newCol = player.col + col;

        if (newRow >= 0 && newRow < ROWS && newCol >= 0 && newCol < COLS && board[newRow][newCol] != '#') {
            player.row = newRow;
            player.col = newCol;
        }
    }

    void moveBox(int row, int col) {
        int newRow = player.row + row;
        int newCol = player.col + col;

        for (auto& box : boxes) {
            if (box.row == newRow && box.col == newCol) {
                int newBoxRow = newRow + row;
                int newBoxCol = newCol + col;

                if (newBoxRow >= 0 && newBoxRow < ROWS && newBoxCol >= 0 && newBoxCol < COLS && board[newBoxRow][newBoxCol] != '#' && !isBox(newBoxRow, newBoxCol)) {
                    box.row = newBoxRow;
                    box.col = newBoxCol;
                }
                break;
            }
        }
    }

    void play() {
        initialize();

        while (!isGameOver()) {
            drawBoard();

            char move;
            cout << "Enter your move (w/a/s/d): ";
            cin >> move;

            switch (move) {
                case 'w':
                    movePlayer(-1, 0);
                    break;
                case 'a':
                    movePlayer(0, -1);
                    break;
                case 's':
                    movePlayer(1, 0);
                    break;
                case 'd':
                    movePlayer(0, 1);
                    break;
                default:
                    cout << "Invalid move!" << endl;
                    continue;
            }

            moveBox(-1, 0);
            moveBox(0, -1);
            moveBox(1, 0);
            moveBox(0, 1);
        }

        cout << "Congratulations! You won the game!" << endl;
    }
};

int main() {
    Game game;
    game.play();

    return 0;
}

这个代码实现了一个简单的推箱子游戏。游戏板由一个5x5的二维字符向量表示,玩家用字符 ‘P’ 表示,箱子用字符 ‘B’ 表示,目标位置用字符 ‘T’ 表示,墙壁用字符 ‘#’ 表示。玩家可以通过输入 ‘w’、’a’、’s’、’d’ 分别控制上、左、下、右移动玩家,玩家移动时会同时移动箱子。当所有箱子都被移动到目标位置时,游戏结束。

以上代码实现了推箱子游戏的基本功能,但还可以进一步完善和优化。以下是一些可能的改进和补充:

添加关卡系统:可以通过读取关卡文件或者使用随机生成的关卡来增加游戏的难度和可玩性。

添加计分系统:可以根据玩家完成游戏所需的步数或时间来计算得分。

添加撤销功能:允许玩家撤销上一步的移动操作。

添加提示功能:当玩家陷入困境时,可以提供一些提示来帮助玩家解决难题。

添加动画效果:可以使用图形库或动画库来为游戏添加一些动画效果,使游戏更加生动。

添加音效和背景音乐:可以为游戏添加一些音效和背景音乐,增强游戏的氛围。

添加多人模式:允许多个玩家同时参与游戏,可以通过网络连接或本地多人模式实现。

添加存档和读档功能:允许玩家保存当前游戏进度,并在需要时读取存档继续游戏。

优化算法:可以优化箱子移动的算法,减少不必要的计算和判断,提高游戏的性能。

以上是一些可能的改进和补充,根据实际需求和个人喜好,可以选择适合的改进方向来完善推箱子游戏。