目前支持狼人、预言家、女巫、猎人和村民这些角色,下午出进阶版的
#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;
}