#include <bits/stdc++.h>
#include <windows.h>
using namespace std;

int slowout(char *p)
{
	while(1)
	{
	if(*p!=0)
		printf("%c",*p++);
	else
		break;
	Sleep(1);
	}
}

/**
	0 = 命 
	1 = 玉
	2 = 防
	3 = 盾 4 = 钟
	5 = 闪
	6 = 戳 7 = 2戳 8 = 3戳 9 = 4戳
	10 = 小电 11 = 中电 12 = 大电 13 = 雷神
	14 = 小猪 15 = 中猪 16 = 大猪 17 = 吴猪 18 = 聪明吴猪
	19 = 重拳 20 = 天帝 21 = 无相
	22 = 暴击 23 = 重击 24 = 痛击
	25 = 马丁 26 = 百变马丁
	27 = 黑洞 28 = 白洞 29 = 虫洞
	30 = 狒狒 31 = 暗黑狒狒
	32 = 绝杀 33 = 超级绝杀
	34 = 斩 35 = 元气斩 36 = 猪油斩
	37 = 蕉蕉 38 = 暗黑蕉蕉
	39 = 甩剑 
	40 = 哈哈 
	41 = 上挂 42 = 下挂
**/
struct numbers
{
	bool flag;//表示是否出过中猪 
	float belong[50];//表示剩余资源数量 
	int hd[50];//黑洞吸的
	bool if_shang;//上挂状态
	int last,be4_last;//上回合和上上回合
	void simple_reset()
	{
		for(int i = 1;i <= 40;i++) belong[i] = hd[i] = 0;
		belong[0] = 1;
		flag = false;
		if_shang = false;
		last = 0,be4_last = 0;
	} 
	void do_after(int id)
	{
		if(if_shang && id == 30)
		{
			belong[37]++;
			return;
		}
		if(if_shang && id == 31)
		{
			belong[38]++;
			return;
		}
		if(if_shang && id == 38)
		{
			belong[38]--;
			return;
		}
		if(if_shang && id == 37)
		{
			belong[37]--;
			return;
		}
		if(if_shang && id != 27 && id != 42) return;
		if(decision(id) == 2)
		{
			hd[id]--;
			return;
		} 
		switch(id)
		{
		    case 1:  break;
		    case 2:  break;
		    case 3:  {belong[2]--; break;}
		    case 4:  {if(belong[3] >= 2) {belong[3] -= 2;} else belong[4]--; break;}
		    case 5:  break;
		    case 6:  {belong[1] -= 0.5;break;}
		    case 7:  {belong[6] -= 2;break;}
		    case 8:  {belong[7]--;break;}
		    case 9:  {belong[8]--;break;}
		    case 10: {belong[5] -= 1.5;break;}
		    case 11: {belong[10] -= 2;break;}
		    case 12: {belong[11] -= 2;break;}
		    case 13: {belong[12]--;break;}
		    case 14: {belong[1] --;break;}
		    case 15: {belong[14] -= 2;flag = true;break;}
		    case 16: {belong[15] -= 2;break;}
		    case 17: {belong[16] --;break;}
		    case 18: {belong[17] --;break;}
		    case 19: {belong[1] -= 1.5;break;}
		    case 20: {belong[19] -= 2;break;}
		    case 21: {belong[20] -= 2.0;break;}
		    case 22: {belong[1] -= 1.0; belong[2] -= 1.0; break;}
		    case 23: {belong[22] -= 2.0;break;}
		    case 24: {belong[23] -= 2.0;break;}
		    case 25: {if(belong[21] >= 1) belong[21]--; else belong[24]--; break;}
		    case 26: {belong[25]--;break;}
		    case 27: {belong[1] -= 2.0;break;}
		    case 28: {belong[27] -= 1.0;belong[39] -= 1.0;break;}
		    case 29: {belong[28] -= 1.0;belong[27] -= 1.0;break;}
		    case 30: {if(belong[39] >= 2.5) belong[39] -= 2.5; else {belong[1] -= 4.0;belong[2] -= 2.0;} belong[37]++;break;}
		    case 31: {belong[30] -= 2.0; belong[38]++; break;}
		    case 32: {belong[1] -= 10.0;break;}
		    case 33: {belong[32] -= 2.0;break;}
		    case 34: {belong[1] -= 0.5;belong[2] -= 0.5;break;}
		    case 35: {belong[34] -= 2.0;break;}
		    case 36: {belong[35] -= 1.0;break;}
		    case 37: {belong[37] -= 2.0;belong[0]++;break;}
		    case 38: {belong[38] -= 2.0;belong[0] += 2.0;break;}
		    case 39: break;
		    case 40: break;
		    case 41: {if_shang = true;break;}
		    case 42: {if_shang = false;break;}
		    case 43: break;
		}
	}
	int decision(int id)
	{
		if(if_shang && id != 27 && id != 41 && id != 43 && id != 33) return 1;
		if(hd[id]) return 2;
		switch(id)
		{
			case 1:  return 1;
			case 2:  return 1;
			case 3:  return belong[2] >= 1.0;
			case 4:  return belong[3] >= 2.0 || belong[4] >= 1.0;
			case 5:  return 1;
			case 6:  return belong[1] >= 0.5;
			case 7:  return belong[6] >= 2.0;
			case 8:  return last == 7;
			case 9:  return last == 8;
			case 10: return belong[5] >= 1.5;
			case 11: return belong[10] >= 2.0;
			case 12: return belong[11] >= 2.0;
			case 13: return last == 12;
			case 14: return belong[1] >= 1.0;
			case 15: return belong[14] >= 2.0;
			case 16: return belong[15] >= 2.0;
			case 17: return belong[16] >= 1.0;
			case 18: return last == 17;
			case 19: return belong[1] >= 1.5;
			case 20: return belong[19] >= 2.0;
			case 21: return belong[20] >= 2.0;
			case 22: return belong[1] >= 1.0 && belong[2] >= 1.0;
			case 23: return belong[22] >= 2.0;
			case 24: return belong[23] >= 2.0;
			case 25: return belong[21] >= 1.0 || belong[24] >= 1.0;
			case 26: return last == 25;
			case 27: return belong[1] >= 2.0;
			case 28: return belong[27] >= 1.0 && belong[39] >= 1.0;
			case 29: return belong[28] >= 1.0 && belong[27] >= 1.0;
			case 30: return belong[39] >= 2.5 || (belong[1] >= 4.0 && belong[2] >= 2.0);
			case 31: return belong[30] >= 2.0;
			case 32: return belong[1] >= 10.0;
			case 33: return belong[32] >= 2.0;
			case 34: return belong[1] >= 0.5 && belong[2] >= 0.5;
			case 35: return belong[34] >= 2.0;
			case 36: return belong[35] >= 1.0 && flag;
			case 37: return belong[37] >= 1.0;
			case 38: return belong[38] >= 1.0;
			case 39: return 1;
			case 40: return last != 40 || be4_last != 40;
			case 41: return if_shang == false;
			case 42: return if_shang == true;
			case 43: return if_shang == false;
		}
	}
};

numbers a,b;//a是真人,b是人机 
const float damage[44] = {0,0,0,0,0,0,0.5,0.5,1,2,0.5,1,2,4,0.5,1,2,4,8,0.5,1,2,0.5,1,2,4,8,0,1,2,3.5,7,100,1000,0.5,0.5,1,0,0,0,0,0,0,0};//伤害/G
const int xi[44] = {0,1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,6,6,6,7,7,1,8,8,9,9,10,10,11,11,11,1,1,0,1,0,0,0};

void intro()
{
	srand(time(0));
	printf("");
	return;
}

string return_name(int id)
{
	switch(id)
	{
		case 1:  return "玉       ";
		case 2:  return "防       ";
		case 3:  return "盾       ";
		case 4:  return "钟       ";
		case 5:  return "闪       ";
		case 6:  return "戳       ";
		case 7:  return "二戳     ";
		case 8:  return "三戳     ";
		case 9:  return "四戳     ";
		case 10: return "小电     ";
		case 11: return "中电     ";
		case 12: return "大电     ";
		case 13: return "雷神     ";
		case 14: return "小猪     ";
		case 15: return "中猪     ";
		case 16: return "大猪     ";
		case 17: return "吴猪     ";
		case 18: return "聪明吴猪 ";
		case 19: return "重拳     ";
		case 20: return "天帝     ";
		case 21: return "无相     ";
		case 22: return "暴击     ";
		case 23: return "重击     ";
		case 24: return "痛击     ";
		case 25: return "马丁     ";
		case 26: return "百变马丁 ";
		case 27: return "黑洞     ";
		case 28: return "白洞     ";
		case 29: return "虫洞     ";
		case 30: return "狒狒     ";
		case 31: return "暗黑狒狒 ";
		case 32: return "绝杀     ";
		case 33: return "超级绝杀 ";
		case 34: return "斩       ";
		case 35: return "元气斩   ";
		case 36: return "猪油斩   ";
		case 37: return "蕉蕉     ";
		case 38: return "暗黑蕉蕉 ";
		case 39: return "甩剑     ";
		case 40: return "哈哈     ";
		case 41: return "上挂     ";
		case 42: return "下挂     ";
		case 43: return "举报     ";
	}
}

void saydone(numbers x)
{
	for(int id = 1;id <= 43;id++)
	{
		if(!x.decision(id)) continue;
		cout << return_name(id) << "...编号" << id << endl; 
	} 
	printf("请问你要出什么:");
	return;
}

void startgame()
{
	vector<int> v;
	int i = 0,t = 0,cnt,r = 0,zhong;
	float dam,dun,shielda,shieldb;
	a.simple_reset();b.simple_reset();
	while(a.belong[0] > 0 && b.belong[0] > 0)
	{
		a.be4_last = a.last;
		b.be4_last = b.last;
		a.last = t;
		b.last = r;
		i++;
		slowout("第");
		printf("%d",i);
		slowout("回合\n"); 
		slowout("这回合你可以出:\n");
	//	cout<<"你有"<< a.belong[2] <<"个防"<<endl; 
		saydone(a);
		while(cin >> t)
		{
			if(t == 100)
			{
				for(int i = 0;i <= 43;i++)
					cout << i << " " << a.belong[i] << endl; 
				cout << a.if_shang << endl;
			}
			if(!a.decision(t)) printf("\n你现在不能出这个!请重新考虑:");
			else break;
		}
		a.belong[t] += 1.0;
		a.do_after(t);
		
	//	cout << t << endl;
	//	for(int j = 0;j <= 40;j++) cout << j << ":" << a.belong[j] << endl; 
		v.clear();cnt = 0;
		for(int id = 1;id <= 43;id++)
		{
			if(!b.decision(id)) continue;
			if(b.if_shang) id = 44;
			v.push_back(id);
			cnt++;
		}
		if(b.if_shang)
		{
			v.push_back(18);
			v.push_back(26);
			v.push_back(31);
			v.push_back(32);
			for(int k = 1;k <= 5;k++)v.push_back(42);
			cnt = 9;
		}
		r = v[rand() % cnt];//AI就出r了
		b.belong[r] += 1.0;
		b.do_after(r); 
		slowout("你出了"); 
		cout << return_name(t) << endl;
		slowout("AI出了");
		cout << return_name(r) << endl;
		
		shielda = a.belong[4] + 0.5 * (bool)a.belong[3];
		shieldb = b.belong[4] + 0.5 * (bool)b.belong[3];
		//特殊情况,可以防住
			//黑洞特判
		if(r == 27 && damage[t] > 0) 
		{
			b.hd[t]++;
			continue;
		}
		if(t == 27 && damage[r] > 0)
		{
			a.hd[r]++;
			continue;
		} 
		if(r == 27)
		{
			a.belong[t]--;
			b.belong[t]++;
			if(t == 41) a.if_shang = false;
			if(t == 42) a.if_shang = true;
			continue;
		}
		if(t == 27)
		{
			b.belong[r]--;
			a.belong[r]++;
			if(r == 41) b.if_shang = false;
			if(r == 42) b.if_shang = true;
			continue;
		}
			//哈哈特判
		if(r == 40)
		{
			if(t == 14 || t == 22 || t == 34 || t == 35)//0.5G
			{
				if(shielda == 0)
				{
					a.belong[0]--;
					if(a.belong[0] > 0) slowout("蕉蕉碎!");
					else return;
					continue;
				}
				else 
				{
					if(a.belong[3] > 1)
					{
						a.belong[3]--;
						slowout("盾碎");
					} 
					else 
					{
						a.belong[4]--;
						a.belong[3]++;
						slowout("钟变盾");
					}
					continue;
				}
			}
			if(t == 15 || t == 23 || t == 28)
			{
				if(shielda <= 0.5)
				{
					a.belong[0]--;
					if(a.belong[0] > 0) slowout("蕉蕉碎!");
					else return;
					continue;
				}
				else 
				{
					a.belong[4]--;
					slowout("钟碎");
					continue;
				}
			}
		}
		if(t == 40)
		{
			if(r == 14 || r == 22 || r == 34 || r == 35)//0.5G
			{
				if(shieldb == 0)
				{
					b.belong[0]--;
					if(b.belong[0] > 0) slowout("蕉蕉碎!");
					else return;
					continue;
				}
				else 
				{
					if(b.belong[3] > 1)
					{
						b.belong[3]--;
						slowout("盾碎");
					} 
					else 
					{
						b.belong[4]--;
						b.belong[3]++;
						slowout("钟变盾");
					}
					continue;
				}
			}
			if(r == 15 || r == 23 || r == 28)
			{
				if(shieldb <= 0.5)
				{
					b.belong[0]--;
					if(b.belong[0] > 0) slowout("蕉蕉碎!");
					else return;
					continue;
				}
				else 
				{
					b.belong[4]--;
					slowout("钟碎");
					continue;
				}
			}
		}
			//玉特判
		if(t == 1 && r == 19)
		{
			a.belong[1]--;
			slowout("玉住!");
			continue;
		} 
		if(t == 19 && r == 1)
		{
			b.belong[1]--;
			slowout("玉住!");
			continue;
		}
			//防特判 
		if(t == 2 && damage[r] > 0)
		{
			if(r == 6 || r == 10 || r == 14 || r == 34)
			{
				slowout("防住!");
				continue;
			}
		}
		if(r == 2 && damage[t] > 0)
		{
			if(t == 6 || t == 10 || t == 14 || t == 34)
			{
				slowout("防住!");
				continue;
			}
		}
			//闪特判
		if(t == 5 && 6 <= r && r <= 11)
		{
			slowout("闪掉!");
			continue;
		} 
		if(r == 5 && 6 <= t && t <= 11)
		{
			slowout("闪掉!");
			continue;
		}
		//若无法防住,结算(包括对冲和单向)
		if((r == 37 || r == 38) && damage[t] > 0 && t != 33)
		{
			b.belong[0]--;
			slowout("前台蕉蕉碎!");
			continue;
		}
		if((t == 37 || t == 38) && damage[r] > 0 && r != 33)
		{
			a.belong[0]--;
			slowout("前台蕉蕉碎!");
			continue;
		}
		if(r == 3 && damage[t] <= 3.5 && damage[t] > 0)
		{
			b.belong[3]--;
			slowout("前台盾碎!\n");
			continue;
		}
		if(t == 3 && damage[r] <= 3.5 && damage[r] > 0)
		{
			a.belong[3]--;
			slowout("前台盾碎!\n");
			continue;
		}
		if(r == 4 && damage[t] == 0.5)
		{
			b.belong[4]--;
			b.belong[3]++;
			slowout("前台钟变盾!\n");
			continue;
		}
		if(r == 4 && damage[t] >= 1 && damage[t] <= 8)
		{
			b.belong[4]--;
			slowout("前台钟碎!\n");
			continue;
		}
		if(t == 4 && damage[r] == 0.5)
		{
			a.belong[4]--;
			a.belong[3]++;
			slowout("前台钟变盾!\n");
			continue;
		}
		if(t == 4 && damage[r] >= 1 && damage[r] <= 8)
		{
			a.belong[4]--;
			slowout("前台钟碎!\n");
			continue;
		}
		if(a.if_shang && r == 43)
		{
			a.belong[0] = 0;
			return;
		}
		if(b.if_shang && t == 43)
		{
			b.belong[0] = 0;
			return;
		}
		if(a.if_shang && b.if_shang)
		{
			a.belong[0] = b.belong[0] = 5;
			return;
		} 
		if(a.belong[0] >= 3 && b.belong[0] >= 3)
		{
			a.belong[0] = b.belong[0] = 5;
			return;
		}
		if(t == 39) shielda = 0;
		if(r == 39) shieldb = 0;
		if(damage[t] != damage[r])
		{
			if(damage[t] > damage[r])
			{
				if(b.if_shang && t != 33) continue;
				if(t == 33 && r == 32)
				{
					b.belong[0]--;
					if(b.belong[0] > 0)
					{
						slowout("蕉蕉碎");
					}
					else return;
					continue;
				}
				else if(t == 33 && r != 32)
				{
					b.belong[0] -= 2;
					if(b.belong[0] > 0)
					{
						slowout("双蕉蕉碎");
					}
					else return;
					continue;
				}
				else if(t == 32)
				{
					b.belong[0]--;
					if(b.belong[0] > 0)
					{
						slowout("双蕉蕉碎");
					}
					else return;
					continue;
				}
				if(xi[t] == xi[r])
				{
					dam = damage[t] - damage[r];
					zhong = dam;
					dun = dam - zhong;
					if(shieldb < dam || b.belong[4] < zhong)
					{
						b.belong[0]--;
						if(b.belong[0] > 0)
						{
							slowout("蕉蕉碎");
						} 
						else return;
					} 
					else
					{
						if(zhong > 0) cout << zhong << "钟";
						if(dun > 0) cout << "盾";
						cout << "碎";
						if(b.belong[3] < dun)
						{
							b.belong[3] ++;
							b.belong[4] --;
						}
						else b.belong[3] -= dun;
						b.belong[4] -= zhong;
					}
				}
				else
				{
					dam = damage[t];
					zhong = dam;
					dun = dam - zhong;
					if(shieldb < dam || b.belong[4] < zhong)
					{
						b.belong[0]--;
						if(b.belong[0] > 0)
						{
							slowout("蕉蕉碎");
						} 
						else return;
					} 
					else
					{
						if(zhong > 0) cout << zhong << "钟";
						if(dun > 0) cout << "盾";
						cout << "碎";
						if(b.belong[3] < dun)
						{
							b.belong[3] ++;
							b.belong[4] --;
						}
						else b.belong[3] -= dun;
						b.belong[4] -= zhong;
					}
				}
			}
			else
			{
				if(a.if_shang && r != 33) continue;
				if(r == 33 && t == 32)
				{
					a.belong[0]--;
					if(a.belong[0] > 0)
					{
						slowout("蕉蕉碎");
					}
					else return;
					continue;
				}
				else if(r == 33 && t != 32)
				{
					a.belong[0] -= 2;
					if(a.belong[0] > 0)
					{
						slowout("蕉蕉碎");
					}
					else return;
					continue;
				}
				else if(r == 32)
				{
					a.belong[0]--;
					if(a.belong[0] > 0)
					{
						slowout("蕉蕉碎");
					}
					else return;
					continue;
				}
				if(xi[t] == xi[r])
				{
					dam = damage[r] - damage[t];
					zhong = (int)dam;
					dun = dam - zhong;
					if(shielda < dam || a.belong[4] < zhong)
					{
						a.belong[0]--;
						if(a.belong[0] > 0)
						{
							slowout("蕉蕉碎");
						} 
						else return;
					} 
					else
					{
						if(zhong > 0) cout << zhong << "钟";
						if(dun > 0) cout << "盾";
						cout << "碎";
						if(a.belong[3] < dun)
						{
							a.belong[3] ++;
							a.belong[4] --;
						}
						else a.belong[3] -= dun;
						a.belong[4] -= zhong;
					}
				}
				else
				{
					dam = damage[r];
					zhong = dam;
					dun = dam - zhong;
					if(shielda < dam || a.belong[4] < zhong)
					{
						a.belong[0]--;
						if(a.belong[0] > 0)
						{
							slowout("蕉蕉碎");
						} 
						else return;
					} 
					else
					{
						if(zhong > 0) cout << zhong << "钟";
						if(dun > 0) cout << "盾";
						cout << "碎";
						if(a.belong[3] < dun)
						{
							a.belong[3] ++;
							a.belong[4] --;
						}
						else a.belong[3] -= dun;
						a.belong[4] -= zhong;
					}
				}
			}
		}
		else
		{
			if(damage[t] != 0 && damage[t] != 0.5) slowout("一样大"); 
			else if(t == r && damage[t] != 0) slowout("一样大");
			else if(damage[t] != 0 && t == 22)//暴击是0.5G最大的
			{
				if(b.belong[3] > 0)
				{
					b.belong[3]--;
					slowout("盾碎");
				}
				else if(b.belong[4] > 0)
				{
					b.belong[4]--;
					b.belong[3] = 1;
					slowout("钟变盾");
				}
				else
				{
					b.belong[0]--;
					if(b.belong[0] > 0)
					{
						slowout("蕉蕉碎");
					}
					else
					{
						return;
					}
				}
			}
			else if(damage[t] != 0 && r == 22)
			{
				if(a.belong[3] > 0)
				{
					a.belong[3]--;
					slowout("盾碎");
				}
				else if(a.belong[4] > 0)
				{
					a.belong[4]--;
					a.belong[3] = 1;
					slowout("钟变盾");
				}
				else
				{
					a.belong[0]--;
					if(a.belong[0] > 0)
					{
						slowout("蕉蕉碎");
					}
					else
					{
						return;
					}
				}
			}
			else if(damage[t] != 0 && t == 19 && r == 6)//重拳比戳大
			{
				if(b.belong[3] > 0)
				{
					b.belong[3]--;
					slowout("盾碎");
				}
				else if(b.belong[4] > 0)
				{
					b.belong[4]--;
					b.belong[3] = 1;
					slowout("钟变盾");
				}
				else
				{
					b.belong[0]--;
					if(b.belong[0] > 0)
					{
						slowout("蕉蕉碎");
					}
					else
					{
						return;
					}
				}
			}
			else if(damage[t] != 0 && r == 19 && t == 6)
			{
				if(a.belong[3] > 0)
				{
					a.belong[3]--;
					slowout("盾碎");
				}
				else if(a.belong[4] > 0)
				{
					a.belong[4]--;
					a.belong[3] = 1;
					slowout("钟变盾");
				}
				else
				{
					a.belong[0]--;
					if(a.belong[0] > 0)
					{
						slowout("蕉蕉碎");
					}
					else
					{
						return;
					}
				}
			}
		}
		printf("\n"); 
	}
}

int main()
{
	intro();
	int games = 0,difficulty = 1,oper;
	while(true)
	{
		printf("游戏大厅:\n1.开始游戏\n2.难度设置\n3.退出游戏\n请问你要:");
		scanf("%d",&oper);
		if(oper == 1)
		{
			games++;
			slowout("第");
			printf("%d",games);
			slowout("局:\n");
			startgame();
			slowout("游戏结束!  ");
			if(!a.belong[0]) slowout("很遗憾,你输了!\n");
			else if(!b.belong[0])slowout("恭喜你,你赢了!\n");
			else slowout("平局!\n");
			Sleep(100);
			int again = MessageBox(NULL,"返回大厅......","系统",MB_OK);
			printf("\n"); 
		}
		if(oper == 3)
		{
			printf("\n期待下次游玩!\n");
			return 0;
		} 
		if(oper == 2)
		{
			slowout("当前难度:");
			printf("%d\n",difficulty);
			slowout("请选择难度:\n");
			if(difficult)
		}
	}
}