狼人杀
2026-03-31 17:20:51
发布于:湖南
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <unistd.h>
using namespace std;
enum Role {
WEREWOLF,
VILLAGER,
SEER,
WITCH,
HUNTER,
GUARDIAN,
IDIOT
};
class Player {
public:
int id;
string name;
Role role;
bool alive;
bool poisoned;
bool saved;
bool voted;
bool isHuman;
vector<string> speeches;
Player(int playerId, const string& playerName)
: id(playerId), name(playerName), alive(true), poisoned(false),
saved(false), voted(false), isHuman(false) {}
string getRoleName() const {
switch(role) {
case WEREWOLF: return "狼人";
case VILLAGER: return "村民";
case SEER: return "预言家";
case WITCH: return "女巫";
case HUNTER: return "猎人";
case GUARDIAN: return "守卫";
case IDIOT: return "**";
default: return "未知";
}
}
};
class WerewolfGame {
private:
vector<Player> players;
vector<int> alivePlayers;
vector<int> deadPlayers;
int dayCount;
bool gameOver;
string winner;
int witchPoisonLeft;
int witchAntidoteLeft;
int lastKilled;
int lastSaved;
int humanPlayerId;
int seerLastCheck;
bool seerLastCheckIsWolf;
public:
WerewolfGame() : dayCount(0), gameOver(false), witchPoisonLeft(1),
witchAntidoteLeft(1), lastKilled(-1), lastSaved(-1),
humanPlayerId(-1), seerLastCheck(-1), seerLastCheckIsWolf(false) {
srand(time(NULL));
}
void addPlayer(const string& name) {
int id = players.size();
players.push_back(Player(id, name));
alivePlayers.push_back(id);
}
void setRandomHumanPlayer() {
if (players.empty()) return;
humanPlayerId = rand() % players.size();
players[humanPlayerId].isHuman = true;
cout << "\n?? 随机真人玩家: " << players[humanPlayerId].name
<< "(编号:" << humanPlayerId+1 << ")" << endl;
usleep(2000000);
}
void assignRoles(int numWerewolves = 3, int numVillagers = 4) {
vector<Role> roles;
int i;
for (i = 0; i < numWerewolves; ++i) roles.push_back(WEREWOLF);
for (i = 0; i < numVillagers; ++i) roles.push_back(VILLAGER);
roles.push_back(SEER);
roles.push_back(WITCH);
roles.push_back(HUNTER);
random_shuffle(roles.begin(), roles.end());
size_t minSize = min(roles.size(), players.size());
for (i = 0; i < minSize; ++i) {
players[i].role = roles[i];
}
}
void displayStatus() {
cout << "\n======= 第 " << dayCount << " 天 =======" << endl;
cout << "存活玩家(" << alivePlayers.size() << "人):" << endl;
size_t i;
for (i = 0; i < alivePlayers.size(); ++i) {
int id = alivePlayers[i];
cout << " " << id+1 << "号:" << players[id].name;
if (players[id].isHuman) cout << "【你】";
cout << endl;
}
if (!deadPlayers.empty()) {
cout << "\n死亡玩家:" << endl;
for (i = 0; i < deadPlayers.size(); ++i) {
int id = deadPlayers[i];
cout << " " << id+1 << "号:" << players[id].name;
if (players[id].poisoned) cout << "(毒死)";
cout << endl;
}
}
cout << "============================\n";
}
int selectTarget(int currentPlayerId) {
vector<int> available;
size_t i;
for (i = 0; i < alivePlayers.size(); ++i) {
int id = alivePlayers[i];
if (id != currentPlayerId && players[id].alive && players[id].role != WEREWOLF) {
available.push_back(id);
}
}
if (available.empty()) return -1;
cout << "可选目标: ";
for (i = 0; i < available.size(); ++i) {
int id = available[i];
cout << id+1 << "(" << players[id].name << ") ";
}
cout << "\n输入编号(0弃权): ";
int input;
while (cin >> input) {
if (input == 0) return -1;
int tar = input - 1;
bool found = false;
for (i = 0; i < available.size(); ++i) {
if (available[i] == tar) {
found = true;
break;
}
}
if (found) return tar;
cout << "无效!重输: ";
}
return -1;
}
string generateSpeech(int playerId) {
Player& p = players[playerId];
vector<string> lines;
if (p.role == SEER) {
if (seerLastCheck != -1) {
lines.push_back("我是预言家!昨夜查验" + players[seerLastCheck].name);
if (seerLastCheckIsWolf) {
lines.push_back(players[seerLastCheck].name + "是狼人!今天全票出他!");
} else {
lines.push_back(players[seerLastCheck].name + "是好人,我保他!");
}
} else {
lines.push_back("我是预言家,昨夜没有查验人,今天看情况投票。");
}
lines.push_back("好人别分票,跟着我投票!");
} else if (p.role == WEREWOLF) {
int tar = selectTarget(playerId);
if (tar != -1) {
lines.push_back("我是好人,我觉得" + players[tar].name + "行为很奇怪。");
lines.push_back("大家留意" + players[tar].name + ",他大概率是狼!");
} else {
lines.push_back("我全程闭眼玩家,跟着好人走。");
}
lines.push_back("我们要把狼人找出来!");
} else if (p.role == WITCH) {
string antidote = (witchAntidoteLeft > 0) ? "还有" : "已用";
string poison = (witchPoisonLeft > 0) ? "还有" : "已用";
lines.push_back("我是女巫,解药" + antidote + ",毒药" + poison);
if (lastKilled != -1) {
lines.push_back("昨夜刀口是" + players[lastKilled].name);
}
lines.push_back("大家谨慎投票,别投错好人。");
} else if (p.role == HUNTER) {
int tar = selectTarget(playerId);
lines.push_back("我是强神猎人,谁踩我我就带走谁!");
if (tar != -1) {
lines.push_back("我怀疑" + players[tar].name + "是狼,优先出他!");
}
} else {
int tar = selectTarget(playerId);
if (tar != -1) {
lines.push_back("我平民,感觉" + players[tar].name + "有点可疑。");
} else {
lines.push_back("闭眼村民,不搞事,听预言家的。");
}
lines.push_back("跟着好人投票就行。");
}
string speech;
if (!lines.empty()) {
speech += "【" + p.name + "】: " + lines[rand() % lines.size()];
if (lines.size() > 1 && (rand() % 2 == 0)) {
speech += " | " + lines[rand() % lines.size()];
}
}
return speech;
}
void playerSpeeches() {
cout << "\n======= 玩家发言阶段(投票前)=======" << endl;
size_t i;
for (i = 0; i < alivePlayers.size(); ++i) {
int id = alivePlayers[i];
if (!players[id].alive) continue;
if (players[id].isHuman) {
cout << "\n【你】" << players[id].name << ",是否发言?(1:是 0:否): ";
int c;
cin >> c;
cin.ignore();
if (c == 1) {
cout << "输入你的发言: ";
string s;
getline(cin, s);
players[id].speeches.push_back(s);
cout << "【你】: " << s << endl;
} else {
cout << "【你】: 跳过发言" << endl;
}
} else {
string s = generateSpeech(id);
players[id].speeches.push_back(s);
cout << s << endl;
}
usleep(800000);
}
cout << "=====================================\n";
}
// 狼人刀人环节(智能切换:玩家手动/AI自动)
void werewolfKill() {
cout << "\n======= 狼人请睁眼 =======" << endl;
vector<int> wolves;
for(size_t i = 0; i < alivePlayers.size(); ++i) {
int id = alivePlayers[i];
if(players[id].role == WEREWOLF) {
wolves.push_back(id);
}
}
if (wolves.empty()) {
cout << "无存活狼人" << endl;
cout << "======= 狼人请闭眼 =======" << endl;
return;
}
cout << "狼人阵营: ";
for(size_t i = 0; i < wolves.size(); ++i) {
int id = wolves[i];
cout << players[id].name << (players[id].isHuman ? "【你】" : "") << " ";
}
cout << endl;
lastKilled = -1;
bool isHumanWerewolf = (players[humanPlayerId].alive && players[humanPlayerId].role == WEREWOLF);
if(isHumanWerewolf) {
// 玩家是狼人:手动选择刀人目标
cout << "【你】请选择刀人目标!" << endl;
int target = selectTarget(humanPlayerId);
if(target != -1) {
lastKilled = target;
cout << "你选择刀杀: " << players[target].name << endl;
} else {
cout << "你选择弃权,狼人空刀!" << endl;
}
} else {
// 玩家不是狼人:AI狼人投票选择刀人目标
cout << "AI狼人开始投票选择刀人目标..." << endl;
vector<int> availableTargets;
for(size_t i = 0; i < alivePlayers.size(); ++i) {
int id = alivePlayers[i];
if(players[id].role != WEREWOLF && players[id].alive) {
availableTargets.push_back(id);
}
}
if(availableTargets.empty()) {
cout << "无可杀目标,狼人空刀!" << endl;
} else {
// AI狼人投票机制:每个狼人选择一个目标,票数最多者被刀
vector<int> votes(players.size(), 0);
for(size_t i = 0; i < wolves.size(); ++i) {
int wolfId = wolves[i];
uniform_int_distribution<int> dist(0, availableTargets.size()-1);
int target = availableTargets[dist(rng)];
votes[target]++;
cout << players[wolfId].name << " 选择刀: " << players[target].name << endl;
}
// 统计投票结果
int maxVotes = 0;
for(size_t i = 0; i < votes.size(); ++i) {
if(votes[i] > maxVotes) {
maxVotes = votes[i];
lastKilled = i;
}
}
if(lastKilled != -1) {
cout << "狼人投票决定刀杀: " << players[lastKilled].name << endl;
} else {
cout << "狼人投票无效,空刀!" << endl;
}
}
}
cout << "======= 狼人请闭眼 =======" << endl;
}
// ====================================================================
void witchAction() {
cout << "\n======= 女巫请睁眼 =======" << endl;
int witchId = -1;
size_t i;
for (i = 0; i < players.size(); ++i) {
if (players[i].role == WITCH && players[i].alive) {
witchId = i;
break;
}
}
if (witchId == -1) {
cout << "女巫已死" << endl;
return;
}
cout << "女巫: " << players[witchId].name << endl;
string killed = (lastKilled == -1) ? "无人" : players[lastKilled].name;
cout << "昨夜死亡: " << killed << endl;
cout << "解药:" << witchAntidoteLeft << " 毒药:" << witchPoisonLeft << endl;
bool save = false, poison = false;
int poisonTar = -1;
if (witchAntidoteLeft > 0 && lastKilled != -1) {
cout << "使用解药?(1:是 0:否): ";
int c;
if (players[witchId].isHuman) {
cin >> c;
} else {
c = rand() % 2;
cout << c << endl;
}
if (c == 1) {
save = true;
witchAntidoteLeft--;
lastSaved = lastKilled;
}
}
if (witchPoisonLeft > 0 && !save) {
cout << "使用毒药?(1:是 0:否): ";
int c;
if (players[witchId].isHuman) {
cin >> c;
} else {
c = rand() % 2;
cout << c << endl;
}
if (c == 1) {
poison = true;
witchPoisonLeft--;
poisonTar = selectTarget(witchId);
}
}
if (lastKilled != -1 && !save) {
killPlayer(lastKilled, "被狼人杀死");
}
if (poisonTar != -1) {
killPlayer(poisonTar, "被女巫毒死");
}
cout << "======= 女巫请闭眼 =======" << endl;
}
void seerCheck() {
cout << "\n======= 预言家请睁眼 =======" << endl;
int seerId = -1;
size_t i;
for (i = 0; i < players.size(); ++i) {
if (players[i].role == SEER && players[i].alive) {
seerId = i;
break;
}
}
if (seerId == -1) {
cout << "预言家已死" << endl;
return;
}
int tar = selectTarget(seerId);
if (tar != -1) {
seerLastCheck = tar;
seerLastCheckIsWolf = (players[tar].role == WEREWOLF);
cout << "查验: " << players[tar].name << " | 身份:" << players[tar].getRoleName() << endl;
} else {
seerLastCheck = -1;
}
cout << "======= 预言家请闭眼 =======" << endl;
}
void dayVote() {
cout << "\n======= 开始投票 =======" << endl;
size_t i;
for (i = 0; i < alivePlayers.size(); ++i) {
players[alivePlayers[i]].voted = false;
}
vector<int> votes(players.size(), 0);
for (i = 0; i < alivePlayers.size(); ++i) {
int voter = alivePlayers[i];
if (!players[voter].alive) continue;
cout << "\n投票: " << players[voter].name << (players[voter].isHuman ? "【你】" : "") << endl;
int tar = selectTarget(voter);
if (tar != -1) {
votes[tar]++;
cout << "投给: " << players[tar].name << endl;
} else {
cout << "弃权" << endl;
}
}
int maxV = 0;
vector<int> cans;
for (i = 0; i < votes.size(); ++i) {
if (votes[i] > maxV) {
maxV = votes[i];
cans.clear();
cans.push_back(i);
} else if (votes[i] == maxV && maxV > 0) {
cans.push_back(i);
}
}
if (cans.empty() || maxV == 0) {
cout << "无人放逐" << endl;
} else if (cans.size() > 1) {
cout << "平票" << endl;
} else {
killPlayer(cans[0], "被投票放逐");
cout << players[cans[0]].name << "被放逐" << endl;
}
cout << "======= 投票结束 =======" << endl;
}
void killPlayer(int id, string r) {
if (!players[id].alive) return;
players[id].alive = false;
deadPlayers.push_back(id);
vector<int>::iterator it = find(alivePlayers.begin(), alivePlayers.end(), id);
if (it != alivePlayers.end()) {
alivePlayers.erase(it);
}
cout << players[id].name << " " << r << endl;
if (players[id].role == HUNTER && r != "被猎人带走") {
hunterSkill(id);
}
}
void hunterSkill(int id) {
cout << "猎人" << players[id].name << "开枪!" << endl;
int tar = selectTarget(id);
if (tar != -1) {
killPlayer(tar, "被猎人带走");
}
}
bool checkGameOver() {
int w = 0, g = 0;
size_t i;
for (i = 0; i < alivePlayers.size(); ++i) {
int id = alivePlayers[i];
if (players[id].role == WEREWOLF) {
w++;
} else {
g++;
}
}
if (w == 0) {
gameOver = true;
winner = "好人阵营";
return true;
}
if (w >= g) {
gameOver = true;
winner = "狼人阵营";
return true;
}
return false;
}
void play() {
cout << "======= 狼人杀游戏开始 =======" << endl;
assignRoles();
cout << "\n【身份分配】" << endl;
size_t i;
for (i = 0; i < players.size(); ++i) {
cout << players[i].name << (players[i].isHuman ? "【你】" : "") << ": " << players[i].getRoleName() << endl;
}
cout << "\n游戏开始,记住身份等待天黑...\n";
usleep(2000000);
while (!gameOver) {
dayCount++;
seerLastCheck = -1;
cout << "\n\n======= 第" << dayCount << "天夜晚 =======";
werewolfKill();
usleep(1000000);
witchAction();
usleep(1000000);
seerCheck();
usleep(1000000);
cout << "\n\n======= 第" << dayCount << "天白天 =======";
displayStatus();
playerSpeeches();
dayVote();
if (checkGameOver()) break;
lastKilled = -1;
lastSaved = -1;
usleep(1000000);
}
cout << "\n\n======= 游戏结束 =======" << endl;
cout << "?? 胜利: " << winner << endl;
cout << "\n最终身份:" << endl;
for (i = 0; i < players.size(); ++i) {
cout << players[i].name << (players[i].isHuman ? "【你】" : "") << "(" << players[i].getRoleName() << "):"
<< (players[i].alive ? "存活" : "死亡") << endl;
}
}
};
int main() {
WerewolfGame game;
string names[] = {"张三","李四","王五","赵六","钱七","孙八","周九","吴十"};
int i;
for (i = 0; i < 8; ++i) {
game.addPlayer(names[i]);
}
game.setRandomHumanPlayer();
game.play();
return 0;
}
这里空空如也













有帮助,赞一个