多人游戏:能量+道具+技能,来一场酣畅淋漓的对决

游玩的时候记得在编译时做以下操作:点击工具->编译选项->编译器->编译时加入以下命令打钩->输入-std=c++14

还要把输出框的大小改成:长165,宽65。更舒适。

(大家可以教教我怎么用程序修改长宽)

游戏分为四个身份,四人游玩。

首先查看技能和道具简介,然后开始游戏。

每一回合可以从道具池中抽奖,并用抽到的能量使用技能。

玩家死亡是在回合结束后算的。

“下一回合跳过xx”会在下一次轮到被使用者后自动跳过。

可能会有亿点BUG,如果出现问题或者有不合理的地方(如能量消耗与技能强度),大家可以积极留言。

一键三连拿走呦~

(第一个千行大作,希望大家多多支持呀)

#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
 
vector<string> id={"冰火战士","药剂巫师","骷髅法师","太乙真人"};  //身份
vector<string> prize={"谢谢惠顾","谢谢惠顾","谢谢惠顾","谢谢惠顾","谢谢惠顾","谢谢惠顾","谢谢惠顾","谢谢惠顾","谢谢惠顾","谢谢惠顾","一次抽奖机会","一次抽奖机会","一次抽奖机会","一次抽奖机会","一次抽奖机会","两次抽奖机会","两次抽奖机会","两次抽奖机会","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","一格能量","两格能量","两格能量","两格能量","两格能量","两格能量","两格能量","两格能量","两格能量","两格能量","两格能量","两格能量","两格能量","两格能量","三格能量","三格能量","三格能量","三格能量","三格能量","三格能量","三格能量","四格能量","四格能量","四格能量","四格能量","四格能量","气拳","气拳","气拳","气拳","气拳","气拳","气拳","气拳","气拳","气拳","气拳","气拳","气拳","气拳","气拳","紧箍咒","紧箍咒","紧箍咒","紧箍咒","紧箍咒","紧箍咒","紧箍咒","紧箍咒","紧箍咒","紧箍咒","大雾弥漫","大雾弥漫","大雾弥漫","大雾弥漫","大雾弥漫","大雾弥漫","知识的洗礼","知识的洗礼","知识的洗礼","知识的洗礼","知识的洗礼","知识的洗礼"}; //奖池
/*
谢谢惠顾:10%
一次抽奖机会:5%
两次抽奖机会:3%
一格能量:20%
两格能量:13%
三格能量:7%
四格能量:5%
气拳:15%
紧箍咒:10%
大雾弥漫:6%
知识的洗礼:6%
*/
vector<string> by;  //备用奖池
vector<string> dj;  //总道具
vector<string> hv_jn[10];  //玩家拥有技能
vector<string> hv_dj[10];  //玩家拥有道具
string what[15][15];  //奖池内容
int srt,wj,hh,sum=100,leave,wz,win,jh[10],hp[10],nl[10],hj[10],du[10],all[10],chou[10],ji[10],xmc,qys,kl[10],dwmm[10];  //输入次数,当前玩家,回合,奖池剩余量,死亡人数,雾中人数,胜利者,抽奖机会,血量,能量,护甲,持续扣1格血的回合数,被跳过的回合数,被跳过的抽奖阶段数,被跳过的使用技能阶段数,休眠舱层数,轻羽扇是否使用,被傀儡的回合数,处在大雾弥漫几回合。
bool vis[15][15],die[10]; //奖池格子是否被抽过,玩家是否死亡 
map<int,string> num_jn;  //编号变技能名 
map<int,string> num_dj;  //编号变道具名 
map<string,int> name_num;  //道具名变编号 
map<string,int> name_nl;  //技能名变能量 
map<string,string> des;  //简介 

void SetConsoleSize(int width,int height)
{
    HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD bufferSize={static_cast<short>(width),static_cast<short>(height)};
    if(!SetConsoleScreenBufferSize(hConsole,bufferSize))
    SMALL_RECT windowSize={0,0,static_cast<short>(width-1),static_cast<short>(height-1)};
}
 
string finding(string key_to_find)  //查找 
{
    std::map<std::string,std::string>::iterator it=des.find(key_to_find);
    if(it!=des.end())
    {
        return it->second;
    }
    else
    {
        return "暂无。";
    }
}
void describe(string th) //输出简介 
{
	cout<<finding(th)<<endl<<endl;
	return ;
}
 
void join_des()  //添加描述 
{
	//冰火 
	hv_jn[1].push_back("轻羽扇");
	hv_jn[1].push_back("冰原域");
	hv_jn[1].push_back("休眠舱");
	hv_jn[1].push_back("焱冰束");
	des["轻羽扇"]="轻羽扇,辅助技能,消耗2格能量,获得「火」效果,使下一次伤害附加火焰效果,即伤害翻倍(不能叠加)。\n";
	des["冰原域"]="冰原域,控制技能,消耗3格能量,对所有敌人使用,附加「缓诅」效果,即跳过其下一回合抽道具阶段。\n";
	des["休眠舱"]="休眠舱,防御技能,消耗2格能量,下一回合获得「反甲」效果,可在本回合内抵御一次任意数值攻击,并对攻击者造成所抵御攻击的50%伤害反甲(向下取整)。\n";
	des["焱冰束"]="焱冰束,攻击技能,消耗3格能量,选择一人使用,造成2格伤害,并附加「冰火」效果,下一回合再次造成1格伤害。\n";
	//巫师 
	hv_jn[2].push_back("红十字");
	hv_jn[2].push_back("四面雨");
	hv_jn[2].push_back("藤生壁");
	hv_jn[2].push_back("沼泽漫");
	des["红十字"]="红十字,辅助技能,消耗2格能量,对自己使用生命药剂,回复自己1~3格hp(上限10格)\n";
	des["四面雨"]="四面雨,控制技能,消耗3格能量,选择一人使用,附加「逃遁」效果,在其身边降下药雨,使其不得不躲避,即跳过整个下一回合。\n";
	des["藤生壁"]="藤生壁,防御技能,消耗2格能量,在面前使用生长药剂,迅速长出高大的藤蔓,即获得护盾,可承受2格伤害。\n";
	des["沼泽漫"]="沼泽漫,攻击技能,消耗3格能量,选择一人使用,投射毒药剂,附加「毒心骨」效果,造成1格伤害,并持续两回合造成1格伤害。\n";
	//法师 
	hv_jn[3].push_back("百鬼行");
	hv_jn[3].push_back("牵魂索");
	hv_jn[3].push_back("骸骨甲");
	hv_jn[3].push_back("兵临城");
	des["百鬼行"]="百鬼行,辅助技能,消耗3格能量,选择一人使用,召唤百鬼,附加「逃遁」效果,使其不得不隐藏起来,即跳过整个下一回合。\n"; 
	des["牵魂索"]="牵魂锁,控制技能,消耗5格能量,选择一人使用,附加「傀儡戏」效果,使其变为傀儡,控制其身体为己所用一回合。\n";
	des["骸骨甲"]="骸骨甲,防御技能,消耗2格能量,给自己及傀儡套上一层装甲,可承受1格伤害。\n";
	des["兵临城"]="兵临城,攻击技能,消耗2~5格能量,召唤一群骷髅骑兵,攻击一人消耗2格能量,攻击两人消耗4格能量,攻击三人消耗5格能量,并对被攻击者造成2格伤害。\n";
	//太乙 
	hv_jn[4].push_back("洒玉露");
	hv_jn[4].push_back("酒壶吸");
	hv_jn[4].push_back("金莲身");
	hv_jn[4].push_back("如律令");
	des["洒玉露"]="洒玉露,辅助技能,消耗2格能量,恢复自己2格hp,并随机恢复一人1格hp。\n"; 
	des["酒壶吸"]="酒壶吸,控制技能,消耗2格能量,选择一人使用,夺取随机一个道具(若没有道具,则获得一次抽奖机会)。\n";
	des["金莲身"]="金莲身,防御技能,消耗2格能量,进入十二品金莲冷静一波,获得2格护甲,并有20%概率恢复1格hp。\n";
	des["如律令"]="如律令,攻击技能,消耗3格能量,选择一人使用,对其施加急急如律令,造成2格伤害,并随机误伤一人造成1格伤害。\n";
	//道具 
	dj.push_back("气拳");
	dj.push_back("紧箍咒");
	dj.push_back("大雾弥漫");
	dj.push_back("知识的洗礼");
	des["气拳"]="气拳,普通攻击,选择一人使用,造成1格伤害。\n";
	des["紧箍咒"]="紧箍咒,普通控制,选择一人使用,附加「禁锢」效果,使其下一回合无法使用技能,只能抽道具和使用道具。\n";
	des["大雾弥漫"]="大雾弥漫,普通防御,获得「雾中」效果,进入隐蔽状态,本回合无法被选中,但也无法使用技能及其余道具。\n";
	des["知识的洗礼"]="知识的洗礼,普通辅助,恢复1格1hp,并消除身上的所有负面效果。\n";
	return ;
}
 
void dl()  //打乱道具池 
{
	for(int i=1;i<=10;i++)
	{
		for(int j=1;j<=10;j++)
		{
			int r=rand()%prize.size();
			what[i][j]=prize[r];
			by.push_back(prize[r]);
			prize.erase(prize.begin()+r,prize.begin()+r+1);
		}
	}
	return ;
}
 
void check()  //查看简介 
{
	system("cls");
	int ud=0,tg=0;
	printf("现在所有人开始查看技能与道具的简介...\n\n");
	system("pause");
	printf("\n\n");
	printf("是否选择跳过(1 跳过 / 其余任意数 不跳过):");
	scanf("%d",&tg);
	printf("\n\n");
	if(tg==1) return ;
	system("cls");
	int want;
	while(1)
	{
		for(int i=1;i<=4;i++) cout<<i<<":"<<id[i-1]<<endl;
		cout<<5<<":道具"<<endl;
		while(1)
		{
			printf("输入1~5查看具体内容,6跳过...\n\n");
			scanf("%d",&want);
			printf("\n\n");
			if(want==6) return ;
			if(want<1||want>7)
			{
				printf("不能输入范围之外,请重新输入!\n\n");
				Sleep(500);
				system("pause");
				continue;
			}
			system("cls");
			break;
		}
		if(want<=4)
		{
			for(int i=1;i<=4;i+=ud+1)
			{
				ud=0;
				cout<<hv_jn[want][i-1]<<":"<<endl<<endl;
				describe(num_jn[(want-1)*4+i]);
				if(i==1)
				{
					printf("输入任意数查看下一张:");
					scanf("%d",&ud);
					ud=0;
					system("cls");
				}
				else if(i==4)
				{
					printf("输入1查看上一张/输入其余任意数 结束 :");
					scanf("%d",&ud);
					if(ud==1) ud=-2;
					else
					{
						system("cls");
						break;
					}
					system("cls");
				}
				else
				{
					printf("查看 输入1 上一张/输入2 下一张/输入其余任意数  跳过:");
					scanf("%d",&ud);
					if(ud==1) ud=-2;
					else if(ud==2) ud=0;
					else break;
					system("cls");
				}
			}
		}
		else
		{
			for(int i=1;i<=4;i+=ud+1)
			{
				ud=0;
				cout<<dj[i-1]<<":"<<endl<<endl;
				describe(num_dj[i]);
				if(i==1)
				{
					printf("输入任意数查看下一张:");
					scanf("%d",&ud);
					ud=0;
					system("cls");
				}
				else if(i==4)
				{
					printf("输入1查看上一张/输入其余任意数 结束 :");
					scanf("%d",&ud);
					if(ud==1) ud=-2;
					else
					{
						system("cls");
						break;
					}
					system("cls");
				}
				else
				{
					printf("查看 输入1 上一张/输入2 下一张/输入其余任意数  跳过:");
					scanf("%d",&ud);
					if(ud==1) ud=-2;
					else if(ud==2) ud=0;
					else break;
					system("cls");
				}
			}
		}
		system("cls");
	}
	return ;
}
 
void gj(int who,int to,int no)  //攻击(攻击者,被攻击者,伤害) 
{
	if(die[to])
	{
		printf("该玩家已死亡,请重新选择。");
		Sleep(500);
		system("pause");
		return ;
	}
	if(to==1&&xmc)
	{
		printf("玩家1的一个休眠舱遭受破坏,已退出该舱体,本体不会受到伤害。反甲发动,攻击者玩家%d受到%d格伤害。\n\n",who,(int)floor(0.5*no));
		xmc--;
		hp[who]-=(int)floor(0.5*no);
		if(xmc==0) hj[1]=0;
		Sleep(500);
		system("pause");
		return ;
	}
	if(who==1&&qys)
	{
		printf("玩家1处于「火」效果,伤害翻2倍");
		no*=2;
		qys=0; 
		Sleep(500);
		system("pause");
	}
	if(hj[to]>=no) hj[to]-=no;
	else
	{
		no-=hj[to];
		hj[to]=0;
		hp[to]-=no;
	}
	return ;
}
 
void print1(int www)  //打印道具池 
{
	system("cls");
	printf("┏");
	for(int i=1;i<=39;i++) printf("━");
	printf("┓\n");
	
	printf("┃");
	for(int i=1;i<=8;i++) printf("  ");
	printf("道具池");
	for(int i=1;i<=8;i++) printf("  ");
	printf(" ┃\n");
	
	printf("┃");
	for(int i=1;i<=3;i++) printf("  ");
	printf("奖池有10排10列,100个格子哦");
	for(int i=1;i<=3;i++) printf("  ");
	printf(" ┃\n");
	
	printf("┣");
	for(int i=1;i<=9;i++) printf("━━━┳");
	printf("━━━┫\n┃");
	int x=1,y;
	for(int i=1;i<=10;i++)
	{
		y=i;
		if(vis[x][y]) printf("╱  ┃");
		else printf("   ┃");
	}
	printf("\n");
	
	for(int i=1;i<=9;i++)
	{
		x=i+1;
		printf("┣");
		for(int i=1;i<=9;i++) printf("━━━╋");
		printf("━━━┫\n┃");
		for(int i=1;i<=10;i++)
		{
			y=i;
			if(vis[x][y]) printf("╱  ┃");
			else printf("   ┃");
		}
		printf("\n");
	}
	
	printf("┗");
	for(int i=1;i<=9;i++) printf("━━━┻");
	printf("━━━┛\n");
	system("pause");
	system("cls");
	return ;
}
 
void print2(int www)  //打印玩家状态 
{
	system("cls");
	for(int i=1;i<=4;i++)
	{
		if(die[i]) continue;
		printf("玩家%d:\nhp:",i);
		for(int j=1;j<=hp[i];j++) printf("□");
		if(hp[i]<=0) cout<<hp[i];
		printf("\n护甲:");
		if(hj[i]==1e9) printf("无限");
		else for(int j=1;j<=hj[i];j++) printf("□");
		if(hj[i]==0) cout<<"无";
		printf("\n能量:%d",nl[i]);
		printf("\n抽奖机会:%d",jh[i]);
		printf("\n拥有道具:");
		for(auto j:hv_dj[i]) cout<<j<<"  ";
		if(hv_dj[i].empty()) cout<<"无";
		printf("\n拥有技能(所需能量):");
		for(auto j:hv_jn[i])
		{
			cout<<j<<"(";
			if(j!="兵临城") cout<<name_nl[j];
			else cout<<"2~5";
			cout<<")  ";
		}
		printf("\n所处状态:");
		bool bb=0;
		if(du[i]) printf("持续扣1格血%d回合  ",du[i]),bb=1;
		if(all[i]) printf("跳过%d个整个回合  ",all[i]),bb=1;
		if(chou[i]) printf("跳过%d个抽奖阶段  ",chou[i]),bb=1;
		if(ji[i]) printf("跳过%d个使用技能阶段  ",ji[i]),bb=1;
		if(i==1&&xmc) printf("%d层休眠舱  ",xmc),bb=1;
		if(i==1&&qys) printf("伤害翻2倍  "),bb=1;
		if(kl[i]) printf("被玩家3控制%d回合  ",kl[i]),bb=1;
		if(dwmm[i]) printf("处于雾中%d回合  ",dwmm[i]),bb=1;
		if(!bb) cout<<"无";
		printf("\n\n");
	}
	printf("玩家%d的回合!\n\n",www);
}
	
void cj(int &l)  //抽奖 
{
	if(chou[l])
	{
		printf("玩家%d本回合跳过抽道具阶段,不能抽道具。\n\n",l);
		chou[l]--;
		Sleep(500);
		system("pause");
		return ;
	}
	int x=0,y=0;
	while(jh[l])
	{
		print1(l);
		print2(l);
		Sleep(500);
		printf("是否抽奖(1是/2否):");
		int ans_cj;
		scanf("%d",&ans_cj);
		printf("\n\n");
		if(ans_cj<1||ans_cj>2)
		{
			printf("不能输入其他,请重新输入。");
			Sleep(500);
			system("pause");
			continue;
		}
		if(ans_cj==2) return ;
		Sleep(500);
		printf("请输入行和列抽奖~\n\n");
		printf("行 列:");
		scanf("%d%d",&x,&y);
		printf("\n\n");
		Sleep(500);
		
		if(x<=0||x>=11||y<=0||y>=11)
		{
			printf("不能输入范围之外的格子,请重新输入!\n\n");
			Sleep(500);
			system("pause");
			continue;
		}
		
		if(vis[x][y]==1)
		{
			printf("该格已被抽取,请换一个吧~\n\n");
			Sleep(500);
			system("pause");
			continue;
		}
		
		jh[l]--;
		sum--;
		vis[x][y]=1;
		printf("你抽到了: ");
		string s=what[x][y];
		cout<<s<<" !\n\n";
		Sleep(500);
		
		if(name_num[s]==1)
		{
			printf("真遗憾,下次好运!\n\n");
			Sleep(500);
		}
		if(name_num[s]==2) jh[l]++;
		else if(name_num[s]==3) jh[l]+=2;
		else if(name_num[s]>=4&&name_num[s]<=7) nl[l]+=name_num[s]-3;
		else if(name_num[s]>=8&&name_num[s]<=11) hv_dj[l].push_back(s);
		system("pause");
	}
	return ;
}
 
void use_dj(int l)  //使用道具 
{
	while(1)
	{
		if(hv_dj[l].empty())
		{
			printf("玩家%d暂无道具,已跳过使用道具阶段。",l);
			Sleep(500);
			system("pause");
			return ;
		}
		string used="";
		int x=0,ii;
		while(1)
		{
			printf("你要使用什么道具(0 不使用道具/1 气拳/2 紧箍咒/3 大雾弥漫/4 知识的洗礼):");
			scanf("%d",&ii);
			printf("\n\n");
			if(ii<0||ii>4)
			{
				printf("不能输入范围之外的道具,请重新输入!\n\n");
				Sleep(500);
				system("pause");
				continue;
			}
			if(ii==0) return ;
			used=num_dj[ii];
			bool b=0;
			for(int i=0;i<hv_dj[l].size();i++)
				if(hv_dj[l][i]==used)
				{
					b=1;
					x=i;
					break;
				}
			if(b==0)
			{
				printf("暂无该道具,请重新选择。\n\n");
				Sleep(500);
				system("pause");
				continue;
			}
			break;
		}
		hv_dj[l].erase(hv_dj[l].begin()+x);
		int use_to;
		if(used=="气拳"||used=="紧箍咒")
		{
			while(1)
			{
				printf("请选择使用对象(输入编号):");
				scanf("%d",&use_to);
				printf("\n\n");
				if(use_to<1||use_to>5)
				{
					printf("暂无该玩家,请重新选择。\n\n");
					Sleep(500);
					system("pause");
					continue;
				}
				if(die[use_to])
				{
					printf("该玩家已死亡,请重新选择。");
					Sleep(500);
					system("pause");
					continue;
				}
				if(dwmm[use_to])
				{
					printf("该玩家处于「雾中」效果,无法选中,请重新选择。\n\n");
					Sleep(500);
					system("pause");
					continue;
				}
				break;
			}
		}
		if(used=="气拳")
		{
			gj(l,use_to,1);
			if(!(use_to==1&&xmc))
			{
				if(l==1&&qys) printf("玩家%d被气拳攻击,伤害翻2倍,受到2格伤害。",use_to);
				else printf("玩家%d被气拳攻击,受到1格伤害。",use_to);
			}
		}
		if(used=="紧箍咒")
		{
			ji[use_to]++;
			printf("玩家%d进入「禁锢」效果,下一回合无法使用技能。",use_to);
		}
		if(used=="大雾弥漫")
		{
			if(dwmm[l]==0) wz++;
			dwmm[l]++;
			printf("玩家%d进入「雾中」效果,下一回合无法被选中,无法使用技能、道具。",l);
		}
		if(used=="知识的洗礼")
		{
			hp[l]++;
			du[l]=0,all[l]=0,chou[l]=0,ji[l]=0,dwmm[l]=0;
			printf("玩家%d接受净化,恢复1格hp。",l);
			if(hp[l]>10)
			{
				printf("hp抵达上限10格,不再增加。");
				hp[l]=10;
			}
		}
		printf("\n\n");
		system("pause");
		system("cls");
		print2(l);
	}
	
	use_dj(l);
	return ;
}
 
void use_jn(int l)  //使用技能 
{
	if(ji[l])
	{
		printf("玩家%d本回合跳过使用技能阶段,不能使用技能。\n\n",l);
		ji[l]--;
		Sleep(500);
		system("pause");
		return ;
	}
	while(1)
	{
		if(nl[l]<2)
		{
			printf("玩家%d能量不足以使用任何技能,已跳过使用技能阶段。",l);
			Sleep(500);
			system("pause");
			return ;
		}
		string used;
		int x=0,ii;
		while(1)
		{
			printf("你要使用什么技能(0 不使用技能/");
			for(int i=1;i<4;i++) cout<<i<<' '<<hv_jn[l][i-1]<<'/'; 
			cout<<4<<' '<<hv_jn[l][3]<<"):";
			scanf("%d",&ii);
			printf("\n\n");
			if(ii<0||ii>4)
			{
				printf("不能输入范围之外的技能,请重新输入!\n\n");
				Sleep(500);
				system("pause");
				continue;
			}
			if(ii==0) return ;
			used=num_jn[(l-1)*4+ii];
			if(name_nl[used]>nl[l])
			{
				printf("能量不足,请重新输入!\n\n");
				Sleep(500);
				system("pause");
				continue;
			}
			bool b=0;
			for(int j=0;j<hv_jn[l].size();j++)
			{
				if(hv_jn[l][j]==used)
				{
					b=1;
					x=j;
					break;
				}
			}
			if(b==0)
			{
				printf("暂无该技能,请重新选择。\n\n");
				Sleep(500);
				system("pause");
				continue;
			}
			break;
		}
		if(used!="兵临城") nl[l]-=name_nl[used]; 
		int use_to;
		if(l==1)
		{
			if(used=="轻羽扇")
			{
				qys=1;
				printf("玩家1获得「火」效果,下次伤害翻2倍。");
			}
			if(used=="冰原域")
			{
				if(!die[2]&&!dwmm[2])
				{
					chou[2]++;
					printf("玩家2进入「缓诅」效果,下一回合跳过抽道具阶段。\n");
				}
				if(!die[3]&&!dwmm[3])
				{
					printf("玩家3进入「缓诅」效果,下一回合跳过抽道具阶段。\n");
					chou[3]++;
				}
				if(!die[4]&&!dwmm[4])
				{
					printf("玩家4进入「缓诅」效果,下一回合跳过抽道具阶段。\n");
					chou[4]++;
				}
			}
			if(used=="休眠舱")
			{
				xmc++;
				hj[1]=1e9;
				printf("玩家1进入「反甲」效果,获得一层绝对防御。");
			}
			if(used=="焱冰束")
			{
				while(1)
				{
					printf("请选择使用对象(输入编号):");
					scanf("%d",&use_to);
					if(use_to<1||use_to>4)
					{
						printf("暂无该玩家,请重新选择。\n\n");
						Sleep(500);
						system("pause");
						continue;
					}
					if(die[use_to])
					{
						printf("该玩家已死亡,请重新选择。");
						Sleep(500);
						system("pause");
						continue;
					}
					if(dwmm[use_to])
					{
						printf("该玩家处于「雾中」效果,无法选中,请重新选择。\n\n");
						Sleep(500);
						system("pause");
						continue;
					}
					break;
				}
				if(!(use_to==1&&xmc))
				{
					if(qys)
					{
						du[use_to]+=2;
						printf("玩家%d受到4格伤害,进入「冰火」效果,将持续2回合受到1格伤害。",use_to);
					}
					else
					{
						du[use_to]+=1;
						printf("玩家%d受到2格伤害,进入「冰火」效果,将持续1回合受到1格伤害。",use_to);
					}
				}
				gj(1,use_to,2);
			}
		}
		if(l==2)
		{
			if(used=="四面雨"||used=="沼泽漫")
			{
				while(1)
				{
					printf("请选择使用对象(输入编号):");
					scanf("%d",&use_to);
					if(use_to<1||use_to>5)
					{
						printf("暂无该玩家,请重新选择。\n\n");
						Sleep(500);
						system("pause");
						continue;
					}
					if(die[use_to])
					{
						printf("该玩家已死亡,请重新选择。");
						Sleep(500);
						system("pause");
						continue;
					}
					if(dwmm[use_to])
					{
						printf("该玩家处于「雾中」效果,无法选中,请重新选择。\n\n");
						Sleep(500);
						system("pause");
						continue;
					}
					break;
				}
			}
			if(used=="红十字")
			{
				int rr=rand()%3+1;
				hp[l]+=rr;
				printf("玩家2恢复%d格hp。",rr);
				if(hp[l]>10)
				{
					printf("hp抵达上限10格,不再增加。");
					hp[l]=10;
				}
			}
			if(used=="四面雨")
			{
				all[use_to]++;
				printf("玩家%d进入「逃遁」效果,跳过整个下一回合。",use_to);
			}
			if(used=="藤生壁")
			{
				hj[2]+=2;
				printf("玩家2获得两格护甲。");
			}
			if(used=="沼泽漫")
			{
				gj(2,use_to,1);
				if(!(use_to==1&&xmc))
				{
					du[use_to]+=2;
					printf("玩家%d受到1格伤害,进入「毒心骨」效果,将持续2回合受到1格伤害。",use_to);
				}
			}
		}
		if(l==3)
		{
			if(used=="百鬼行"||used=="牵魂索")
			{
				while(1)
				{
					printf("请选择使用对象(输入编号):");
					scanf("%d",&use_to);
					if(use_to<1||use_to>5)
					{
						printf("暂无该玩家,请重新选择。\n\n");
						Sleep(500);
						system("pause");
						continue;
					}
					if(die[use_to])
					{
						printf("该玩家已死亡,请重新选择。");
						Sleep(500);
						system("pause");
						continue;
					}
					if(dwmm[use_to])
					{
						printf("该玩家处于「雾中」效果,无法选中,请重新选择。\n\n");
						Sleep(500);
						system("pause");
						continue;
					}
					break;
				}
			}
			if(used=="百鬼行")
			{
				all[use_to]++;
				printf("玩家%d进入「逃遁」效果,跳过整个下一回合。",use_to);
			}
			if(used=="牵魂索")
			{
				kl[use_to]++; 
				printf("玩家%d进入「傀儡戏」效果,请该玩家在下一次轮到自己后自愿让玩家2操作。",use_to);
			}
			if(used=="骸骨甲")
			{
				hj[2]+=2;
				printf("玩家2获得两格护甲。");
			}
			if(used=="兵临城")
			{
				int use_num;
				bool flag=0;
				while(1)
				{
					printf("请选择使用人数(1~3):");
					scanf("%d",&use_num);
					if(use_num<1||use_num>3)
					{
						printf("数量不对,请重新选择。\n\n");
						Sleep(500);
						system("pause");
						continue;
					}
					if(use_num>4-leave)
					{
						printf("剩余人数不足,请重新选择。\n\n");
						Sleep(500);
						system("pause");
						continue;
					}
					if(use_num>4-wz)
					{
						printf("可选人数不足,请重新选择。\n\n");
						Sleep(500);
						system("pause");
						continue;
					}
					if((use_num==1&&nl[l]<2)||(use_num==2&&nl[l]<4)||(use_num==3&&nl[l]<5))
					{
						printf("能量不够,请重新选择。\n\n");
						Sleep(500);
						system("pause");
						flag=1;
						break;
					}
					break;
				}
				if(flag) continue;
				if(use_num<3) nl[l]-=use_num*2;
				else nl[l]-=5;
				for(int j=1;j<=use_num;j++)
				{
					while(1)
					{
						printf("请选择第%d个使用者(输入编号):",j);
						scanf("%d",&use_to);
						if(use_to<1||use_to>4)
						{
							printf("暂无该玩家,请重新选择。\n\n");
							Sleep(500);
							system("pause");
							continue;
						}
						if(die[use_to])
						{
							printf("该玩家已死亡,请重新选择。");
							Sleep(500);
							system("pause");
							continue;
						}
						if(dwmm[use_to])
						{
							printf("该玩家处于「雾中」效果,无法选中,请重新选择。\n\n");
							Sleep(500);
							system("pause");
							continue;
						}
						break;
					}
					if(!(use_to==1&&xmc)) printf("玩家%d受到2格伤害。",use_to);
					gj(3,use_to,2);
				}
			}
		}
		if(l==4)
		{
			if(used=="酒壶吸"||used=="如律令")
			{
				while(1)
				{
					printf("请选择使用对象(输入编号):");
					scanf("%d",&use_to);
					if(use_to<1||use_to>5)
					{
						printf("暂无该玩家,请重新选择。\n\n");
						Sleep(500);
						system("pause");
						continue;
					}
					if(die[use_to])
					{
						printf("该玩家已死亡,请重新选择。");
						Sleep(500);
						system("pause");
						continue;
					}
					break;
				}
			}
			if(used=="洒玉露")
			{
				hp[4]+=2;
				printf("玩家4恢复2格hp,");
				if(hp[4]>10)
				{
					if(hp[4]>10)
					{
						printf("hp抵达上限10格,不再增加。");
						hp[4]=10;
					}
				}
				int rr=rand()%4+1;
				while(die[rr]) rr=rand()%4+1; 
				printf("玩家%d被随机到,恢复1格hp。",rr);
				hp[rr]++;
				if(hp[rr]>10)
				{
					if(hp[rr]>10)
					{
						printf("hp抵达上限10格,不再增加。");
						hp[rr]=10;
					}
				}
			}
			if(used=="酒壶吸")
			{
				if(hv_dj[use_to].empty())
				{
					printf("玩家%d暂无道具,玩家4获得一次抽道具机会。",use_to);
					jh[4]++;
				}
				else
				{
					int rr=rand()%hv_dj[use_to].size();
					hv_dj[4].push_back(hv_dj[use_to][rr]);
					hv_dj[use_to].erase(hv_dj[use_to].begin()+rr);
				}
			}
			if(used=="金莲身")
			{
				hj[4]+=2;
				printf("玩家4获得两格护甲。");
				int rr=rand()%5;
				if(rr==0)
				{
					printf("\n玩家4运气爆棚,恢复1格hp。");
				}
			}
			if(used=="如律令")
			{
				gj(4,use_to,2);
				int rr=rand()%4+1;
				while(die[rr]) rr=rand()%4+1;
				gj(4,rr,1);
				if(!(use_to==1&&xmc)) printf("玩家%d受到2格伤害。",use_to);
				if(!(rr==1&&xmc)) printf("\n玩家%d被误伤,受到1格伤害。",rr);
			}
		}
		printf("\n");
		Sleep(500);
		system("pause");
		system("cls");
		print2(l);
	}
	return ;
}
 
int main()
{
	system("color f8");  //屏幕初始化 
	srand(time(0));  //rand初始化 
	SetConsoleSize(165,65);  //屏幕大小 
	join_des();
	for(int i=1;i<=4;i++) die[i]=0,jh[i]=3,nl[i]=2,hp[i]=10;  //玩家状态初始化 
    
	name_num["谢谢惠顾"]=1;
	name_num["一次抽奖机会"]=2;
	name_num["两次抽奖机会"]=3;
	name_num["一格能量"]=4;
	name_num["两格能量"]=5;
	name_num["三格能量"]=6;
	name_num["四格能量"]=7;
	name_num["气拳"]=8;
	name_num["紧箍咒"]=9;
	name_num["大雾弥漫"]=10;
	name_num["知识的洗礼"]=11;
	num_jn[1]="轻羽扇";
	num_jn[2]="冰原域";
	num_jn[3]="休眠舱";
	num_jn[4]="焱冰束";
	num_jn[5]="红十字";
	num_jn[6]="四面雨";
	num_jn[7]="藤生壁";
	num_jn[8]="沼泽漫";
	num_jn[9]="百鬼行";
	num_jn[10]="牵魂索";
	num_jn[11]="骸骨甲";
	num_jn[12]="兵临城";
	num_jn[13]="洒玉露";
	num_jn[14]="酒壶吸";
	num_jn[15]="金莲身";
	num_jn[16]="如律令";
	num_dj[1]="气拳";
	num_dj[2]="紧箍咒";
	num_dj[3]="大雾弥漫";
	num_dj[4]="知识的洗礼"; //map初始化 2323232335222223
	int sss[100]={0,2,3,2,3,2,3,2,3,3,5,2,2,2,2,2,3};
	for(int i=1;i<=16;i++)
	{
		if(i==12) continue;
		name_nl[num_jn[i]]=sss[i];
	}  //能量初始化 
	
	printf("                                                                      欢迎来到道具池(4人版)!\n");
	printf("---------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n");
	printf("                                                                      请在找齐玩家后开始游戏\n                                                                       "); 
	system("pause");
	system("cls");
	check();
	dl();
	
	system("cls");
	printf("游戏需要四名玩家,各自执掌一个身份,请提前自行决定谁是玩家几(玩家1:冰火战士,玩家2:药剂巫师,玩家3:骷髅法师,玩家4:太乙真人)。\n\n");
	Sleep(500);
	system("pause");
	printf("\n\n决定好后开始游戏。游戏是回合制,每一回合分为三个阶段:抽道具,使用道具,使用技能。\n\n");
	Sleep(500);
	system("pause");
	printf("\n\n每一回合四个玩家轮流经历这三个阶段,先从10*10的随机道具池里抽取道具。然后借助抽到的道具,以及通过消耗能量使用技能,耗尽其他玩家的hp。\n\n");
	Sleep(500);
	system("pause");
	printf("\n\n玩家的死亡是在回合结束后判定的。当场上仅剩一名玩家时,该玩家胜利;若仅剩的玩家同一回合死亡,则平局。\n\n");
	Sleep(500);
	system("pause");
	printf("\n\n注:“跳过'xx阶段'/'整个回合'是指当'下一次经历该阶段'/'进入下一个回合'时,跳过。\n\n");
	Sleep(500);
	printf("\n    大雾弥漫从使用者的下一个人抽道具起生效,到下一次轮到这个人时结束。期间使用者可以理解成临时死亡。\n\n");
	Sleep(500);
	system("pause");
	
	while(1)  //进行 
	{
		system("cls");
		if(sum<=10)
		{
			printf("剩余抽道具格子过少,奖池开始大洗牌...");
			system("pause");
			memset(vis,0,sizeof(vis));
			for(int i=0;i<by.size();i++)
			{
				prize.push_back(by[i]);
				by.erase(by.begin()+i,by.begin()+i+1);
			}
			dl();
			sum=0;
		}
		hh++;
		for(int l=1;l<=4&&sum;l++)
		{
			system("cls");
			if(die[l]) continue;
			if(kl[l])
			{
				printf("玩家%d本回合被玩家3控制,请玩家3进行操作。",l);
				kl[l]--;
				Sleep(500);
				system("pause");
			}
			if(dwmm[l])
			{
				printf("玩家%d处于「雾中」效果,跳过本回合。\n",l);
				dwmm[l]--;
				if(dwmm[l]==0) wz--;
				Sleep(500);
				system("pause");
				continue;
			}
			if(all[l])
			{
				printf("玩家%d本回合被跳过。\n",l);
				all[l]--;
				Sleep(500);
				system("pause");
				continue;
			}
			cj(l);
			if(jh[l]==0) printf("抽奖机会已用完,开始选择使用道具和技能...\n\n");
			else printf("接下来开始选择使用道具和技能...\n\n");
			Sleep(500);
			system("pause");
			system("cls");
			print2(l);
			use_dj(l);
			use_jn(l);
			
			if(xmc) xmc=0;
			system("cls");
		}
		hh++;
		for(int l=1;l<=4;l++)
		{
			if(die[l]) continue;
			if(du[l])
			{
				printf("玩家%d处于持续扣血,本回合扣1格hp。",l); 
				du[l]--;
				hp[l]--;
				Sleep(500);
				system("pause");
			}
			if(hp[l]<=0&&!die[l])
			{
				printf("玩家%d hp清零,退出游戏。",l);
				leave++;
				die[l]=1;
				Sleep(500);
				system("pause");
				continue;
			}
            int rr=rand()%2+2;
			jh[l]+=rr;
		}
		printf("第%d回合结束!\n\n",hh);
		if(leave==3)
		{
			for(int i=1;i<=4;i++)
			{
				if(hp[i]>0)
				{
					printf("游戏结束!");
					win=i;
					system("pause");
					break;
				}
			}
			break;
		}
		else if(leave==4)
		{
			printf("游戏结束!");
			win=5;
			system("pause");
			break;
		}
		printf("每人增加2~3次抽奖机会。\n\n");
		system("pause");
	}
	//结束 
	system("cls");
	if(win==5) cout<<"本场游戏平局!";
	else cout<<"获胜者是:玩家"<<win<<"!";
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值