#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;

struct node
{
	int con,col;
};

stack<node> cards;

void print(string s)
{
	int len=s.length();
	for(int i=0;i<len;i++)
	{
		putchar(s[i]);
		Sleep(25);
	}
}

void put(node c)
{
	switch(c.col)
	{
	case 1:
		print("红色 ");
		break;
	case 2:
		print("蓝色 ");
		break;
	case 3:
		print("黄色 ");
		break;
	case 4:
		print("绿色 ");
		break;
	case 5:
		print("黑色 ");
		break;
	}
	if(c.con>=0&&c.con<=9) cout<<c.con<<"\n";
	else
	{
		if(c.con==10) print("转向\n");
		if(c.con==11) print("跳过\n");
		if(c.con==12) print("+2\n");
		if(c.con==13) print("+4\n");
		if(c.con==14) print("万能\n");
	}
}

int main()
{
	srand(time(0));
	MessageBoxW(NULL,L"作者蒟蒻，有不好用之处请上 hydro.ac @ 作者",L"作者注",MB_OK);
	print("作者：邓邵洋\n");
	print("按下任意键继续......\n");
	while(!_kbhit()) Sleep(1);
	_getch();
	system("cls");
	print("欢迎来到 UNO！\n");
	print("规则如下：\n");
	print("================================\n");
	print("【基本规则】\n");
	print("1. 每位玩家初始手牌 7 张\n");
	print("2. 按顺时针方向轮流出牌\n");
	print("3. 出牌必须与上一张牌的颜色或数字相同\n");
	print("4. 若无法出牌则从牌堆摸一张牌\n");
	print("5. 先出完所有手牌的玩家获胜\n");
	print("\n");
	print("【功能牌】\n");
	print("1. 转向 —— 改变出牌方向\n");
	print("2. 跳过 —— 下一位玩家被跳过\n");
	print("3. +2 —— 下一位玩家摸 2 张牌并跳过回合\n");
	print("4. +4 —— 下一位玩家摸 4 张牌并跳过回合，同时可指定颜色\n");
	print("5. 万能 —— 出牌者可指定下一轮的颜色\n");
	print("\n");
	print("【颜色】\n");
	print("1 —— 红色\n");
	print("2 —— 蓝色\n");
	print("3 —— 黄色\n");
	print("4 —— 绿色\n");
	print("\n");
	print("【胜利条件】\n");
	print("率先出完所有手牌的玩家获胜！\n");
	print("================================\n");
	print("祝各位游戏愉快！\n");
	print("按下任意键继续......\n");
	while(!_kbhit()) Sleep(1);
	_getch();
	system("cls");
	
	for(int i=1;i<=10000;i++)
	{
		node card;
		card.col=rand()%4+1;
		card.con=rand()%15;
		if(card.con==13||card.con==14) card.col=5;
		cards.push(card);
	}
	
	int mode;
	print("请选择：人机对战 (a) 或 双人对战 (b)\n");
	print("请按下 a 或 b.....\n");
	while((!((GetAsyncKeyState('A'))&0x8000))&&(!((GetAsyncKeyState('B'))&0x8000))) Sleep(10);
	
	if(GetAsyncKeyState('A')&0x8000)
	{
		print("你选择了：人机对战\n");
		mode=1;
	}
	if(GetAsyncKeyState('B')&0x8000)
	{
		print("你选择了：双人对战\n");
		mode=2;
	}
	_getch();
	system("cls");
	
	bool win=false;
	int turn=1;
	
	if(mode%2)
	{
		vector<node> YourCards,AIsCards;
		
		for(int i=1;i<=7;i++)
		{
			YourCards.push_back(cards.top());
			cards.pop();
			AIsCards.push_back(cards.top());
			cards.pop();
		}
		
		node Top=cards.top();
		cards.pop();
		while(Top.con>=10&&Top.con<=14)
		{
			Top=cards.top();
			cards.pop();
		}
		
		while(!win)
		{
			if(turn==1)
			{
				turn=0;
				print("你的回合开始\n你的手牌：\n");
				int cnt=1;
				for(auto i=YourCards.begin();i<=YourCards.end();i++)
				{
					node it=*i;
					cout<<cnt<<':';
					++cnt;
					put(it);
				}
				/**/
				print("你需要出的牌是 ");
				put(Top);
				bool hand_out=false;
				while(!hand_out)
				{
					print("请选择要出的牌号（输入 0 摸一张）：");
					int chs;
					scanf("%d",&chs);
					if(chs>cnt-1)
					{
						print("你没有这张牌\n");
						continue;
					}
					if(chs==0)
					{
						hand_out=true;
						print("你选择摸一张牌\n");
						node draw=cards.top();
						cards.pop();
						YourCards.push_back(draw);
						print("你摸到了 ");
						put(draw);
						continue;
					}
					else
					{
						node ocard=*(YourCards.begin()+chs-1);
						if(ocard.con!=Top.con&&ocard.col!=Top.col&&ocard.col!=5)
						{
							print("你不能出这张牌\n");
							continue;
						}
						hand_out=true;
						print("你打出了 ");
						put(ocard);
						YourCards.erase(YourCards.begin()+chs-1);
						Top=ocard;
						if(ocard.con==10)
						{
							print("顺序转换，当前回合：玩家\n");
							turn=1;
						}
						if(ocard.con==11)
						{
							print("对手被跳过，当前回合：玩家\n");
							turn=1;
						}
						if(ocard.con==12)
						{
							print("对手摸了两张牌且回合被跳过，当前回合：玩家\n");
							for(int i=1;i<=2;i++) AIsCards.push_back(cards.top()),cards.pop();
							turn=1;
						}
						if(ocard.con==13)
						{
							print("对手摸了四张牌且回合被跳过，当前回合：玩家\n");
							for(int i=1;i<=4;i++) AIsCards.push_back(cards.top()),cards.pop();
							turn=1;
							print("请玩家指定下一回合出牌颜色:1 红色 2 蓝色 3 黄色 4 绿色\n");
							int colored;
							cin>>colored;
							Top.col=colored;
						}
						if(ocard.con==14)
						{
							print("请玩家指定下一回合出牌颜色:1 红色 2 蓝色 3 黄色 4 绿色\n");
							int colored;
							cin>>colored;
							Top.col=colored;
						}
					}
				}
				print("你的回合结束\n");
				if(YourCards.empty())
				{
					win=1;
					system("color 0a");
					system("cls");
					print("你赢了\n");
					system("color 0F");
					return 0;
				}
				/**/
			}
			if(turn==0)
			{
				turn=1;
				print("AI 的回合开始\n");
				bool hand_out=false;
				for(auto it=AIsCards.begin();it<=AIsCards.end();it++)
				{
					node IT=*it;
					if(IT.con==Top.con||IT.col==Top.col||IT.col==5)
					{
						print("AI 打出了 ");
						put(IT);
						Top=IT;
						if(IT.con==10)
						{
							print("顺序转换，当前回合：AI\n");
							turn=0;
						}
						if(IT.con==11)
						{
							print("玩家被跳过，当前回合：AI\n");
							turn=0;
						}
						if(IT.con==12)
						{
							print("你摸了两张牌且回合被跳过，当前回合：AI\n");
							for(int i=1;i<=2;i++) YourCards.push_back(cards.top()),print("你摸到了 "),put(cards.top()),cards.pop();
							turn=0;
						}
						if(IT.con==13)
						{
							print("你摸了四张牌且回合被跳过，当前回合：AI\n");
							for(int i=1;i<=4;i++) YourCards.push_back(cards.top()),print("你摸到了 "),put(cards.top()),cards.pop();
							turn=0;
							print("AI指定下一回合出牌颜色为:\n");
							int colored;
							colored=rand()%4+1;
							switch(colored)
							{
							case 1:
								print("红色\n");
								break;
							case 2:
								print("蓝色\n");
								break;
							case 3:
								print("黄色\n");
								break;
							case 4:
								print("绿色\n");
								break;
							}
							Top.col=colored;
						}
						if(IT.con==14)
						{
							print("AI指定下一回合出牌颜色为:\n");
							int colored;
							colored=rand()%4+1;
							switch(colored)
							{
							case 1:
								print("红色\n");
								break;
							case 2:
								print("蓝色\n");
								break;
							case 3:
								print("黄色\n");
								break;
							case 4:
								print("绿色\n");
								break;
							}
							Top.col=colored;
						}
						AIsCards.erase(it);
						hand_out=true;
						break;
					}
				}
				if(!hand_out)
				{
					print("AI 没有能出的牌，摸一张\n");
					AIsCards.push_back(cards.top());
					cards.pop();
				}
				print("AI 的回合结束\n");
			}
		}
	}
	
	return 0;
}
