#include <iostream>
#include <windows.h>
#include <algorithm>
#include <ctime>
#include <stdlib.h>
using namespace std;
int a[] = {0, 1, 1, 1, 1, 1, 2, 3, 4};//2为狼人 3为女巫 4为预言家
bool WolfSurvive = true;//游戏胜负的标志
bool VillagerSurvive = true;
bool flag = false;
bool IsSilentNight = true;
//bool SomeoneDied = false;
int MyId, lucky;
int ran[] = {12, 30, 25, 39, 66, 19};//随便填的
//%8结果 4 6 1 5 2 3
struct Player{
bool survival;
int identity;
int voting;//票数
bool IfDiedPastRound;//是否之前已经趋势(投票用)
}p[9];
void StartMenu(){
cout << "欢迎来到狼人杀awa" << endl;
Sleep(2000);
system("cls");
cout << "-------------游戏开始-------------" << endl;
Sleep(2000);
system("cls");
}
bool IfWolfSurvive(int lucky)
{
if(p[lucky].survival == true && p[lucky].identity == 2)
{
WolfSurvive = false;
p[lucky].survival = false;//如果说抽中的幸运儿是狼人 那么更新狼的状态 返回狼人已经死亡
return false;
}
return true;
}
void CoutIdentity(int b){
if(p[b].identity == 1) cout << "平民" << endl;
else if(p[b].identity == 2) cout << "狼人" << endl;
else if(p[b].identity == 3) cout << "女巫" << endl;
else cout << "预言家" << endl;
}
void ChooseIdentity(){
random_shuffle(a+1, a+1+8);//1 - 8元素进行随机打乱
for(int i = 1;i <= 8;i ++)
p[i].identity = a[i];
cout << "你的序号为" << MyId << " 你的身份为";
if(p[MyId].identity == 1) cout << "平民" << endl;
else if(p[MyId].identity == 2) cout << "狼人" << endl;
else if(p[MyId].identity == 3) cout << "女巫" << endl;
else cout << "预言家" << endl;
}
void WolfChoose(int lucky){
//system("cls");
cout << "天黑请闭眼~~~~~~" << endl;
cout << "狼人请睁眼~~~~~~" << endl;
if(p[MyId].identity == 2 && p[MyId].survival == false)
cout << "你已经趋势" << endl;
else if(p[MyId].identity == 2)//当玩家自己是狼人
{
RETURN1://存档奥
cout << "请问你要杀谁" << endl;
cin >> lucky;
while(true){
if(p[lucky].IfDiedPastRound == true){
cout << "他已经died了捏 awa" << endl;
goto RETURN1;
}
if (p[lucky].survival == true && p[lucky].identity != 2)//防止把自己杀了awa
{
p[lucky].survival = false;
break;
}
else if(p[lucky].survival == false){//当选择的玩家已经死亡
cout << "该玩家已经死亡 请重新选择" << endl;
goto RETURN1;
}
else{
cout << "你不能杀害自己" << endl;
goto RETURN1;
}
}
}
else{
while (true)
{
if(MyId == lucky){//头一次听说狼人还能自杀的
lucky = rand()%8 + 1;//重挑
}
else {
p[lucky].survival = false;
break;
}
}
}
cout << "狼人请闭眼~~~~~~~" << endl;
Sleep(3000);
system("cls");
}
//测试过力 要累死孩子啦 bug暂时没找到 tmd写到12点了有点顶不住 思路乱的一批 润了润了
void WitchChoose(int lucky){
int posion;
cout << "女巫请睁眼~~~~~~~" << endl;
if(p[MyId].survival == false && p[MyId].identity == 3)
cout << "你已经喜亡" << endl;
else if(p[MyId].identity == 3)//自己是女巫
{
cout << "你有三个选择 1.杀人\n2.救人\n3.什么也不做\n输入你的选择所对应的序号" << endl;
cin >> posion;
if(posion == 1)
{
RETURN2:
cout << "请问你要杀谁" << endl;
cin >> lucky;
while(true){
if(p[lucky].IfDiedPastRound == true){
cout << "他已经died了捏 awa" << endl;
goto RETURN2;
}
if(lucky <= 0 || lucky > 8){
cout << "你输入的这个人我不认识啊 重新输一个吧" << endl;
goto RETURN2;
}
else if (p[lucky].survival == true && p[lucky].identity != 3)//啊我承认是抄的上面的
{
p[lucky].survival == false;
//cout << p[lucky].survival << endl;
cout << "Complete!" << endl;
Sleep(2000);
break;
}
else if(p[lucky].survival == false){//你知道我要说什么
cout << "该玩家已经死亡 请重新选择" << endl;
goto RETURN2;
}
else if(p[lucky].identity == 3){
cout << "你不能杀害自己" << endl;
goto RETURN2;
}
// if(p[lucky].identity == 2 && p[lucky].survival == false)
// WolfSurvive = false;//把狼人毒死了(后期加的不知道有没有Bug)
}
system("cls");
}
else if(posion == 2)
{
int cure;
while(true){
cout << "请问你要救谁" << endl;
cout << "昨晚" << lucky << "号寄了" << endl;
cin >> cure;
if(cure <= 0 || cure > 8) {
cout << "你输入的这个人我不认识啊 重新输一个吧" << endl;
system("pause");
}
else if(p[cure].survival == false) {
p[cure].survival = true;
//cout << p[cure].survival << endl;
cout << "Complete!" <<endl;
Sleep(2000);
break;
}
else if(p[cure].survival == true){
cout << "这个人还活着捏" << endl;
}
system("cls");
}
}
else{
cout << "All right." << endl;
system("cls");
}
}
else{//自己不是女巫
int a1[] = {0, 1, 2, 3};
while (true)
{
random_shuffle(a + 1, a + 1 + 3);//别tm随机数了cao麻烦死了
int option = a1[1];//女巫人机的选择
if(option == 1){
//cout << "6";//先占位
if(p[lucky].survival == true && p[lucky].identity != 3){//确认不是女巫人机自己
p[lucky].survival = false;
break;
}
else if(p[lucky].survival == false){//抽中的已经趋势力
lucky = rand()%8 + 1;//再抽一次吧受不了了 tmd是伪随机就伪随机吧
}
else{//tmd你是真点背啊抽自己身上了
lucky = (ran[(rand()%6 + 1)%(rand()%8 + 1)])%8;//你在尝试一种很新的随机数
}
}
else if(option == 2){
RETURN3:
if(p[lucky].survival == true){
lucky = rand()%8 + 1;
goto RETURN3;//如果说抽到的人还活着就重新生成
}
if(p[lucky].survival == false){//复活吧!! 我的lucky!!!(超大声)
p[lucky].survival = true;
break;
}//tmd偷个懒吧孩子要累死了 写了两个多小时了
}
//if(p[lucky].identity == 2 && p[lucky].survival == false)
//WolfSurvive = false;//抄的上面的
}
}
if(!IfWolfSurvive(lucky)) WolfSurvive = false;//如果在函数中判断狼人已经被杀 直接修改全局变量
cout << "女巫请闭眼~~~~~~~" << endl;
}
void Predictor(){
Sleep(2000);
system("cls");
int sb;//我发誓不是骂人 somebody太长了真的
cout << "预言家请睁眼~~~~~~~" << endl;
if(p[MyId].survival == false && p[MyId].identity == 4)
cout << "你已经喜亡" << endl;
else if(p[MyId].identity == 4){
cout << "请问你想知道谁的身份" << endl;
cin >> sb;
cout << sb << "的身份为 :" ;
CoutIdentity(sb);//md为什么不能和cout写一块啊 cao
}
cout << "预言家请闭眼~~~~~~~" << endl;
Sleep(2000);
system("cls");
}
//还没测试还没测试
void vote(){
Sleep(3500);
system("cls");
cout << "你的序号为 :" << MyId << " 你的身份为 :";
CoutIdentity(MyId);
for(int i = 1;i <= 8;i ++){
if(p[i].survival == false){
IsSilentNight = false;
}
}
if(IsSilentNight) cout << "昨晚是个平安夜" << endl;
else{
for(int i = 1;i <= 8;i ++){
if(p[i].IfDiedPastRound == true && p[i].survival == false)//如果之前回合已经趋势 那么不输出东西 继续循环
continue;
else if(p[i].survival == false){
cout << "昨晚" << i << "号寄了" << endl;
p[i].IfDiedPastRound = true;
Sleep(2000);
}
}
}
for(int i = 1;i <= 8;i ++){
cout << "序号 :" << i << " ";
if(p[i].survival == true) cout << "存活" << endl;
else cout << "死亡" << endl;
}
int MaxVote = 0;
int id1 = 0;
for (int i = 1; i <= 8; i++)
{
if(p[i].survival == false){//如果说轮到投票的人已经趋势 那么直接跳过
if(i == MyId) cout << "You have already died\n";
continue;
}
if(i == MyId && p[MyId].survival == true){//该你投票啦
int iden;
cout << "你的回合\n 请投票" << endl;
while (true)
{
cout << "你想投给谁" << endl;
cin >> iden;
if(iden == MyId) cout << "你不能投给自己" << endl;
else if(p[iden].survival == false) {
cout << "没必要吧哥 人家都寄了还投人家啊" << endl;
Sleep(1500);
}
else if(p[iden].survival == true){
p[iden].voting ++;
cout << MyId << "投给了" << iden << "号" << endl;
break;
}
}
//system("cls");
}
else{//人坤投票奥
RETURN4:
lucky = rand()%8 + 1;
if(lucky == i){//投自己是不是有点过分了
goto RETURN4;
}
else if(p[lucky].IfDiedPastRound == true) goto RETURN4;
else{
p[lucky].voting ++;
}
cout << i << "投给了" << lucky << "号\n";
}
}
for(int i = 1;i <= 8;i ++)
{
if(MaxVote < p[i].voting){
MaxVote = p[i].voting;
id1 = i;
}
}
p[id1].survival = false;
p[id1].IfDiedPastRound = true;
for(int i = 1;i <= 8;i ++)
cout << "序号 :" << i << " 票数 :" << p[i].voting << endl;
if(id1) cout << id1 << "被投票出局" << endl;//这里特判一下 因为会出现全部都0票的情况
else cout << "昨晚没有人被投出" << endl;
if(!IfWolfSurvive(id1)) WolfSurvive = false;//判断一下狼人是否存活
if(!WolfChoose) cout << "游戏结束 平民胜利" << endl;
return;
}
void GameStart();
/*
void Judge(){
for (int i = 1; i <= 8; i++)
{
if(p[i].identity != 2 && p[i].survival == true){//只要有一个除狼人外的人活着 那么狼人就没有赢
//游戏未结束
VillagerSurvive = true;
flag = true;
break;
}
}
if(!flag) VillagerSurvive = false;//如果flag = false就是没有除了狼人外的人活着
//Judge这里 游戏只能进行两轮 结果存在问题
if(WolfSurvive == false){//狼人趋势
cout << "游戏......";
Sleep(3000);
cout << "结束 平民胜利" << endl;
Sleep(5000);
system("cls");
}
else if(VillagerSurvive == false){//除狼人外的都趋势
cout << "游戏......";
Sleep(3000);
cout << "结束 狼人胜利" << endl;
Sleep(5000);
system("cls");
}
else{
cout << "游戏......" ;
Sleep(3000);
cout << "继续" << endl;
for (int i = 1; i <= 8; i++)
p[i].voting = 0;//下一轮投票前将每人票数更新为0
GameStart();//游戏继续
}
//Sleep(3000);
cout << "游戏结束力(喜)" << endl;
for(int i = 1;i <= 8;i ++){
cout << "序号 :" << i << " ";
CoutIdentity(i);
}
}
*/
void Judge(){
int VillagerDied = 0;
for(int i = 1;i <= 8;i ++){
if(p[i].identity == 2 && p[i].survival == false){//狼人趋势了投个√8票啊
cout << "游戏结束 平民获胜" << endl;
for(int i = 1;i <= 8;i ++){
cout << "序号 :" << i << " ";
CoutIdentity(i);
}
Sleep(2500);
return;
}
}
cout << "游戏......" ;
Sleep(3000);
for(int i = 1;i <= 8;i ++){//确认一下有多少人趋势
if(p[i].survival == false){
if(p[i].identity != 2) VillagerDied ++;
else{
cout << "结束 平民胜利" << endl;
for(int i = 1;i <= 8;i ++){
cout << "序号 :" << i << " ";
CoutIdentity(i);
}
Sleep(3000);
return;
}
}
}
if(VillagerDied == 7){
cout << "结束 狼人胜利" << endl;
for(int i = 1;i <= 8;i ++){
cout << "序号 :" << i << " ";
CoutIdentity(i);
}
Sleep(3000);
return;
}
else{
cout << "继续" << endl;
Sleep(3000);
for(int i = 1;i <= 8;i ++)
p[i].voting = 0;//下一轮游戏前将票数更改回0
GameStart();
}
}
void GameStart(){
WolfChoose(lucky);
//p[MyId].identity = 3;//测试时使用
WitchChoose(lucky);//测试过力awa 暂时不知道有啥bug
Predictor();
vote();//这玩意也不好测试啊tmd
Judge();
}
//----------------Main Function----------------
int main()
{
srand ((unsigned int)time(NULL));//随机数种子
for(int i = 1;i <= 8;i ++)//初始化一下 所有人都是活着的且票数都为0
{
p[i].survival = true;
p[i].voting = 0;
p[i].IfDiedPastRound = false;
}
MyId = rand()%8 + 1;//保证是真随机数 不然一直当狼人是吧 什么刽子手
lucky = rand()%8 + 1;//自己不是狼人时 保证每次杀的都不一样
StartMenu();
ChooseIdentity();
GameStart();
system("pause");
return 0;
}
狼人杀AI系统(C++实现,用者自取)
最新推荐文章于 2024-04-04 15:34:55 发布