#include <iostream>
#include <cstdlib>
#include <ctime>
#include <Windows.h>
#include <conio.h>
using namespace std;
// 15人标准场游戏主函数
void brc()
{
system("cls"); // 清屏
int jy = 1; // 解药数量(女巫救人用)
int sy = 3; // 毒药数量(女巫杀人用)
srand((int)time(0)); // 初始化随机数种子
// 随机分配玩家号码(1-15号)
int n = rand() % 15 + 1;
cout << " 你是" << n << "号" << endl;
cout << " 正在分配身份" << endl;
Sleep(1500); // 暂停1.5秒增加悬念
// 初始化数组
int m[20]; // 存活状态数组,1表示存活,0表示死亡
for (int i = 1; i <= 15; i++)
m[i] = 1; // 所有人初始存活
int s[20] = {0}; // 身份数组:1=杀手,2=预言家,3=平民,4=女巫
int yy[20] = {0}; // 预言家查验结果记录数组
// 各类身份人数计数器
int l = 0, w = 0, j = 0, p = 0; // 杀手、女巫、平民、预言家(此处p应为预言家,变量命名有点混乱)
// 随机分配15个身份(2杀手、2预言家、10平民、1女巫)
for (int i = 1; i <= 15; i++)
{
do
{
int a = rand() % 4 + 1; // 随机生成1-4
if (a == 1 && l < 2) // 杀手,限制2人
{
l++;
s[i] = 1;
}
else if (a == 2 && w < 2) // 预言家,限制2人(变量w实际代表预言家)
{
w++;
s[i] = 2;
}
else if (a == 4 && p < 1) // 女巫,限制1人(变量p实际代表女巫)
{
p++;
s[i] = 4;
}
else if (a == 3 && j < 10) // 平民,限制10人
{
j++;
s[i] = 3;
}
}
while (s[i] == 0); // 如果未分配成功则重新分配
}
// 显示玩家自己的身份
if (s[n] == 1)
cout << " 你是>>杀手<<" << endl;
else if (s[n] == 2)
cout << " 你是>>预言家<<" << endl;
else if (s[n] == 3)
cout << " 你是>>平民<<" << endl;
else
cout << " 你是>>女巫<<" << endl;
cout << " 游戏将在5秒后开始" << endl;
Sleep(5000); // 给玩家5秒准备时间
// 游戏主循环变量
int c = 15; // 当前存活人数
int f = 0, flag = 0; // flag记录预言家查到的杀手编号
int day = 1; // 游戏天数
int lr; // 游戏结束判断标志
int tp[20] = {0}; // 记录投票给平民的玩家编号(平民记仇机制)
// 游戏主循环:玩家存活且存活人数大于1时继续
do
{
lr = 0;
system("cls");
cout << " 第" << day << "晚开始" << endl;
// ========== 夜晚阶段 ==========
for (int i = 1; i <= 15; i++)
{
// 玩家操作回合(如果玩家存活)
if (i == n && m[n] == 1)
{
// 玩家是杀手
if (s[n] == 1)
{
cout << " 你是杀手" << endl;
// 显示可击杀目标(非杀手且存活)
for (int j = 1; j <= 15; j++)
if (m[j] == 1 && s[j] != 1)
cout << j << " ";
cout << endl;
cout << " 你选择杀掉" << endl;
int a;
cin >> a; // 输入目标编号
m[a] = 0; // 标记死亡
cout << endl;
cout << " 杀手杀了" << a << "号";
// 显示被杀者身份
if (s[a] == 1)
cout << "(杀手)" << endl;
else if (s[a] == 2)
cout << "(预言家)" << endl;
else if (s[a] == 3)
cout << "(平民)" << endl;
else
cout << "(女巫)" << endl;
c–; // 存活人数减1
}
// 玩家是预言家
else if (s[n] == 2)
{
cout << " 你是预言家" << endl;
cout << " ";
// 显示所有存活玩家
for (int j = 1; j <= 15; j++)
if (m[j] == 1)
cout << j << " ";
cout << endl;
cout << " 你选择预言谁的身份" << endl;
int a;
cin >> a; // 输入查验目标
if (s[a] == 1)
{
cout << " " << a << "号是杀手,请注意" << endl;
Sleep(1000);
}
else
cout << " " << a << "号是平民" << endl;
}
}
// AI杀手行动(随机杀非杀手阵营的存活玩家)
else if (s[i] == 1 && m[i] == 1)
{
int a;
do
{
a = rand() % 15 + 1;
}
while (a == i || m[a] == 0 || s[a] == 1); // 不杀自己、死人、同伙
cout << " 杀手杀掉了" << a << "号";
// 显示身份…
if (s[a] == 1)
cout << "(杀手)" << endl;
else if (s[a] == 2)
cout << "(预言家)" << endl;
else if (s[a] == 3)
cout << "(平民)" << endl;
else
cout << "(女巫)" << endl;
m[a] = 0;
c–;
}
// AI预言家行动(随机查验,记录杀手位置)
else if (s[i] == 2)
{
if (flag == 0 || m[flag] == 0) // 如果还没查到杀手或杀手已死
{
int a;
do
{
a = rand() % 15 + 1;
}
while (a == i || m[a] == 0); // 不查自己、死人
if (s[a] == 1)
yy[a] = 1; // 记录查到杀手
else if (s[a] == 3)
yy[a] = 3; // 记录查到平民
}
}
// AI女巫行动(随机救人或毒人)
else if (s[i] == 4)
{
f = 0;
while (f == 0)
{
int a;
a = rand() % 2 + 1; // 1=毒人,2=救人
if (a == 1)
{
if (sy > 0) // 有毒药
{
sy–;
f = 1;
int b;
do
{
b = rand() % 15 + 1;
b = rand() % 15 + 1; // 重复随机(代码冗余)
}
while (b == i || m[b] == 0); // 不毒自己、死人
m[b] = 0;
cout << " 女巫毒死了" << b << "号";
// 显示身份…
if (s[b] == 1)
cout << "(杀手)" << endl;
else if (s[b] == 2)
cout << "(预言家)" << endl;
else if (s[b] == 3)
cout << "(平民)" << endl;
c–;
}
}
else if (a == 2 && day > 1) // 第二天起才能救人
{
if (jy > 0) // 有解药
{
jy–;
f = 1;
int b;
do
{
b = rand() % 15 + 1;
}
while (b == i || m[b] == 1); // 救死人
c++;
cout << " 女巫复活了" << b << "号" << endl;
m[b] = 1;
}
}
}
}
}
// 玩家是女巫时的特殊操作界面
if (s[n] == 4)
{
cout << " 你是女巫" << endl;
cout << "存活状况:" << endl;
for (int j = 1; j <= 15; j++)
if (m[j] == 1)
cout << j << " ";
cout << endl;
cout << " 你选择 1.* 杀 *还是 2.* 救 *" << endl;
int a, f = 0;
while (f == 0)
{
cin >> a;
if (a == 1) // 选择杀人
{
if (sy > 0)
{
sy–;
f = 1;
cout << " 你选择了杀人" << endl;
for (int i = 1; i <= 15; i++)
if (m[i] == 1)
cout << i << " ";
cout << endl;
int b;
cin >> b;
// 显示目标身份…
if (s[b] == 1)
cout << "(杀手)" << endl;
else if (s[b] == 2)
cout << "(预言家)" << endl;
else if (s[b] == 3)
cout << "(平民)" << endl;
else
cout << "(女巫)" << endl;
m[b] = 0;
c–;
}
else
{
cout << ">>毒药<<不足" << endl;
}
}
else if (a == 2) // 选择救人
{
if (jy > 0)
{
jy–;
f = 1;
cout << "你选择了复活" << endl;
cout << "阵亡名单:" << endl;
for (int i = 1; i <= 15; i++)
if (m[i] == 0)
cout << i << "号,身份:" << s[i] << " " << endl;
int b;
cin >> b;
m[b] = 1;
c++;
}
else
{
cout << ">>复活药水<<不足" << endl;
}
}
}
}
Sleep(1000);
double p[20] = {0}; // 投票计数数组
cout << " 第" << day << "晚结束" << endl;
cout << endl;
// 检查玩家是否死亡
if (m[n] == 0)
{
cout << " 你已经>>死<<了";
break; // 玩家死亡,游戏结束
}
// ========== 白天投票阶段 ==========
cout << " 存活:" << endl;
cout << " ";
for (int i = 1; i <= 15; i++)
if (m[i] == 1)
cout << i << " ";
cout << endl;
cout << " 请投票…." << endl;
// 遍历所有玩家进行投票
for (int i = 1; i <= 15; i++)
{
// 玩家投票
if (i == n && m[n] == 1)
{
cout << endl;
cout << " 你选择投几号" << endl;
int a = 99;
while (a == 99)
{
cin >> a;
if (a == 99) // 输入99查看各玩家身份提示(作弊功能)
for (int i = 1; i <= 15; i++)
if (m[i] == 1)
cout << " " << i << "." << s[i] << endl;
}
// 平民第5天后有1.5票权重
if (s[i] == 3 && day > 4)
p[a] += 1.5;
else
p[a]++;
cout << endl;
cout << " " << i << "->" << a << endl;
if (s[a] == 3)
{
tp[a] = i; // 记录谁投了平民,用于平民记仇机制
}
}
// AI杀手投票(投非杀手)
else if (s[i] == 1 && m[i] == 1)
{
int a;
do
{
a = rand() % 15 + 1;
}
while (m[a] == 0 || a == i || s[a] == 1); // 不投死人、自己、同伙
p[a]++;
cout << " " << i << "->" << a << endl;
if (s[a] == 3)
{
tp[a] = i;
}
}
// AI预言家投票(优先投查到的杀手,否则投非平民)
else if (s[i] == 2 && m[i] == 1)
{
if (flag != 0) // 如果查到杀手
{
p[f]++;
cout << " " << i << "->" << flag << endl;
}
else
{
int a;
do
{
a = rand() % 15 + 1;
}
while (m[a] == 0 || a == i || yy[a] == 3); // 不投查到的平民
p[a]++;
if (s[a] == 3)
{
tp[a] = i;
}
cout << " " << i << "->" << a << endl;
}
}
// AI平民投票(记仇机制:投昨晚投自己的人)
else if (s[i] == 3 && m[i] == 1)
{
if (tp[i] == 0) // 没人投过自己
{
int a;
do
{
a = rand() % 15 + 1;
}
while (m[a] == 0 || a == i);
p[a]++;
cout << " " << i << "->" << a << endl;
}
else // 有人投过自己,报复
{
if (m[tp[i]] == 1) // 如果那人还活着
{
p[tp[i]]++;
cout << " " << i << "->" << tp[i] << endl;
}
else // 那人已死,随机投
{
int a;
do
{
a = rand() % 15 + 1;
}
while (m[a] == 0 || a == i);
p[a]++;
cout << " " << i << "->" << a << endl;
}
}
}
// AI女巫投票(随机)
else if (s[i] == 4 && m[i] == 1)
{
int a;
do
{
a = rand() % 15 + 1;
}
while (m[a] == 0 || a == i);
p[a]++;
cout << " " << i << "->" << a << endl;
}
}
// 投票结果统计
system("cls");
cout << " 投票情况:" << endl;
for (int i = 1; i <= 15; i++)
if (m[i] == 1)
cout << " " << i << "号" << " 票数:" << p[i] << endl;
// 找出票数最高者出局
int sw, max = -100;
for (int i = 1; i <= 15; i++)
{
if (p[i] > max)
{
sw = i;
max = p[i];
}
}
m[sw] = 0; // 标记死亡
cout << " " << sw << "死了" << endl;
c–;
cout << " " << sw << "号的身份是";
// 显示出局者身份…
if (s[sw] == 1)
cout << "杀手" << endl;
else if (s[sw] == 2)
cout << "预言家" << endl;
else if (s[sw] == 3)
cout << "平民" << endl;
else
cout << "女巫" << endl;
day++; // 进入下一天
// 判断游戏是否结束
// 非杀手阵营:检查是否还有杀手存活
if (s[n] != 1)
{
for (int i = 1; i <= 15; i++)
if (s[i] == 1 && m[i] == 1)
lr = 1; // 还有杀手,继续游戏
}
else // 玩家是杀手
{
if (s[n] == 1 && c == 2) // 只剩2人(杀手+1人)
lr = 0; // 杀手胜利
}
system("pause"); // 暂停等待按键
cout << endl;
}
while (m[n] == 1 && c > 1); // 玩家存活且存活人数大于1时循环继续
cout << " 游戏结束" << endl;
}
// 主菜单函数
int main()
{
srand((int)time(0)); // 初始化随机数
char a = '1';
while (1) // 无限循环菜单
{
system("cls");
cout << " 杀手游戏" << endl;
cout << "——————————————————————————–" << endl;
cout << " 1.开始游戏" << endl;
cout << " 2.查看游戏规则" << endl;
a = getch(); // 无回显获取按键
if (a == '1') // 开始游戏
{
cout << " 1. 15人场" << endl;
cout << " 2. 30人娱乐战(10猎人)<敬请期待>" << endl;
a = '2';
while (a == '2')
{
a = getch();
switch (a)
{
case '1':
brc(); // 进入15人场
break;
}
if (a == '1')
break;
}
if (a == '1')
break;
}
else if (a == '2') // 查看规则
{
// 显示游戏规则说明
cout << "杀手:每当晚上的时候可使用杀人权杀掉一人" << endl; // 1
cout << "预言家:每天晚上可以知道一个人的身份" << endl; // 2
cout << "平民:无技能,当玩家是平民时,在第5天拥有1.5票的投票权" << endl; // 3
cout << "猎人:此身份仅限于30人娱乐局中,死亡后可带走一人" << endl;
cout << "投票细则:\\n游戏中除了你以外全是由超级AI人工代替" << endl;
cout << "杀手不会杀掉朋友,但不包括投票环节" << endl;
cout << "预言家如果预言到杀手将一直对他投票,如果预言到平民将永远不会对他投票" << endl;
cout << "平民将投上一个晚上对他投票他的人" << endl;
cout << "********利用好超级AI游戏规则找出杀手**********" << endl;
system("pause"); // 暂停等待
}
}
return 0;
}



