狼人杀AI系统(C++实现,用者自取)

#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;
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值