#include<bits/stdc++.h> #include <windows.h> using namespace std;

// ====================== 全局结构体 ====================== // 角色配置:数量+名称 struct IDname { int cnt; string name; } roleCfg[100];

// 玩家信息 struct Player { int id; // 座位号 bool alive; // 是否存活 string role; // 身份 int know; // 玩家知晓信息:0未知/1好人狼人/2完整身份 int dieReason; // 死亡原因:0存活/1狼刀/2投票/3毒杀/4猎人枪 } player[21];

// 投票结构体 struct Vote { int voteCnt; // 得票数 int id; // 玩家编号 bool canVote; // 是否拥有本轮投票权 } voteArr[13];

// ====================== 全局变量 ====================== int n; // 总人数 int mySelf; // 玩家自身座位 int killWolf; // 狼人刀人目标 int killPoison; // 女巫毒人目标 char op; // 操作输入字符 bool hasCure = true; // 女巫解药 bool hasPoison = true; // 女巫毒药 int hunterId = 0; // 猎人座位 int guardId = 0; // 守卫座位 int guardTarget = 0; // 守卫当晚守护目标 bool hunterShot = false;// 猎人是否已经开枪 int randSeedArr[10] = {7,4,6,43,35,1,2,8,20,19};

// ====================== 函数声明 ====================== void initRoleBase(); void setRoleCount(int num); void randomAssignRole(int idx); bool cmpVoteDesc(Vote a, Vote b); bool cmpVoteIdAsc(Vote a, Vote b); void printGameUI(int day, bool isNight); void guardSleep(int day, bool isNight); void voteProcess(int day, bool isNight); bool checkGameOver(); void nightFirstRound(); void nightLoop(int day, bool isNight); void hunterShoot(); void printDeadNotice(); void showGameResult();

// ====================== 初始化角色基础名称 ====================== void initRoleBase() { roleCfg[1].name = "村民 "; roleCfg[2].name = "狼人 "; roleCfg[3].name = "女巫 "; roleCfg[4].name = "预言家 "; roleCfg[5].name = "猎人 "; roleCfg[6].name = "守卫 "; }

// ====================== 根据人数配置各角色数量 ====================== void setRoleCount(int num) { // 全部清零 for(int i = 1; i <= 6; i++) roleCfg[i].cnt = 0; switch(num) { case 6: roleCfg[1].cnt = 3; roleCfg[2].cnt = 2; break; case 7: roleCfg[1].cnt = 3; roleCfg[2].cnt = 2; roleCfg[3].cnt = 1; roleCfg[4].cnt = 1; break; case 8: roleCfg[1].cnt = 3; roleCfg[2].cnt = 3; roleCfg[3].cnt = 1; roleCfg[4].cnt = 1; break; case 9: roleCfg[1].cnt = 3; roleCfg[2].cnt = 3; roleCfg[3].cnt = 1; roleCfg[4].cnt = 1; roleCfg[5].cnt = 1; break; case 10: roleCfg[1].cnt = 4; roleCfg[2].cnt = 3; roleCfg[3].cnt = 1; roleCfg[4].cnt = 1; roleCfg[5].cnt = 1; break; case 11: roleCfg[1].cnt = 4; roleCfg[2].cnt = 4; roleCfg[3].cnt = 1; roleCfg[4].cnt = 1; roleCfg[5].cnt = 1; break; case 12: roleCfg[1].cnt = 4; roleCfg[2].cnt = 4; roleCfg[3].cnt = 1; roleCfg[4].cnt = 1; roleCfg[5].cnt = 1; roleCfg[6].cnt = 1; break; default: cout << "人数输入错误,程序退出!" << endl; system("pause"); exit(0); } }

// ====================== 随机分配单个玩家身份 ====================== void randomAssignRole(int idx) { srand((unsigned)time(0)); Sleep(rand() % 44); int base = 10000; int t = rand(); int y = randSeedArr[(rand() % 100 + t) % 10]; int selRole;

// 根据人数限定可选角色范围
if(n <= 6) selRole = abs(base * 6 / y) % 3 + 1;
else if(n <= 8) selRole = abs(base * 7 / y) % 4 + 1;
else if(n <= 11) selRole = abs(base * 8 / y) % 5 + 1;
else selRole = abs(base * 9 / y) % 6 + 1;

// 循环找到还有剩余名额的角色
while(true) {
    if(n <= 6) selRole = selRole % 3 + 1;
    else if(n <= 8) selRole = selRole % 4 + 1;
    else if(n <= 11) selRole = selRole % 5 + 1;
    else selRole = selRole % 6 + 1;

    if(roleCfg[selRole].cnt > 0) break;
}

// 赋值玩家信息
player[idx].role = roleCfg[selRole].name;
player[idx].alive = true;
player[idx].id = idx;
player[idx].know = 0;
player[idx].dieReason = 0;
roleCfg[selRole].cnt--;

// 记录猎人、守卫位置
if(player[idx].role == "猎人 ") hunterId = idx;
if(player[idx].role == "守卫 ") guardId = idx;

}

// ====================== 投票排序规则:得票降序,同票编号升序 ====================== bool cmpVoteDesc(Vote a, Vote b) { if(a.voteCnt != b.voteCnt) return a.voteCnt > b.voteCnt; return a.id < b.id; }

// 按编号升序 bool cmpVoteIdAsc(Vote a, Vote b) { return a.id < b.id; }

// ====================== 控制台UI打印(状态面板) ====================== void printGameUI(int day, bool isNight) { HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // 白天白底,夜晚黑底 if(isNight) SetConsoleTextAttribute(hConsole, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_INTENSITY); else SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

cout << "\t\t\t\t第" << day << "天 ";
if(isNight) cout << "夜晚" << endl;
else cout << "白天" << endl;
cout << "你的座位:" << mySelf << "号" << endl << endl;

// 1~6号玩家
cout << "1-6号位:";
for(int i = 1; i <= 6; i++) cout << player[i].id << "号\t";
cout << "\n存活状态:";
for(int i = 1; i <= 6; i++) {
    if(player[i].alive)
        SetConsoleTextAttribute(hConsole, isNight ? (BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY|FOREGROUND_GREEN) : (FOREGROUND_INTENSITY|FOREGROUND_GREEN));
    else
        SetConsoleTextAttribute(hConsole, isNight ? (BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY|FOREGROUND_RED) : (FOREGROUND_INTENSITY|FOREGROUND_RED));
    cout << (player[i].alive ? "存活\t" : "死亡\t");
}
SetConsoleTextAttribute(hConsole, isNight ? (BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY) : (FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE));
cout << "\n身份信息:";
for(int i = 1; i <= 6; i++) {
    if(player[i].know == 0) cout << "未知\t";
    else if(player[i].know == 1) cout << (player[i].role == "狼人 " ? "狼人\t" : "好人\t");
    else cout << player[i].role << "\t";
}
cout << "\n\n";

// 7~n号玩家
if(n >= 7) {
    cout << "7-" << n << "号位:";
    for(int i = 7; i <= n; i++) cout << player[i].id << "号\t";
    cout << "\n存活状态:";
    for(int i = 7; i <= n; i++) {
        if(player[i].alive)
            SetConsoleTextAttribute(hConsole, isNight ? (BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY|FOREGROUND_GREEN) : (FOREGROUND_INTENSITY|FOREGROUND_GREEN));
        else
            SetConsoleTextAttribute(hConsole, isNight ? (BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY|FOREGROUND_RED) : (FOREGROUND_INTENSITY|FOREGROUND_RED));
        cout << (player[i].alive ? "存活\t" : "死亡\t");
    }
    SetConsoleTextAttribute(hConsole, isNight ? (BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY) : (FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE));
    cout << "\n身份信息:";
    for(int i = 7; i <= n; i++) {
        if(player[i].know == 0) cout << "未知\t";
        else if(player[i].know == 1) cout << (player[i].role == "狼人 " ? "狼人\t" : "好人\t");
        else cout << player[i].role << "\t";
    }
    cout << "\n\n";
}

}

// ====================== 守卫夜间守护流程 ====================== void guardSleep(int day, bool isNight) { Sleep(3000); system("cls"); printGameUI(day, isNight); cout << "守~卫~请~睁~眼~~~\n"; Sleep(3000); system("cls"); printGameUI(day, isNight);

int tar;
// 玩家自己是守卫
if(mySelf == guardId && player[mySelf].alive) {
    cout << "请输入今晚要守护的玩家编号:";
    cin >> tar;
    while(tar == guardTarget || tar < 1 || tar > n || !player[tar].alive) {
        cout << "输入非法,请重新输入:";
        cin >> tar;
    }
    guardTarget = tar;
}
// AI守卫
else if(player[guardId].alive) {
    do {
        srand((unsigned)time(0));
        tar = rand() % n + 1;
    } while(tar == guardTarget || !player[tar].alive);
    guardTarget = tar;
}
// 无守卫/守卫已死
else guardTarget = -1;

Sleep(3000);
system("cls");
printGameUI(day, isNight);
cout << "守~卫~请~闭~眼~~~\n";

}

// ====================== 白天投票流程(最多三轮平票) ====================== void voteProcess(int day, bool isNight) { Sleep(2000); system("cls"); printGameUI(day, isNight); cout << "开始投票"; for(int i = 1; i <= 3; i++) { cout << "."; Sleep(500); } cout << endl;

// 初始化投票数据
for(int i = 1; i <= n; i++) {
    voteArr[i].id = i;
    voteArr[i].canVote = true;
    voteArr[i].voteCnt = 0;
}

// ========== 第一轮投票 ==========
for(int i = 1; i <= n; i++) {
    if(!player[i].alive) continue;
    Sleep(3000);
    int tar;
    if(i == mySelf) {
        cout << "请投票(输入0弃权):";
        cin >> tar;
        while(tar != 0 && !player[tar].alive) cin >> tar;
        if(tar == 0) cout << mySelf << "号弃权\n";
        else {
            cout << mySelf << "投给" << tar << "号\n";
            voteArr[tar].voteCnt++;
        }
    } else {
        srand((unsigned)time(0));
        // 狼人优先投好人
        if(player[i].role == "狼人 ") {
            do {
                tar = rand() % (n + 1);
            } while(tar != 0 && (!player[tar].alive || player[tar].role == "狼人 " || tar == i));
        }
        // 预言家优先投狼
        else if(player[i].role == "预言家 ") {
            do {
                tar = rand() % (n + 1);
            } while(tar != 0 && (!player[tar].alive || player[tar].role != "狼人 " || tar == i));
        }
        // 村民随机投
        else {
            do {
                tar = rand() % (n + 1);
            } while(tar != 0 && (!player[tar].alive || tar == i));
        }
        if(tar == 0) cout << i << "号弃权\n";
        else {
            cout << i << "投给" << tar << "号\n";
            voteArr[tar].voteCnt++;
        }
    }
}
Sleep(3000);
sort(voteArr + 1, voteArr + n + 1, cmpVoteDesc);
// 无平票直接出局
if(voteArr[1].voteCnt > voteArr[2].voteCnt) {
    int out = voteArr[1].id;
    cout << "投票结束," << out << "号被投票出局!\n";
    player[out].alive = false;
    player[out].dieReason = 2;
    Sleep(3000);
    return;
}
// 标记平票玩家本轮无投票权
int maxVote = voteArr[1].voteCnt;
for(int i = 1; i <= n; i++) {
    if(voteArr[i].voteCnt == maxVote) voteArr[i].canVote = false;
    else break;
}
system("cls");
printGameUI(day, isNight);
cout << "平票!进入第二轮投票\n";

// ========== 第二轮投票 ==========
sort(voteArr + 1, voteArr + n + 1, cmpVoteIdAsc);
cout << "二次投票";
for(int i = 1; i <= 3; i++) { cout << "."; Sleep(500); }
cout << endl;
for(int i = 1; i <= n; i++) {
    if(!player[i].alive || !voteArr[i].canVote) continue;
    Sleep(3000);
    int tar;
    if(i == mySelf) {
        cout << "请投票(0弃权):";
        cin >> tar;
        while(tar != 0 && (!player[tar].alive || !voteArr[tar].canVote)) cin >> tar;
        if(tar != 0) voteArr[tar].voteCnt++;
    } else {
        srand((unsigned)time(0));
        if(player[i].role == "狼人 ") {
            do { tar = rand() % (n + 1); } while(tar != 0 && (!player[tar].alive || player[tar].role == "狼人 " || tar == i || !voteArr[tar].canVote));
        } else if(player[i].role == "预言家 ") {
            do { tar = rand() % (n + 1); } while(tar != 0 && (!player[tar].alive || player[tar].role != "狼人 " || tar == i || !voteArr[tar].canVote));
        } else {
            do { tar = rand() % (n + 1); } while(tar != 0 && (!player[tar].alive || tar == i || !voteArr[tar].canVote));
        }
        if(tar != 0) voteArr[tar].voteCnt++;
    }
}
Sleep(3000);
sort(voteArr + 1, voteArr + n + 1, cmpVoteDesc);
if(voteArr[1].voteCnt > voteArr[2].voteCnt) {
    int out = voteArr[1].id;
    cout << "投票结束," << out << "号被投票出局!\n";
    player[out].alive = false;
    player[out].dieReason = 2;
    Sleep(3000);
    return;
}
// 再次标记平票
maxVote = voteArr[1].voteCnt;
for(int i = 1; i <= n; i++) {
    if(voteArr[i].voteCnt == maxVote) voteArr[i].canVote = false;
    else break;
}
system("cls");
printGameUI(day, isNight);
cout << "再次平票!第三轮投票\n";

// ========== 第三轮投票 ==========
sort(voteArr + 1, voteArr + n + 1, cmpVoteIdAsc);
cout << "最终投票";
for(int i = 1; i <= 3; i++) { cout << "."; Sleep(500); }
cout << endl;
for(int i = 1; i <= n; i++) {
    if(!player[i].alive || !voteArr[i].canVote) continue;
    Sleep(3000);
    int tar;
    if(i == mySelf) {
        cout << "请投票(0弃权):";
        cin >> tar;
        while(tar != 0 && (!player[tar].alive || !voteArr[tar].canVote)) cin >> tar;
        if(tar != 0) voteArr[tar].voteCnt++;
    } else {
        srand((unsigned)time(0));
        if(player[i].role == "狼人 ") {
            do { tar = rand() % (n + 1); } while(tar != 0 && (!player[tar].alive || player[tar].role == "狼人 " || tar == i || !voteArr[tar].canVote));
        } else if(player[i].role == "预言家 " || player[i].role == "猎人 ") {
            do { tar = rand() % (n + 1); } while(tar != 0 && (!player[tar].alive || player[tar].role != "狼人 " || tar == i || !voteArr[tar].canVote));
        } else {
            do { tar = rand() % (n + 1); } while(tar != 0 && (!player[tar].alive || tar == i || !voteArr[tar].canVote));
        }
        if(tar != 0) voteArr[tar].voteCnt++;
    }
}
Sleep(3000);
sort(voteArr + 1, voteArr + n + 1, cmpVoteDesc);
if(voteArr[1].voteCnt > voteArr[2].voteCnt) {
    int out = voteArr[1].id;
    cout << "投票结束," << out << "号被投票出局!\n";
    player[out].alive = false;
    player[out].dieReason = 2;
} else {
    cout << "三轮投票全部平票,无人出局\n";
}
Sleep(5000);

}

// ====================== 判断游戏是否结束 ====================== bool checkGameOver() { int villager = 0; // 存活村民 int wolf = 0; // 存活狼人 int god = 0; // 存活神(女巫/预言/猎人/守卫) for(int i = 1; i <= n; i++) { if(!player[i].alive) continue; if(player[i].role == "狼人 ") wolf++; else if(player[i].role == "村民 ") villager++; else god++; } // 好人全灭 / 狼人数量>=好人直接胜利 if(god == 0 || wolf == 0 || wolf >= villager + god) return true; return false; }

// ====================== 第一晚夜晚流程(无前日数据) ====================== void nightFirstRound() { system("cls"); system("color 0f"); printGameUI(1, true); cout << "天~黑~请~闭~眼~~~\n"; guardTarget = 0; if(n >= 12) guardSleep(1, true); Sleep(3000);

// 狼人行动
system("cls");
printGameUI(1, true);
cout << "狼~人~请~睁~眼~~~\n";
if(player[mySelf].role == "狼人 ") {
    Sleep(1000);
    cout << "你的狼队友:";
    for(int i = 1; i <= n; i++) {
        if(i == mySelf) continue;
        if(player[i].role == "狼人 ") {
            cout << i << "号 ";
            player[i].know = 2;
        }
    }
    Sleep(3000);
    cout << "\n输入今晚刀人目标:";
    cin >> killWolf;
    system("cls");
    printGameUI(1, true);
    cout << "今晚击杀目标:" << killWolf << "号\n";
} else {
    Sleep(4000);
    // AI狼人随机刀好人
    do {
        srand((unsigned)time(0));
        killWolf = rand() % n + 1;
    } while(player[killWolf].role == "狼人 " || !player[killWolf].alive);
    Sleep(5000);
}
Sleep(3000);
system("cls");
printGameUI(1, true);
cout << "狼~人~请~闭~眼~~~\n";
Sleep(2000);

// 女巫行动
system("cls");
printGameUI(1, true);
cout << "女~巫~请~睁~眼~~~\n";
Sleep(2000);
system("cls");
printGameUI(1, true);
killPoison = 0;
int witchId = 0;
for(int i = 1; i <= n; i++) if(player[i].role == "女巫 ") witchId = i;

if(player[mySelf].role == "女巫 " && player[mySelf].alive) {
    Sleep(1000);
    if(hasCure) {
        cout << "今晚" << killWolf << "号中刀\n是否使用解药?A救/B不救:";
        cin >> op;
        if(op == 'A') {
            cout << "你解救了" << killWolf << "号\n";
            hasCure = false;
            if(guardTarget != killWolf) killWolf = 0;
            // 询问毒药
            Sleep(2000);
            system("cls");
            printGameUI(1, true);
            cout << "是否使用毒药?A毒/B不毒:";
            cin >> op;
            if(op == 'A' && hasPoison) {
                cout << "输入毒杀目标:";
                cin >> killPoison;
                while(!player[killPoison].alive) { cin >> killPoison; }
                hasPoison = false;
            }
        } else {
            if(guardTarget == killWolf) killWolf = 0;
            Sleep(2000);
            system("cls");
            printGameUI(1, true);
            cout << "是否使用毒药?A毒/B不毒:";
            cin >> op;
            if(op == 'A' && hasPoison) {
                cout << "输入毒杀目标:";
                cin >> killPoison;
                while(!player[killPoison].alive) { cin >> killPoison; }
                hasPoison = false;
            }
        }
    } else {
        if(guardTarget == killWolf) killWolf = 0;
        Sleep(2000);
        system("cls");
        printGameUI(1, true);
        cout << "是否使用毒药?A毒/B不毒:";
        cin >> op;
        if(op == 'A' && hasPoison) {
            cout << "输入毒杀目标:";
            cin >> killPoison;
            while(!player[killPoison].alive) { cin >> killPoison; }
            hasPoison = false;
        }
    }
} else {
    // AI女巫逻辑
    bool useCure = false;
    if(hasCure && player[witchId].alive) {
        // 优先救神
        if(player[killWolf].role == "预言家 " || player[killWolf].role == "女巫 " || player[killWolf].role == "猎人 ") {
            if(guardTarget != killWolf) {
                killWolf = 0;
                hasCure = false;
                useCure = true;
            }
        }
    }
    // 有药随机毒好人
    if(!useCure && hasPoison && player[witchId].alive) {
        srand((unsigned)time(0));
        if(rand() % 2 == 1) {
            do {
                killPoison = rand() % n + 1;
            } while(player[killPoison].role == "女巫 " || player[killPoison].role == "预言家 " || killPoison == killWolf || !player[killPoison].alive);
            hasPoison = false;
        }
    }
}
Sleep(3000);
system("cls");
printGameUI(1, true);
cout << "女~巫~请~闭~眼~~~\n";

// 预言家行动(6人局无预言家)
if(n > 6) {
    Sleep(3000);
    system("cls");
    printGameUI(1, true);
    cout << "预~言~家~请~睁~眼~~~\n";
    if(player[mySelf].role == "预言家 ") {
        Sleep(3000);
        int check;
        cout << "输入查验玩家编号:";
        cin >> check;
        player[check].know = 1;
        Sleep(2000);
        system("cls");
        printGameUI(1, true);
        cout << "该玩家身份:" << (player[check].role == "狼人 " ? "狼人" : "好人") << "\n";
    } else {
        Sleep(3000);
        cout << "AI预言家查验中...\n";
    }
    Sleep(3000);
    system("cls");
    printGameUI(1, true);
    cout << "预~言~家~请~闭~眼~~~\n";
}
Sleep(3000);

// 结算死亡
if(killWolf != 0) {
    player[killWolf].alive = false;
    player[killWolf].dieReason = 1;
}
if(killPoison != 0) {
    player[killPoison].alive = false;
    player[killPoison].dieReason = 3;
}
system("cls");
system("color F0");
printGameUI(2, false);

}

// ====================== 通用夜晚流程(第二晚及以后) ====================== void nightLoop(int day, bool isNight) { system("cls"); system("color 0f"); printGameUI(day, true); cout << "天~黑~请~闭~眼~~~\n"; guardTarget = 0; if(n >= 12) guardSleep(day, true); Sleep(3000);

// 狼人刀人
system("cls");
printGameUI(day, true);
cout << "狼~人~请~睁~眼~~~\n";
if(player[mySelf].role == "狼人 " && player[mySelf].alive) {
    Sleep(3000);
    cout << "输入刀人目标:";
    cin >> killWolf;
    system("cls");
    printGameUI(day, true);
    cout << "今晚击杀:" << killWolf << "号\n";
} else {
    do {
        srand((unsigned)time(0));
        killWolf = rand() % n + 1;
    } while(player[killWolf].role == "狼人 " || !player[killWolf].alive);
    Sleep(5000);
}
Sleep(3000);
system("cls");
printGameUI(day, true);
cout << "狼~人~请~闭~眼~~~\n";
Sleep(2000);

// 女巫
system("cls");
printGameUI(day, true);
cout << "女~巫~请~睁~眼~~~\n";
Sleep(2000);
system("cls");
printGameUI(day, true);
killPoison = 0;
int witchId = 0;
for(int i = 1; i <= n; i++) if(player[i].role == "女巫 ") witchId = i;

if(player[mySelf].role == "女巫 " && player[mySelf].alive) {
    if(hasCure) {
        cout << killWolf << "号中刀,解药A救/B不救:";
        cin >> op;
        if(op == 'A') {
            hasCure = false;
            if(guardTarget != killWolf) killWolf = 0;
        } else {
            if(guardTarget == killWolf) killWolf = 0;
        }
    } else {
        if(guardTarget == killWolf) killWolf = 0;
    }
    if(hasPoison) {
        cout << "是否毒人?A毒/B不毒:";
        cin >> op;
        if(op == 'A') {
            cout << "输入毒目标:";
            cin >> killPoison;
            while(!player[killPoison].alive) cin >> killPoison;
            hasPoison = false;
        }
    }
} else {
    bool useCure = false;
    if(hasCure && player[witchId].alive) {
        if(player[killWolf].role == "预言家 " || player[killWolf].role == "猎人 ") {
            if(guardTarget != killWolf) {
                killWolf = 0;
                hasCure = false;
                useCure = true;
            }
        }
    }
    if(!useCure && hasPoison && player[witchId].alive) {
        srand((unsigned)time(0));
        if(rand() % 2 == 1) {
            do {
                killPoison = rand() % n + 1;
            } while(player[killPoison].role == "女巫 " || player[killPoison].role == "预言家 " || killPoison == killWolf || !player[killPoison].alive);
            hasPoison = false;
        }
    }
}
Sleep(3000);
system("cls");
printGameUI(day, true);
cout << "女~巫~请~闭~眼~~~\n";

// 预言家
if(n > 6) {
    Sleep(3000);
    system("cls");
    printGameUI(day, true);
    cout << "预~言~家~请~睁~眼~~~\n";
    if(player[mySelf].role == "预言家 " && player[mySelf].alive) {
        int check;
        cout << "查验编号:";
        cin >> check;
        player[check].know = 1;
        cout << "身份:" << (player[check].role == "狼人 " ? "狼人" : "好人") << "\n";
    } else {
        cout << "AI预言家查验\n";
    }
    Sleep(3000);
    system("cls");
    printGameUI(day, true);
    cout << "预~言~家~请~闭~眼~~~\n";
}
Sleep(3000);

// 结算死亡
if(killWolf != 0) {
    player[killWolf].alive = false;
    player[killWolf].dieReason = 1;
}
if(killPoison != 0) {
    player[killPoison].alive = false;
    player[killPoison].dieReason = 3;
}
system("cls");
system("color F0");
printGameUI(day + 1, false);

}

// ====================== 猎人开枪 ====================== void hunterShoot() { if(hunterShot) return; hunterShot = true; int shootTar; if(mySelf == hunterId) { cout << "你被淘汰,请选择开枪带走一人:"; cin >> shootTar; while(!player[shootTar].alive) { cin >> shootTar; } } else { srand((unsigned)time(0)); do { shootTar = rand() % n + 1; } while(!player[shootTar].alive); } cout << hunterId << "号猎人开枪带走" << shootTar << "号\n"; player[shootTar].alive = false; player[shootTar].dieReason = 4; Sleep(1000); }

// ====================== 天亮死亡播报 ====================== void printDeadNotice() { cout << "天亮了!昨晚"; if(killWolf == 0 && killPoison == 0) { cout << "平安夜\n"; return; } if(killWolf != 0) cout << killWolf << "号"; if(killPoison != 0) cout << "," << killPoison << "号"; cout << "玩家死亡\n"; killPoison = 0; }

// ====================== 游戏结束展示全部身份与结局 ====================== void showGameResult() { int villager = 0, wolf = 0, god = 0; for(int i = 1; i <= n; i++) { if(!player[i].alive) continue; if(player[i].role == "狼人 ") wolf++; else if(player[i].role == "村民 ") villager++; else god++; } if(wolf >= villager + god || god == 0) cout << "===== 狼人阵营胜利 =" << endl; else cout << "= 好人阵营胜利 =====" << endl; cout << "\n全部玩家身份详情:\n"; cout << left << setw(4) << "座位" << setw(8) << "身份" << setw(6) << "状态" << "死亡原因\n"; for(int i = 1; i <= n; i++) { cout << left << setw(4) << player[i].id << setw(8) << player[i].role; if(player[i].alive) cout << setw(6) << "存活" << "全程存活\n"; else { cout << setw(6) << "死亡"; switch(player[i].dieReason) { case 1: cout << "狼人刀杀\n"; break; case 2: cout << "投票放逐\n"; break; case 3: cout << "女巫毒杀\n"; break; case 4: cout << "猎人枪杀\n"; break; } } } system("pause"); system("pause"); }

// ====================== 主函数游戏循环 ====================== int main() { system("cls"); cout << "========== 控制台狼人杀 ==========\n"; cout << "请输入游玩人数(6~12):"; cin >> n; cout << "身份分配加载中,请稍候"; initRoleBase(); setRoleCount(n);

// 随机分配所有玩家身份
for(int i = 1; i <= n; i++) {
    randomAssignRole(i);
    cout << ".";
    Sleep(17);
}
system("cls");
system("color F0");
cout << "游戏即将开始";
for(int i = 1; i <= 6; i++) { cout << "."; Sleep(500); }
Sleep(1500);

// 分配玩家自身身份
cout << "\n\n查看你的身份牌......\n";
srand((unsigned)time(0));
mySelf = rand() % n + 1;
cout << "你的身份:" << player[mySelf].role << "\n座位:" << mySelf << "号\n";
system("pause");
system("cls");
player[mySelf].know = 2;
printGameUI(1, false);
cout << "即将进入第一个夜晚";
for(int i = 1; i <= 6; i++) { cout << "."; Sleep(500); }

// 第一晚
nightFirstRound();
printDeadNotice();
if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
// 猎人出局开枪
if(!player[hunterId].alive && !hunterShot) hunterShoot();
if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
// 白天投票
voteProcess(2, false);
system("cls");
printGameUI(2, false);
if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
if(!player[hunterId].alive && !hunterShot) hunterShoot();

// 循环多日夜(2~7天)
for(int day = 2; day <= 7; day++) {
    cout << "即将进入夜晚";
    for(int i = 1; i <= 6; i++) { cout << "."; Sleep(500); }
    nightLoop(day, true);
    printDeadNotice();
    if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
    if(!player[hunterId].alive && !hunterShot) hunterShoot();
    if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
    voteProcess(day + 1, false);
    system("cls");
    printGameUI(day + 1, false);
    if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
    if(!player[hunterId].alive && !hunterShot) hunterShoot();
    if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
}

system("pause");
return 0;

}

2 条评论

  • #include<bits/stdc++.h>
    #include <windows.h>
    using namespace std;
    
    // ====================== 全局结构体 ======================
    // 角色配置:数量+名称
    struct IDname {
        int cnt;
        string name;
    } roleCfg[100];
    
    // 玩家信息
    struct Player {
        int id;         // 座位号
        bool alive;     // 是否存活
        string role;    // 身份
        int know;       // 玩家知晓信息:0未知/1好人狼人/2完整身份
        int dieReason;  // 死亡原因:0存活/1狼刀/2投票/3毒杀/4猎人枪
    } player[21];
    
    // 投票结构体
    struct Vote {
        int voteCnt;    // 得票数
        int id;         // 玩家编号
        bool canVote;   // 是否拥有本轮投票权
    } voteArr[13];
    
    // ====================== 全局变量 ======================
    int n;                  // 总人数
    int mySelf;             // 玩家自身座位
    int killWolf;           // 狼人刀人目标
    int killPoison;         // 女巫毒人目标
    char op;                // 操作输入字符
    bool hasCure = true;    // 女巫解药
    bool hasPoison = true;  // 女巫毒药
    int hunterId = 0;       // 猎人座位
    int guardId = 0;        // 守卫座位
    int guardTarget = 0;    // 守卫当晚守护目标
    bool hunterShot = false;// 猎人是否已经开枪
    int randSeedArr[10] = {7,4,6,43,35,1,2,8,20,19};
    
    // ====================== 函数声明 ======================
    void initRoleBase();
    void setRoleCount(int num);
    void randomAssignRole(int idx);
    bool cmpVoteDesc(Vote a, Vote b);
    bool cmpVoteIdAsc(Vote a, Vote b);
    void printGameUI(int day, bool isNight);
    void guardSleep(int day, bool isNight);
    void voteProcess(int day, bool isNight);
    bool checkGameOver();
    void nightFirstRound();
    void nightLoop(int day, bool isNight);
    void hunterShoot();
    void printDeadNotice();
    void showGameResult();
    
    // ====================== 初始化角色基础名称 ======================
    void initRoleBase() {
        roleCfg[1].name = "村民 ";
        roleCfg[2].name = "狼人 ";
        roleCfg[3].name = "女巫 ";
        roleCfg[4].name = "预言家 ";
        roleCfg[5].name = "猎人 ";
        roleCfg[6].name = "守卫 ";
    }
    
    // ====================== 根据人数配置各角色数量 ======================
    void setRoleCount(int num) {
        // 全部清零
        for(int i = 1; i <= 6; i++) roleCfg[i].cnt = 0;
        switch(num) {
            case 6:
                roleCfg[1].cnt = 3; roleCfg[2].cnt = 2;
                break;
            case 7:
                roleCfg[1].cnt = 3; roleCfg[2].cnt = 2; roleCfg[3].cnt = 1; roleCfg[4].cnt = 1;
                break;
            case 8:
                roleCfg[1].cnt = 3; roleCfg[2].cnt = 3; roleCfg[3].cnt = 1; roleCfg[4].cnt = 1;
                break;
            case 9:
                roleCfg[1].cnt = 3; roleCfg[2].cnt = 3; roleCfg[3].cnt = 1; roleCfg[4].cnt = 1; roleCfg[5].cnt = 1;
                break;
            case 10:
                roleCfg[1].cnt = 4; roleCfg[2].cnt = 3; roleCfg[3].cnt = 1; roleCfg[4].cnt = 1; roleCfg[5].cnt = 1;
                break;
            case 11:
                roleCfg[1].cnt = 4; roleCfg[2].cnt = 4; roleCfg[3].cnt = 1; roleCfg[4].cnt = 1; roleCfg[5].cnt = 1;
                break;
            case 12:
                roleCfg[1].cnt = 4; roleCfg[2].cnt = 4; roleCfg[3].cnt = 1; roleCfg[4].cnt = 1; roleCfg[5].cnt = 1; roleCfg[6].cnt = 1;
                break;
            default:
                cout << "人数输入错误,程序退出!" << endl;
                system("pause");
                exit(0);
        }
    }
    
    // ====================== 随机分配单个玩家身份 ======================
    void randomAssignRole(int idx) {
        srand((unsigned)time(0));
        Sleep(rand() % 44);
        int base = 10000;
        int t = rand();
        int y = randSeedArr[(rand() % 100 + t) % 10];
        int selRole;
    
        // 根据人数限定可选角色范围
        if(n <= 6) selRole = abs(base * 6 / y) % 3 + 1;
        else if(n <= 8) selRole = abs(base * 7 / y) % 4 + 1;
        else if(n <= 11) selRole = abs(base * 8 / y) % 5 + 1;
        else selRole = abs(base * 9 / y) % 6 + 1;
    
        // 循环找到还有剩余名额的角色
        while(true) {
            if(n <= 6) selRole = selRole % 3 + 1;
            else if(n <= 8) selRole = selRole % 4 + 1;
            else if(n <= 11) selRole = selRole % 5 + 1;
            else selRole = selRole % 6 + 1;
    
            if(roleCfg[selRole].cnt > 0) break;
        }
    
        // 赋值玩家信息
        player[idx].role = roleCfg[selRole].name;
        player[idx].alive = true;
        player[idx].id = idx;
        player[idx].know = 0;
        player[idx].dieReason = 0;
        roleCfg[selRole].cnt--;
    
        // 记录猎人、守卫位置
        if(player[idx].role == "猎人 ") hunterId = idx;
        if(player[idx].role == "守卫 ") guardId = idx;
    }
    
    // ====================== 投票排序规则:得票降序,同票编号升序 ======================
    bool cmpVoteDesc(Vote a, Vote b) {
        if(a.voteCnt != b.voteCnt)
            return a.voteCnt > b.voteCnt;
        return a.id < b.id;
    }
    
    // 按编号升序
    bool cmpVoteIdAsc(Vote a, Vote b) {
        return a.id < b.id;
    }
    
    // ====================== 控制台UI打印(状态面板) ======================
    void printGameUI(int day, bool isNight) {
        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        // 白天白底,夜晚黑底
        if(isNight)
            SetConsoleTextAttribute(hConsole, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
        else
            SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    
        cout << "\t\t\t\t第" << day << "天 ";
        if(isNight) cout << "夜晚" << endl;
        else cout << "白天" << endl;
        cout << "你的座位:" << mySelf << "号" << endl << endl;
    
        // 1~6号玩家
        cout << "1-6号位:";
        for(int i = 1; i <= 6; i++) cout << player[i].id << "号\t";
        cout << "\n存活状态:";
        for(int i = 1; i <= 6; i++) {
            if(player[i].alive)
                SetConsoleTextAttribute(hConsole, isNight ? (BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY|FOREGROUND_GREEN) : (FOREGROUND_INTENSITY|FOREGROUND_GREEN));
            else
                SetConsoleTextAttribute(hConsole, isNight ? (BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY|FOREGROUND_RED) : (FOREGROUND_INTENSITY|FOREGROUND_RED));
            cout << (player[i].alive ? "存活\t" : "死亡\t");
        }
        SetConsoleTextAttribute(hConsole, isNight ? (BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY) : (FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE));
        cout << "\n身份信息:";
        for(int i = 1; i <= 6; i++) {
            if(player[i].know == 0) cout << "未知\t";
            else if(player[i].know == 1) cout << (player[i].role == "狼人 " ? "狼人\t" : "好人\t");
            else cout << player[i].role << "\t";
        }
        cout << "\n\n";
    
        // 7~n号玩家
        if(n >= 7) {
            cout << "7-" << n << "号位:";
            for(int i = 7; i <= n; i++) cout << player[i].id << "号\t";
            cout << "\n存活状态:";
            for(int i = 7; i <= n; i++) {
                if(player[i].alive)
                    SetConsoleTextAttribute(hConsole, isNight ? (BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY|FOREGROUND_GREEN) : (FOREGROUND_INTENSITY|FOREGROUND_GREEN));
                else
                    SetConsoleTextAttribute(hConsole, isNight ? (BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY|FOREGROUND_RED) : (FOREGROUND_INTENSITY|FOREGROUND_RED));
                cout << (player[i].alive ? "存活\t" : "死亡\t");
            }
            SetConsoleTextAttribute(hConsole, isNight ? (BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY) : (FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE));
            cout << "\n身份信息:";
            for(int i = 7; i <= n; i++) {
                if(player[i].know == 0) cout << "未知\t";
                else if(player[i].know == 1) cout << (player[i].role == "狼人 " ? "狼人\t" : "好人\t");
                else cout << player[i].role << "\t";
            }
            cout << "\n\n";
        }
    }
    
    // ====================== 守卫夜间守护流程 ======================
    void guardSleep(int day, bool isNight) {
        Sleep(3000);
        system("cls");
        printGameUI(day, isNight);
        cout << "守~卫~请~睁~眼~~~\n";
        Sleep(3000);
        system("cls");
        printGameUI(day, isNight);
    
        int tar;
        // 玩家自己是守卫
        if(mySelf == guardId && player[mySelf].alive) {
            cout << "请输入今晚要守护的玩家编号:";
            cin >> tar;
            while(tar == guardTarget || tar < 1 || tar > n || !player[tar].alive) {
                cout << "输入非法,请重新输入:";
                cin >> tar;
            }
            guardTarget = tar;
        }
        // AI守卫
        else if(player[guardId].alive) {
            do {
                srand((unsigned)time(0));
                tar = rand() % n + 1;
            } while(tar == guardTarget || !player[tar].alive);
            guardTarget = tar;
        }
        // 无守卫/守卫已死
        else guardTarget = -1;
    
        Sleep(3000);
        system("cls");
        printGameUI(day, isNight);
        cout << "守~卫~请~闭~眼~~~\n";
    }
    
    // ====================== 白天投票流程(最多三轮平票) ======================
    void voteProcess(int day, bool isNight) {
        Sleep(2000);
        system("cls");
        printGameUI(day, isNight);
        cout << "开始投票";
        for(int i = 1; i <= 3; i++) { cout << "."; Sleep(500); }
        cout << endl;
    
        // 初始化投票数据
        for(int i = 1; i <= n; i++) {
            voteArr[i].id = i;
            voteArr[i].canVote = true;
            voteArr[i].voteCnt = 0;
        }
    
        // ========== 第一轮投票 ==========
        for(int i = 1; i <= n; i++) {
            if(!player[i].alive) continue;
            Sleep(3000);
            int tar;
            if(i == mySelf) {
                cout << "请投票(输入0弃权):";
                cin >> tar;
                while(tar != 0 && !player[tar].alive) cin >> tar;
                if(tar == 0) cout << mySelf << "号弃权\n";
                else {
                    cout << mySelf << "投给" << tar << "号\n";
                    voteArr[tar].voteCnt++;
                }
            } else {
                srand((unsigned)time(0));
                // 狼人优先投好人
                if(player[i].role == "狼人 ") {
                    do {
                        tar = rand() % (n + 1);
                    } while(tar != 0 && (!player[tar].alive || player[tar].role == "狼人 " || tar == i));
                }
                // 预言家优先投狼
                else if(player[i].role == "预言家 ") {
                    do {
                        tar = rand() % (n + 1);
                    } while(tar != 0 && (!player[tar].alive || player[tar].role != "狼人 " || tar == i));
                }
                // 村民随机投
                else {
                    do {
                        tar = rand() % (n + 1);
                    } while(tar != 0 && (!player[tar].alive || tar == i));
                }
                if(tar == 0) cout << i << "号弃权\n";
                else {
                    cout << i << "投给" << tar << "号\n";
                    voteArr[tar].voteCnt++;
                }
            }
        }
        Sleep(3000);
        sort(voteArr + 1, voteArr + n + 1, cmpVoteDesc);
        // 无平票直接出局
        if(voteArr[1].voteCnt > voteArr[2].voteCnt) {
            int out = voteArr[1].id;
            cout << "投票结束," << out << "号被投票出局!\n";
            player[out].alive = false;
            player[out].dieReason = 2;
            Sleep(3000);
            return;
        }
        // 标记平票玩家本轮无投票权
        int maxVote = voteArr[1].voteCnt;
        for(int i = 1; i <= n; i++) {
            if(voteArr[i].voteCnt == maxVote) voteArr[i].canVote = false;
            else break;
        }
        system("cls");
        printGameUI(day, isNight);
        cout << "平票!进入第二轮投票\n";
    
        // ========== 第二轮投票 ==========
        sort(voteArr + 1, voteArr + n + 1, cmpVoteIdAsc);
        cout << "二次投票";
        for(int i = 1; i <= 3; i++) { cout << "."; Sleep(500); }
        cout << endl;
        for(int i = 1; i <= n; i++) {
            if(!player[i].alive || !voteArr[i].canVote) continue;
            Sleep(3000);
            int tar;
            if(i == mySelf) {
                cout << "请投票(0弃权):";
                cin >> tar;
                while(tar != 0 && (!player[tar].alive || !voteArr[tar].canVote)) cin >> tar;
                if(tar != 0) voteArr[tar].voteCnt++;
            } else {
                srand((unsigned)time(0));
                if(player[i].role == "狼人 ") {
                    do { tar = rand() % (n + 1); } while(tar != 0 && (!player[tar].alive || player[tar].role == "狼人 " || tar == i || !voteArr[tar].canVote));
                } else if(player[i].role == "预言家 ") {
                    do { tar = rand() % (n + 1); } while(tar != 0 && (!player[tar].alive || player[tar].role != "狼人 " || tar == i || !voteArr[tar].canVote));
                } else {
                    do { tar = rand() % (n + 1); } while(tar != 0 && (!player[tar].alive || tar == i || !voteArr[tar].canVote));
                }
                if(tar != 0) voteArr[tar].voteCnt++;
            }
        }
        Sleep(3000);
        sort(voteArr + 1, voteArr + n + 1, cmpVoteDesc);
        if(voteArr[1].voteCnt > voteArr[2].voteCnt) {
            int out = voteArr[1].id;
            cout << "投票结束," << out << "号被投票出局!\n";
            player[out].alive = false;
            player[out].dieReason = 2;
            Sleep(3000);
            return;
        }
        // 再次标记平票
        maxVote = voteArr[1].voteCnt;
        for(int i = 1; i <= n; i++) {
            if(voteArr[i].voteCnt == maxVote) voteArr[i].canVote = false;
            else break;
        }
        system("cls");
        printGameUI(day, isNight);
        cout << "再次平票!第三轮投票\n";
    
        // ========== 第三轮投票 ==========
        sort(voteArr + 1, voteArr + n + 1, cmpVoteIdAsc);
        cout << "最终投票";
        for(int i = 1; i <= 3; i++) { cout << "."; Sleep(500); }
        cout << endl;
        for(int i = 1; i <= n; i++) {
            if(!player[i].alive || !voteArr[i].canVote) continue;
            Sleep(3000);
            int tar;
            if(i == mySelf) {
                cout << "请投票(0弃权):";
                cin >> tar;
                while(tar != 0 && (!player[tar].alive || !voteArr[tar].canVote)) cin >> tar;
                if(tar != 0) voteArr[tar].voteCnt++;
            } else {
                srand((unsigned)time(0));
                if(player[i].role == "狼人 ") {
                    do { tar = rand() % (n + 1); } while(tar != 0 && (!player[tar].alive || player[tar].role == "狼人 " || tar == i || !voteArr[tar].canVote));
                } else if(player[i].role == "预言家 " || player[i].role == "猎人 ") {
                    do { tar = rand() % (n + 1); } while(tar != 0 && (!player[tar].alive || player[tar].role != "狼人 " || tar == i || !voteArr[tar].canVote));
                } else {
                    do { tar = rand() % (n + 1); } while(tar != 0 && (!player[tar].alive || tar == i || !voteArr[tar].canVote));
                }
                if(tar != 0) voteArr[tar].voteCnt++;
            }
        }
        Sleep(3000);
        sort(voteArr + 1, voteArr + n + 1, cmpVoteDesc);
        if(voteArr[1].voteCnt > voteArr[2].voteCnt) {
            int out = voteArr[1].id;
            cout << "投票结束," << out << "号被投票出局!\n";
            player[out].alive = false;
            player[out].dieReason = 2;
        } else {
            cout << "三轮投票全部平票,无人出局\n";
        }
        Sleep(5000);
    }
    
    // ====================== 判断游戏是否结束 ======================
    bool checkGameOver() {
        int villager = 0;   // 存活村民
        int wolf = 0;       // 存活狼人
        int god = 0;        // 存活神(女巫/预言/猎人/守卫)
        for(int i = 1; i <= n; i++) {
            if(!player[i].alive) continue;
            if(player[i].role == "狼人 ") wolf++;
            else if(player[i].role == "村民 ") villager++;
            else god++;
        }
        // 好人全灭 / 狼人数量>=好人直接胜利
        if(god == 0 || wolf == 0 || wolf >= villager + god)
            return true;
        return false;
    }
    
    // ====================== 第一晚夜晚流程(无前日数据) ======================
    void nightFirstRound() {
        system("cls");
        system("color 0f");
        printGameUI(1, true);
        cout << "天~黑~请~闭~眼~~~\n";
        guardTarget = 0;
        if(n >= 12) guardSleep(1, true);
        Sleep(3000);
    
        // 狼人行动
        system("cls");
        printGameUI(1, true);
        cout << "狼~人~请~睁~眼~~~\n";
        if(player[mySelf].role == "狼人 ") {
            Sleep(1000);
            cout << "你的狼队友:";
            for(int i = 1; i <= n; i++) {
                if(i == mySelf) continue;
                if(player[i].role == "狼人 ") {
                    cout << i << "号 ";
                    player[i].know = 2;
                }
            }
            Sleep(3000);
            cout << "\n输入今晚刀人目标:";
            cin >> killWolf;
            system("cls");
            printGameUI(1, true);
            cout << "今晚击杀目标:" << killWolf << "号\n";
        } else {
            Sleep(4000);
            // AI狼人随机刀好人
            do {
                srand((unsigned)time(0));
                killWolf = rand() % n + 1;
            } while(player[killWolf].role == "狼人 " || !player[killWolf].alive);
            Sleep(5000);
        }
        Sleep(3000);
        system("cls");
        printGameUI(1, true);
        cout << "狼~人~请~闭~眼~~~\n";
        Sleep(2000);
    
        // 女巫行动
        system("cls");
        printGameUI(1, true);
        cout << "女~巫~请~睁~眼~~~\n";
        Sleep(2000);
        system("cls");
        printGameUI(1, true);
        killPoison = 0;
        int witchId = 0;
        for(int i = 1; i <= n; i++) if(player[i].role == "女巫 ") witchId = i;
    
        if(player[mySelf].role == "女巫 " && player[mySelf].alive) {
            Sleep(1000);
            if(hasCure) {
                cout << "今晚" << killWolf << "号中刀\n是否使用解药?A救/B不救:";
                cin >> op;
                if(op == 'A') {
                    cout << "你解救了" << killWolf << "号\n";
                    hasCure = false;
                    if(guardTarget != killWolf) killWolf = 0;
                    // 询问毒药
                    Sleep(2000);
                    system("cls");
                    printGameUI(1, true);
                    cout << "是否使用毒药?A毒/B不毒:";
                    cin >> op;
                    if(op == 'A' && hasPoison) {
                        cout << "输入毒杀目标:";
                        cin >> killPoison;
                        while(!player[killPoison].alive) { cin >> killPoison; }
                        hasPoison = false;
                    }
                } else {
                    if(guardTarget == killWolf) killWolf = 0;
                    Sleep(2000);
                    system("cls");
                    printGameUI(1, true);
                    cout << "是否使用毒药?A毒/B不毒:";
                    cin >> op;
                    if(op == 'A' && hasPoison) {
                        cout << "输入毒杀目标:";
                        cin >> killPoison;
                        while(!player[killPoison].alive) { cin >> killPoison; }
                        hasPoison = false;
                    }
                }
            } else {
                if(guardTarget == killWolf) killWolf = 0;
                Sleep(2000);
                system("cls");
                printGameUI(1, true);
                cout << "是否使用毒药?A毒/B不毒:";
                cin >> op;
                if(op == 'A' && hasPoison) {
                    cout << "输入毒杀目标:";
                    cin >> killPoison;
                    while(!player[killPoison].alive) { cin >> killPoison; }
                    hasPoison = false;
                }
            }
        } else {
            // AI女巫逻辑
            bool useCure = false;
            if(hasCure && player[witchId].alive) {
                // 优先救神
                if(player[killWolf].role == "预言家 " || player[killWolf].role == "女巫 " || player[killWolf].role == "猎人 ") {
                    if(guardTarget != killWolf) {
                        killWolf = 0;
                        hasCure = false;
                        useCure = true;
                    }
                }
            }
            // 有药随机毒好人
            if(!useCure && hasPoison && player[witchId].alive) {
                srand((unsigned)time(0));
                if(rand() % 2 == 1) {
                    do {
                        killPoison = rand() % n + 1;
                    } while(player[killPoison].role == "女巫 " || player[killPoison].role == "预言家 " || killPoison == killWolf || !player[killPoison].alive);
                    hasPoison = false;
                }
            }
        }
        Sleep(3000);
        system("cls");
        printGameUI(1, true);
        cout << "女~巫~请~闭~眼~~~\n";
    
        // 预言家行动(6人局无预言家)
        if(n > 6) {
            Sleep(3000);
            system("cls");
            printGameUI(1, true);
            cout << "预~言~家~请~睁~眼~~~\n";
            if(player[mySelf].role == "预言家 ") {
                Sleep(3000);
                int check;
                cout << "输入查验玩家编号:";
                cin >> check;
                player[check].know = 1;
                Sleep(2000);
                system("cls");
                printGameUI(1, true);
                cout << "该玩家身份:" << (player[check].role == "狼人 " ? "狼人" : "好人") << "\n";
            } else {
                Sleep(3000);
                cout << "AI预言家查验中...\n";
            }
            Sleep(3000);
            system("cls");
            printGameUI(1, true);
            cout << "预~言~家~请~闭~眼~~~\n";
        }
        Sleep(3000);
    
        // 结算死亡
        if(killWolf != 0) {
            player[killWolf].alive = false;
            player[killWolf].dieReason = 1;
        }
        if(killPoison != 0) {
            player[killPoison].alive = false;
            player[killPoison].dieReason = 3;
        }
        system("cls");
        system("color F0");
        printGameUI(2, false);
    }
    
    // ====================== 通用夜晚流程(第二晚及以后) ======================
    void nightLoop(int day, bool isNight) {
        system("cls");
        system("color 0f");
        printGameUI(day, true);
        cout << "天~黑~请~闭~眼~~~\n";
        guardTarget = 0;
        if(n >= 12) guardSleep(day, true);
        Sleep(3000);
    
        // 狼人刀人
        system("cls");
        printGameUI(day, true);
        cout << "狼~人~请~睁~眼~~~\n";
        if(player[mySelf].role == "狼人 " && player[mySelf].alive) {
            Sleep(3000);
            cout << "输入刀人目标:";
            cin >> killWolf;
            system("cls");
            printGameUI(day, true);
            cout << "今晚击杀:" << killWolf << "号\n";
        } else {
            do {
                srand((unsigned)time(0));
                killWolf = rand() % n + 1;
            } while(player[killWolf].role == "狼人 " || !player[killWolf].alive);
            Sleep(5000);
        }
        Sleep(3000);
        system("cls");
        printGameUI(day, true);
        cout << "狼~人~请~闭~眼~~~\n";
        Sleep(2000);
    
        // 女巫
        system("cls");
        printGameUI(day, true);
        cout << "女~巫~请~睁~眼~~~\n";
        Sleep(2000);
        system("cls");
        printGameUI(day, true);
        killPoison = 0;
        int witchId = 0;
        for(int i = 1; i <= n; i++) if(player[i].role == "女巫 ") witchId = i;
    
        if(player[mySelf].role == "女巫 " && player[mySelf].alive) {
            if(hasCure) {
                cout << killWolf << "号中刀,解药A救/B不救:";
                cin >> op;
                if(op == 'A') {
                    hasCure = false;
                    if(guardTarget != killWolf) killWolf = 0;
                } else {
                    if(guardTarget == killWolf) killWolf = 0;
                }
            } else {
                if(guardTarget == killWolf) killWolf = 0;
            }
            if(hasPoison) {
                cout << "是否毒人?A毒/B不毒:";
                cin >> op;
                if(op == 'A') {
                    cout << "输入毒目标:";
                    cin >> killPoison;
                    while(!player[killPoison].alive) cin >> killPoison;
                    hasPoison = false;
                }
            }
        } else {
            bool useCure = false;
            if(hasCure && player[witchId].alive) {
                if(player[killWolf].role == "预言家 " || player[killWolf].role == "猎人 ") {
                    if(guardTarget != killWolf) {
                        killWolf = 0;
                        hasCure = false;
                        useCure = true;
                    }
                }
            }
            if(!useCure && hasPoison && player[witchId].alive) {
                srand((unsigned)time(0));
                if(rand() % 2 == 1) {
                    do {
                        killPoison = rand() % n + 1;
                    } while(player[killPoison].role == "女巫 " || player[killPoison].role == "预言家 " || killPoison == killWolf || !player[killPoison].alive);
                    hasPoison = false;
                }
            }
        }
        Sleep(3000);
        system("cls");
        printGameUI(day, true);
        cout << "女~巫~请~闭~眼~~~\n";
    
        // 预言家
        if(n > 6) {
            Sleep(3000);
            system("cls");
            printGameUI(day, true);
            cout << "预~言~家~请~睁~眼~~~\n";
            if(player[mySelf].role == "预言家 " && player[mySelf].alive) {
                int check;
                cout << "查验编号:";
                cin >> check;
                player[check].know = 1;
                cout << "身份:" << (player[check].role == "狼人 " ? "狼人" : "好人") << "\n";
            } else {
                cout << "AI预言家查验\n";
            }
            Sleep(3000);
            system("cls");
            printGameUI(day, true);
            cout << "预~言~家~请~闭~眼~~~\n";
        }
        Sleep(3000);
    
        // 结算死亡
        if(killWolf != 0) {
            player[killWolf].alive = false;
            player[killWolf].dieReason = 1;
        }
        if(killPoison != 0) {
            player[killPoison].alive = false;
            player[killPoison].dieReason = 3;
        }
        system("cls");
        system("color F0");
        printGameUI(day + 1, false);
    }
    
    // ====================== 猎人开枪 ======================
    void hunterShoot() {
        if(hunterShot) return;
        hunterShot = true;
        int shootTar;
        if(mySelf == hunterId) {
            cout << "你被淘汰,请选择开枪带走一人:";
            cin >> shootTar;
            while(!player[shootTar].alive) { cin >> shootTar; }
        } else {
            srand((unsigned)time(0));
            do { shootTar = rand() % n + 1; } while(!player[shootTar].alive);
        }
        cout << hunterId << "号猎人开枪带走" << shootTar << "号\n";
        player[shootTar].alive = false;
        player[shootTar].dieReason = 4;
        Sleep(1000);
    }
    
    // ====================== 天亮死亡播报 ======================
    void printDeadNotice() {
        cout << "天亮了!昨晚";
        if(killWolf == 0 && killPoison == 0) {
            cout << "平安夜\n";
            return;
        }
        if(killWolf != 0) cout << killWolf << "号";
        if(killPoison != 0) cout << "," << killPoison << "号";
        cout << "玩家死亡\n";
        killPoison = 0;
    }
    
    // ====================== 游戏结束展示全部身份与结局 ======================
    void showGameResult() {
        int villager = 0, wolf = 0, god = 0;
        for(int i = 1; i <= n; i++) {
            if(!player[i].alive) continue;
            if(player[i].role == "狼人 ") wolf++;
            else if(player[i].role == "村民 ") villager++;
            else god++;
        }
        if(wolf >= villager + god || god == 0) cout << "===== 狼人阵营胜利 =====" << endl;
        else cout << "===== 好人阵营胜利 =====" << endl;
        cout << "\n全部玩家身份详情:\n";
        cout << left << setw(4) << "座位" << setw(8) << "身份" << setw(6) << "状态" << "死亡原因\n";
        for(int i = 1; i <= n; i++) {
            cout << left << setw(4) << player[i].id << setw(8) << player[i].role;
            if(player[i].alive) cout << setw(6) << "存活" << "全程存活\n";
            else {
                cout << setw(6) << "死亡";
                switch(player[i].dieReason) {
                    case 1: cout << "狼人刀杀\n"; break;
                    case 2: cout << "投票放逐\n"; break;
                    case 3: cout << "女巫毒杀\n"; break;
                    case 4: cout << "猎人枪杀\n"; break;
                }
            }
        }
        system("pause");
        system("pause");
    }
    
    // ====================== 主函数游戏循环 ======================
    int main() {
        system("cls");
        cout << "========== 控制台狼人杀 ==========\n";
        cout << "请输入游玩人数(6~12):";
        cin >> n;
        cout << "身份分配加载中,请稍候";
        initRoleBase();
        setRoleCount(n);
    
        // 随机分配所有玩家身份
        for(int i = 1; i <= n; i++) {
            randomAssignRole(i);
            cout << ".";
            Sleep(17);
        }
        system("cls");
        system("color F0");
        cout << "游戏即将开始";
        for(int i = 1; i <= 6; i++) { cout << "."; Sleep(500); }
        Sleep(1500);
    
        // 分配玩家自身身份
        cout << "\n\n查看你的身份牌......\n";
        srand((unsigned)time(0));
        mySelf = rand() % n + 1;
        cout << "你的身份:" << player[mySelf].role << "\n座位:" << mySelf << "号\n";
        system("pause");
        system("cls");
        player[mySelf].know = 2;
        printGameUI(1, false);
        cout << "即将进入第一个夜晚";
        for(int i = 1; i <= 6; i++) { cout << "."; Sleep(500); }
    
        // 第一晚
        nightFirstRound();
        printDeadNotice();
        if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
        // 猎人出局开枪
        if(!player[hunterId].alive && !hunterShot) hunterShoot();
        if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
        // 白天投票
        voteProcess(2, false);
        system("cls");
        printGameUI(2, false);
        if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
        if(!player[hunterId].alive && !hunterShot) hunterShoot();
    
        // 循环多日夜(2~7天)
        for(int day = 2; day <= 7; day++) {
            cout << "即将进入夜晚";
            for(int i = 1; i <= 6; i++) { cout << "."; Sleep(500); }
            nightLoop(day, true);
            printDeadNotice();
            if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
            if(!player[hunterId].alive && !hunterShot) hunterShoot();
            if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
            voteProcess(day + 1, false);
            system("cls");
            printGameUI(day + 1, false);
            if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
            if(!player[hunterId].alive && !hunterShot) hunterShoot();
            if(checkGameOver()) { Sleep(1000); system("cls"); showGameResult(); return 0; }
        }
    
        system("pause");
        return 0;
    }
    
    
    • @ 2026-10-7 15:09:22

      会报错

      • 1