#include<bits/stdc++.h>
#include<windows.h>
#include<time.h> 
#include<conio.h>
#include<stdio.h>
using namespace std;
int now1=1,w1=2,s1=5,a1=4,d1=3,b1=6;//蓝队
int now2=1,w2=5,s2=2,a2=3,d2=4,b2=6;//红队
int px1=1,py1=1,px2=6,py2=6,key1=3,key2=3;
int gameover=0;
void Slowsay(string a){
	int l=a.size();
	for(int i=0;i<l;i++){
		cout<<a[i];
		Sleep(2);
	}
	printf("\n");
}
void Color(int a){
	if(a==0) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
	if(a==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
	if(a==2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
	if(a==3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
	if(a==4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
	if(a==5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
	if(a==6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
	if(a==7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN);
	if(a==8) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
	if(a==9) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|BACKGROUND_INTENSITY|BACKGROUND_RED);
	if(a==10) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE|BACKGROUND_INTENSITY|BACKGROUND_BLUE);
}
void writemap(){
	system("cls");
	for(int i=1;i<=6;i++){
		for(int j=1;j<=6;j++){ 
			if(i+py1==7&&j==px1)cout<<"*--"<<w1<<"--";
			else if(i+py2==7&&j==px2)cout<<"*--"<<w2<<"--";
			else if(i+py1==8&&j==px1)cout<<"*--"<<s1<<"--";
			else if(i+py2==8&&j==px2)cout<<"*--"<<s2<<"--";
			else cout<<"*-----";
		}
		cout<<"*"<<endl;
		for(int j=1;j<=6;j++){ 
			if(i+py1==7&&j==px1)cout<<"|  |  ";
			else if(i+py2==7&&j==px2)cout<<"|  |  ";
			else cout<<"|     ";
		}
		cout<<"|"<<endl;
		int flag=false;
		if(py1+i==7&&py2+i==7&&(px1-px2==1||px2-px1==1)){
			flag=min(px1,px2);
		}
		for(int j=1;j<=6;j++){
			if(flag==false){
				if(i+py1==7&&j==px1){
					cout<<a1<<"- ";
					Color(6),cout<<now1;
					Color(8),cout<<" -";
				}
				else if(i+py1==7&&j==px1+1)cout<<d1<<"     ";
				else if(i+py2==7&&j==px2){
					cout<<a2<<"- ";
					Color(4),cout<<now2;
					Color(8),cout<<" -";
				}
				else if(i+py2==7&&j==px2+1)cout<<d2<<"     ";
				else cout<<"|     ";
			}else{
				if(j==flag){
					j++;
					cout<<a1<<"- ";
					Color(6),cout<<now1;
					Color(8),cout<<" -";
					Color(5),cout<<"+";
					Color(8),cout<<"- ";
					Color(4),cout<<now2;
					Color(8),cout<<" -"<<d2;
				}else if(j==flag+2){
					cout<<"     ";
				}else{
					cout<<"|     ";
				}
			}
		}
		if(i+py1==7&&px1==6){
			cout<<d1<<endl;
		}else if(i+py2==7&&px2==6){
			cout<<d2<<endl;
		}else{
			cout<<"|"<<endl;
		}
		for(int j=1;j<=6;j++){ 
			if(i+py1==7&&j==px1)cout<<"|  |  ";
			else if(i+py2==7&&j==px2)cout<<"|  |  ";
			else cout<<"|     ";
		}
		cout<<"|"<<endl;
	}
	for(int i=1;i<=6;i++){
		if(i==px1&&py1==1){cout<<"*--"<<s1<<"--";}
		else if(i==px2&&py2==1){cout<<"*--"<<s2<<"--";}
		else cout<<"*-----";
	}
	cout<<"*"<<endl;
	return ;
}
void movement(){
	char way;
	int isin=0;
	while(isin<=0){
		Slowsay("please player1 cin how to move:1,6,0,w,s,a or d");
		cin>>way;
		//key
		if(way=='1'||way=='6'||way=='0'){
			if(way=='1'&&key1>0){
				Slowsay("OK, you can move one more time this round");
				Sleep(1000);
				key1--;
				isin--;
			}else if(way=='6'&&key1>0){
				Slowsay("OK, your number is six");
				key1--;
				now1=6,w1=2,s1=5,a1=4,d1=3,b1=1;
			}else if(way=='0'&&key1>0){
				Slowsay("OK, your position is changed");
				key1--;
				px1=1,py1=1;
				Sleep(1000);
			}else{
				Slowsay("Sorry, you don't have enough key");
				Sleep(1000);
			}
		}
		//fight
		else if((way=='w'&&px1==px2&&py1==py2-1&&now1>now2)||(way=='s'&&px1==px2&&py1==py2+1&&now1>now2)||(way=='a'&&py1==py2&&px1==px2+1&&now1>now2)||(way=='d'&&py1==py2&&px1==px2-1&&now1>now2)){
			gameover=1;
			isin++;
		}else if((way=='w'&&px1==px2&&py1==py2-1&&now1<=now2)||(way=='s'&&px1==px2&&py1==py2+1&&now1<=now2)||(way=='a'&&py1==py2&&px1==px2+1&&now1<=now2)||(way=='d'&&py1==py2&&px1==px2-1&&now1<=now2)){
			Slowsay("you'ren't able to fight with player2, please cin again!");
			Sleep(1000);
		}
		//move
		else if(way=='w'&&py1<6){
			w1=now1;
			now1=s1;
			s1=b1;
			b1=7-now1;
			py1++;
			isin++;
		}else if(way=='s'&&py1>1){
			s1=now1;
			now1=w1;
			w1=b1;
			b1=7-now1;
			py1--;
			isin++;
		}else if(way=='a'&&px1>1){
			a1=now1;
			now1=d1;
			d1=b1;
			b1=7-now1;
			px1--;
			isin++;
		}else if(way=='d'&&px1<6){
			d1=now1;
			now1=a1;
			a1=b1;
			b1=7-now1;
			px1++;
			isin++;
		}else{
			Slowsay("please cin correctly");
			Sleep(1000);
		}
		writemap();
	}
	if(gameover)return;
	isin=0;
	while(isin<=0){
		Slowsay("please player2 cin how to move:1,6,0,w,s,a or d");
		cin>>way;
		//key
		if(way=='1'||way=='6'||way=='0'){
			if(way=='1'&&key2>0){
				Slowsay("OK, you can move one more time this round");
				Sleep(1000);
				key2--;
				isin--;
			}else if(way=='6'&&key2>0){
				Slowsay("OK, your number is six");
				key2--;
				now2=6,w2=5,s2=2,a2=3,d2=4,b2=1;
				Sleep(1000);
			}else if(way=='0'&&key2>0){
				Slowsay("OK, your position is changed");
				key2--;
				px2=6,py2=6;
				Sleep(1000);
			}else{
				Slowsay("Sorry, you don't have enough key");
				Sleep(1000);
			}
		}
		//fight
		else if((way=='w'&&px1==px2&&py1==py2+1&&now1<now2)||(way=='s'&&px1==px2&&py1==py2-1&&now1<now2)||(way=='a'&&py1==py2&&px1==px2-1&&now1<now2)||(way=='d'&&py1==py2&&px1==px2+1&&now1<now2)){
			gameover=2;
			isin++;
		}else if((way=='w'&&px1==px2&&py1==py2+1&&now1>=now2)||(way=='s'&&px1==px2&&py1==py2-1&&now1>=now2)||(way=='a'&&py1==py2&&px1==px2-1&&now1>=now2)||(way=='d'&&py1==py2&&px1==px2+1&&now1>=now2)){
			Slowsay	("you'ren't able to fight with player1, please cin again!");
			Sleep(1000);
		}
		//move
		else if(way=='w'&&py2<6){
			w2=now2;
			now2=s2;
			s2=b2;
			b2=7-now2;
			py2++;
			isin++;
		}else if(way=='s'&&py2>1){
			s2=now2;
			now2=w2;
			w2=b2;
			b2=7-now2;
			py2--;
			isin++;
		}else if(way=='a'&&px2>1){
			a2=now2;
			now2=d2;
			d2=b2;
			b2=7-now2;
			px2--;
			isin++;
		}else if(way=='d'&&px2<6){
			d2=now2;
			now2=a2;
			a2=b2;
			b2=7-now2;
			px2++;
			isin++;
		}else{
			Slowsay("please cin correctly");
			Sleep(1000);
		}
		writemap();
	}
	if(gameover)return ;
}
void endgame(int winpn){
	system("cls");
	Color(3),Slowsay("gameover!");
	Color(8),cout<<"player1's score is ";
	Color(6),cout<<now1<<endl;
	Sleep(500);
	Color(8),cout<<"player2's score is ";
	Color(4),cout<<now2<<endl;
	Sleep(500);
	Color(7),cout<<"and player"<<winpn<<" hits player"<<3-winpn<<endl;
	Sleep(500);
	Color(5),cout<<"so, player"<<winpn<<" win!";
	Color(8);	
	return ;
}
void startboard(){
	Color(2),Slowsay("游戏名:骰子竞技场3.0");
	Color(8),Slowsay("相比于2.0美化棋盘,加入0键");
	Color(5),Slowsay("制作:2024级0310");
	Color(4),Slowsay("不要将代码放入自己的博客");
	Color(6),Slowsay("按下任意键游戏规则");
	Color(8);
	char choose='t';
	while(choose=='t')choose=_getch();
	return ;
}
void gamerule(){
	system("cls");
	Color(2),Slowsay("游戏名称:骰子竞技场3.0");
	Color(3),Slowsay("基础规则");
	Color(7),cout<<"1 ";
	Color(8),Slowsay("每人初始有一个点数为1的骰子,上下左右的四个数值是骰子的四个面");
	Color(7),cout<<"2 ";
	Color(8),Slowsay("双方玩家轮流移动1格或者在你的骰子点数比对方大的时候攻击对方获得胜利");
	Color(3),Slowsay("道具规则");
	Color(8),Slowsay("每人有3次使用道具的机会,但是每回合可以重复使用");
	Color(7),cout<<"1 键 ";
	Color(8),Slowsay("本回合多行动1次");
	Color(7),cout<<"6 键 ";
	Color(8),Slowsay("你的点数变成6");
	Color(7),cout<<"0 键 ";
	Color(8),Slowsay("回到出生点");
	Color(6),Slowsay("最后,本游戏需要双人游玩");
	Color(8),Slowsay("按下任意键开始");
	char t='t';
	while(t=='t')t=_getch();
	return ;
}
int main(){
	startboard();
	gamerule();
	while(gameover==0){
		writemap();
		movement();
	}
	endgame(gameover);
	return 0;
}