基础版狼人杀c++游戏

目前支持狼人、预言家、女巫、猎人和村民这些角色,下午出进阶版的

#include <iostream>

#include <vector>

#include <string>

#include <algorithm>

#include <random>

enum class Role {

    WEREWOLF,

    SEER,

    WITCH,

    HUNTER,

    VILLAGER

};

class Player {

public:

    Player(int id, Role role) : id(id), role(role), alive(true) {}

    int getId() const { return id; }

    Role getRole() const { return role; }

    bool isAlive() const { return alive; }

    void kill() { alive = false; }

private:

    int id;

    Role role;

    bool alive;

};

class Game {

public:

    Game(int numPlayers) : day(1) {

        if (numPlayers < 4 || numPlayers > 18) {

            throw std::invalid_argument("Number of players must be between 4 and 18.");

        }

        setupGame(numPlayers);

    }

    void start() {

        while (!isGameOver()) {

            nightPhase();

            dayPhase();

            ++day;

        }

        announceWinner();

    }

private:

    std::vector<Player> players;

    int day;

    void setupGame(int numPlayers) {

        // Simplified role distribution logic

        int werewolves = numPlayers / 3;

        int seers = 1;

        int witches = 1;

        int hunters = 1;

        int villagers = numPlayers - werewolves - seers - witches - hunters;

        for (int i = 0; i < werewolves; ++i) {

            players.emplace_back(i + 1, Role::WEREWOLF);

        }

        for (int i = 0; i < seers; ++i) {

            players.emplace_back(players.size() + 1, Role::SEER);

        }

        for (int i = 0; i < witches; ++i) {

            players.emplace_back(players.size() + 1, Role::WITCH);

        }

        for (int i = 0; i < hunters; ++i) {

            players.emplace_back(players.size() + 1, Role::HUNTER);

        }

        for (int i = 0; i < villagers; ++i) {

            players.emplace_back(players.size() + 1, Role::VILLAGER);

        }

        std::shuffle(players.begin(), players.end(), std::default_random_engine());

    }

    void nightPhase() {

        std::cout << "Night " << day << ": \n";

        // Wolf chooses someone to kill

        int targetId = chooseTarget(Role::WEREWOLF);

        auto& target = findPlayerById(targetId);

        if (target.isAlive()) {

            target.kill();

            std::cout << "Wolf kills player " << target.getId() << ".\n";

        } else {

            std::cout << "Wolf's target was already dead.\n";

        }

        // Seer checks someone

        int checkId = chooseTarget(Role::SEER);

        auto& checkedPlayer = findPlayerById(checkId);

        std::cout << "Seer checks player " << checkedPlayer.getId() << ", who is a ";

        switch (checkedPlayer.getRole()) {

            case Role::WEREWOLF: std::cout << "Werewolf.\n"; break;

            default: std::cout << "Villager.\n"; break;

        }

        // Witch can save or poison someone

        // Placeholder for witch actions

    }

    void dayPhase() {

        std::cout << "Day " << day << ": \n";

        // Players vote to lynch someone

        int lynchId = chooseTarget(Role::VILLAGER); // Simplified voting mechanism

        auto& lynchedPlayer = findPlayerById(lynchId);

        if (lynchedPlayer.isAlive()) {

            lynchedPlayer.kill();

            std::cout << "Player " << lynchedPlayer.getId() << " is lynched by the village.\n";

            // Hunter effect

            if (lynchedPlayer.getRole() == Role::HUNTER) {

                int hunterTargetId = chooseTarget(Role::HUNTER);

                auto& hunterTarget = findPlayerById(hunterTargetId);

                if (hunterTarget.isAlive()) {

                    hunterTarget.kill();

                    std::cout << "Hunter kills player " << hunterTarget.getId() << " before dying.\n";

                }

            }

        } else {

            std::cout << "Lynching failed as the target was already dead.\n";

        }

    }

    bool isGameOver() {

        int wolves = 0;

        int others = 0;

        for (const auto& player : players) {

            if (player.isAlive()) {

                if (player.getRole() == Role::WEREWOLF) {

                    ++wolves;

                } else {

                    ++others;

                }

            }

        }

        return wolves >= others || wolves == 0;

    }

    void announceWinner() {

        if (std::all_of(players.begin(), players.end(), [](const Player& p) { return p.getRole() != Role::WEREWOLF && p.isAlive(); })) {

            std::cout << "Villagers win!\n";

        } else {

            std::cout << "Werewolves win!\n";

        }

    }

    int chooseTarget(Role actingRole) {

        // Simplified input handling

        int targetId;

        do {

            std::cout << "Choose a target for " << static_cast<int>(actingRole) << ": ";

            std::cin >> targetId;

        } while (findPlayerById(targetId).getId() != targetId || !findPlayerById(targetId).isAlive());

        return targetId;

    }

    Player& findPlayerById(int id) {

        for (auto& player : players) {

            if (player.getId() == id) {

                return player;

            }

        }

        throw std::runtime_error("Player not found");

    }

};

int main() {

    try {

        int numPlayers;

        std::cout << "Enter number of players (4-18): ";

        std::cin >> numPlayers;

        Game game(numPlayers);

        game.start();

    } catch (const std::exception& e) {

        std::cerr << "Error: " << e.what() << '\n';

    }

    return 0;

}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呱呱呱~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值