记录编号 563179 评测结果 AAAAAAAAAA
题目名称 杀手游戏 最终得分 100
用户昵称 Gravatar斯内普和骑士 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2021-07-16 18:41:36 内存使用 0.00 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
struct Information//存储玩家信息 
{
	int Bangcnt;//Bang卡牌数 
	int Grenadecnt;//Grenade卡牌数 
	int Ghostcnt;//Ghost卡牌数 
	int Knifecnt;//Knife卡牌数 
	int Misscnt;//Miss卡牌数 
	int Parrycnt;//Parry卡牌数目 
	bool die;//是否存活 
	int Life;//生命值 
}I,P;
string s;
void clear(Information &x)//清除手中的牌,重启 
{
	x.Bangcnt=0;
	x.Grenadecnt=0;
	x.Ghostcnt=0;
	x.Knifecnt=0;
	x.Misscnt=0;
	x.Parrycnt=0;
}
void mp(Information &x)//摸牌 
{
	cin>>s;
	if(s==".")
	exit(0);
	if(s=="Bang")
	x.Bangcnt++;
	if(s=="Grenade")
	x.Grenadecnt++;
	if(s=="Ghost")
	x.Ghostcnt++;
	if(s=="Knife")
	x.Knifecnt++;
	if(s=="Miss")
	x.Misscnt++;
	if(s=="Parry")
	x.Parrycnt++;
}
void init()//初始化,防止句号恶心 
{
	I.Life=4,P.Life=4;
	I.die=false,P.die=false;
	clear(I);
	clear(P);
	mp(I);
	mp(I);
	mp(I);
	mp(I);
	mp(P);
	mp(P);
	mp(P);
	mp(P);
}
void CheckLife(Information &a)//检查生命是否为0 
{
	if(a.Life<=0)
	a.die=true;
}
void Attack(Information &x,Information &y)//正常攻击 
{
	x.Bangcnt--;
	if(y.Parrycnt)//用Parry阻挡 
	{
		y.Parrycnt--;
		mp(y);//Parry奖励 
	}
	else
	{
		if(y.Misscnt)//用Miss阻挡 
		y.Misscnt--;
		else
		y.Life--;//用命档 
	}
	CheckLife(y);
}
void Knifework(Information &x,Information &y)
{
	x.Knifecnt--;
	y.Life--;//就硬被砍 
	CheckLife(y);
}
void Grenadework(Information &x,Information &y)//受到Grenadework攻击 
{
	x.Grenadecnt--;
	if(y.Parrycnt)//用Parry阻挡 
	{
		y.Parrycnt--;
		mp(y);//Parry奖励 
	}
	else
	{
		if(y.Misscnt)//用Miss阻挡 
		y.Misscnt--;
		else
		y.Life--;//用命档 
	}
	//if(y.Misscnt)
//	y.Misscnt--;//挡刀 
//	else
//	y.Life--;//掉血 
	CheckLife(y);
}
void Ghostwork(Information &x,Information &y)//受到Ghost攻击 
{
	x.Ghostcnt--;
	if(y.Bangcnt)
	y.Bangcnt--;//挡刀 
	else
	y.Life--;//掉血 
	CheckLife(y);
}
void work(Information &x,Information &y)
{
	mp(x);mp(x);
	while(x.Ghostcnt)//优先操作 
	Ghostwork(x,y);
	while(x.Grenadecnt)
	Grenadework(x,y);
	while(x.Knifecnt)//直接攻击 
	Knifework(x,y);
	if(x.Bangcnt)
	Attack(x,y);//攻击只能用一次,前三个直接出完 
	int cnt=x.Bangcnt+x.Misscnt+x.Parrycnt;
	while(cnt>x.Life)//弃牌 
	{
		if(x.Bangcnt)
		{
			x.Bangcnt--;
			cnt--;
			continue;
		}
		if(x.Misscnt)
		{
			x.Misscnt--;
			cnt--;
			continue;
		}
		if(x.Parrycnt)
		{
			x.Parrycnt--;
			cnt--;
			continue;
		}
	}
}
int main()
{
	freopen("bang.in","r",stdin);
	freopen("bang.out","w",stdout);
	while(1)
	{
		init();
		while(1)
		{
			if(I.die==true||P.die==true)
			break;
			work(I,P);
			if(I.die==true||P.die==true)
			break;
			work(P,I);
		}
		if(I.die==true)
		printf("LOSE\n");
		else
		printf("WIN\n");
		cin>>s;
		while(s!="===")
		{
			cin>>s; 
		}
	}
	return 0;
}