社区讨论

关于ChatGPT

灌水区参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lrodg74m
此快照首次捕获于
2024/01/22 11:32
2 年前
此快照最后确认于
2024/01/22 15:07
2 年前
查看原帖
今天叫ChatGPT写了个游戏,结果不能用notpade运行,有人能告诉我他写了个啥东西吗?为什么运行不了?
CPP
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <vector>
#include <algorithm>

// 角色类:存储角色的属性和状态
class Character {
public:
    Character(const std::string& name, int maxHealth, int attack) :
        mName(name), mMaxHealth(maxHealth), mHealth(maxHealth), mAttack(attack) {}

    const std::string& getName() const { return mName; }
    int getHealth() const { return mHealth; }
    int getMaxHealth() const { return mMaxHealth; }
    int getAttack() const { return mAttack; }

    void takeDamage(int damage) { mHealth -= damage; }
    void heal(int amount) { mHealth = std::min(mHealth + amount, mMaxHealth); }

private:
    std::string mName;
    int mMaxHealth;
    int mHealth;
    int mAttack;
};

// 地图类:存储地图数据和当前位置
class Map {
public:
    enum TileType {
        TILE_EMPTY,
        TILE_MONSTER,
        TILE_TREASURE
    };

    Map(int size) : mSize(size), mPlayerPos(0, 0) {
        mTiles.resize(size * size);
    }

    void generate() {
        // 随机生成地图
        for (int i = 0; i < mTiles.size(); i++) {
            if (rand() % 10 == 0) {
                mTiles[i] = TILE_MONSTER;
            } else if (rand() % 10 == 1) {
                mTiles[i] = TILE_TREASURE;
            } else {
                mTiles[i] = TILE_EMPTY;
            }
        }

        // 将起点和终点设置为 TILE_EMPTY
        setTile(0, 0, TILE_EMPTY);
        setTile(mSize - 1, mSize - 1, TILE_EMPTY);
    }

    TileType getTile(int x, int y) const {
        return mTiles[y * mSize + x];
    }

    void setTile(int x, int y, TileType type) {
        mTiles[y * mSize + x] = type;
    }

    std::pair<int, int> getPlayerPos() const {
        return mPlayerPos;
    }

    void movePlayer(int dx, int dy) {
        int x = mPlayerPos.first + dx;
        int y = mPlayerPos.second + dy;

        if (x >= 0 && x < mSize && y >= 0 && y < mSize) {
            mPlayerPos = std::make_pair(x, y);
        }
    }

private:
    int mSize;
    std::vector<TileType> mTiles;
    std::pair<int, int> mPlayerPos;
};

// 游戏类:管理游戏的整个流程
class Game {
public:
    Game(const std::string& playerName) :
        mPlayer(playerName, 100, 10), mMap(10) {}

    void run() {
        std::cout << "欢迎来到探险游戏!\n";
        std::cout << "你的目标是到达宝藏并回到起点。\n\n";

        // 随机生成地图
        srand(time(0));
        mMap.generate();

        // 显示地图和玩家位置
        displayMap();

        // 循环执行每一步,直到玩家到达终点或死亡
        while (true) {
            char choice;

            // 显示角色属性和菜单
            displayStats();
            std::cout << "请选择动作(w/a/s/d):";
            std::cin >> choice;
            std::cout << "\n";

            // 移动玩家
            int dx = 0;
            int dy = 0;
            switch (choice) {
            case 'w': dy = -1; break;
            case 'a': dx = -1; break;
            case 's': dy = 1; break;
            case 'd': dx = 1; break;
            }

            mMap.movePlayer(dx, dy);
            std::pair<int, int> playerPos = mMap.getPlayerPos();

            // 处理当前位置的事件
            switch (mMap.getTile(playerPos.first, playerPos.second)) {
            case Map::TILE_MONSTER:
                fightEnemy();
                break;
            case Map::TILE_TREASURE:
                collectTreasure();
                break;
            }

            // 检查游戏结束条件
            if (playerPos == std::make_pair(mMap.getSize() - 1, mMap.getSize() - 1)) {
                std::cout << "恭喜你找到了宝藏!\n";
                break;
            } else if (mPlayer.getHealth() <= 0) {
                std::cout << "你死了!游戏结束。\n";
                break;
            }

            // 显示地图和玩家位置
            displayMap();
        }
    }

private:
    Character mPlayer;
    Map mMap;

    void displayMap() const {
        std::cout << "地图:\n";

        for (int y = 0; y < mMap.getSize(); y++) {
            for (int x = 0; x < mMap.getSize(); x++) {
                if (std::make_pair(x, y) == mMap.getPlayerPos()) {
                    std::cout << "P";
                } else {
                    switch (mMap.getTile(x, y)) {
                    case Map::TILE_EMPTY: std::cout << "."; break;
                    case Map::TILE_MONSTER: std::cout << "M"; break;
                    case Map::TILE_TREASURE: std::cout << "T"; break;
                    }
                }
            }

            std::cout << "\n";
        }

        std::cout << "\n";
    }

    void displayStats() const {
        std::cout << "角色属性:\n";
        std::cout << "姓名:" << mPlayer.getName() << "\n";
        std::cout << "生命值:" << mPlayer.getHealth() << "/" << mPlayer.getMaxHealth() << "\n";
        std::cout << "攻击力:" << mPlayer.getAttack() << "\n\n";
    }

    void fightEnemy() {
        std::cout << "你遇到了一个怪物!\n";

        int enemyHealth = rand() % 20 + 10;
        int enemyAttack = rand() % 5 + 5;

        while (true) {
            std::cout << "你的生命值:" << mPlayer.getHealth() << "/" << mPlayer.getMaxHealth() << "\n";
            std::cout << "怪物的生命值:" << enemyHealth << "\n\n";

            char choice;
            std::cout << "请选择动作(a/h):";
            std::cin >> choice;
            std::cout << "\n";

            if (choice == 'a') {
                int damage = mPlayer.getAttack();
                std::cout << "你攻击了怪物,造成了 " << damage << " 点伤害。\n";
                enemyHealth -= damage;
            } else if (choice == 'h') {
                int healAmount = rand() % 10 + 5;
                mPlayer.heal(healAmount);
                std::cout << "你恢复了 " << healAmount << " 点生命值。\n";
            }

            if (enemyHealth <= 0) {
                std::cout << "你打败了怪物!\n";
                break;
            }

            int damage = enemyAttack;
            std::cout << "怪物攻击了你,造成了 " << damage << " 点伤害。\n";
            mPlayer.takeDamage(damage);

            if (mPlayer.getHealth() <= 0) {
                std::cout << "你被怪物打败了!\n";
                break;
            }
        }
    }

    void collectTreasure() {
        int treasureAmount = rand() % 30 + 10;
        std::cout << "你找到了一个宝箱,里面有 " << treasureAmount << " 个金币!\n";
    }
};

int main() {
    std::string playerName;
    std::cout << "请输入你的姓名:";
    std::cin >> playerName;

    Game game(playerName);
    game.run();

    return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...