#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<math.h>
#include<algorithm>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
void sxy(int x,int y);
void rand_start(int n);
int ate();
int rbh(int s,int e);
int srt[10][2];//星星坐标 
int x=3,y=1;//玩家1坐标 x是纵 y是横  
int a=4,b=1;//玩家2坐标 a是纵 b是横 

int rbh(int s,int e)//随机数的生成 
{
    int dis= e-s;
    return rand()%dis+s;
}

void sxy(int x,int y)
{
	COORD pos = {y,x};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
    CONSOLE_CURSOR_INFO info = {1, 0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
}

void rand_start(int n)//按照序号n随机生成第n个星星的坐标 
{
	srt[n][0]=rbh(2,31);
	srt[n][1]=rbh(15,63);
}

int ate(int n)//判断是否吃星 
{
	if(n==1)//如果n是1,判断玩家1 
	{
		for(int i=0;i<10;i++)//遍历所有星星的坐标 
		{
			if(x==srt[i][0]&&y==srt[i][1])//如果坐标重叠为吃了星星,返回星星的序号 
				return i;
		}
	}
	else if(n==2)//如果n是2,判断玩家2
	{
		for(int i=0;i<10;i++)//遍历所有星星的坐标 
		{
			if(a==srt[i][0]&&b==srt[i][1])//如果坐标重叠为吃了星星,返回星星的序号 
				return i;
		}
	}
	return -1;//如果没吃,返回-1 
}

void SetColor(unsigned short ForeColor,unsigned short BackGroundColor)
{
	HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hCon,(ForeColor%16)|(BackGroundColor%16*16));
}
void star()
{
	int i=0; 
	while(1)
	{
		printf("\n\n\n\n\t\t点击屏幕开始游戏....");
		if(KEY_DOWN(MOUSE_MOVED))
			break;
		else
		{
			SetColor(15,i);
			Sleep(50);
			if(KEY_DOWN(MOUSE_MOVED)) 
				break;
			else
				Sleep(50);
			if(KEY_DOWN(MOUSE_MOVED))
				break;
			else
				Sleep(50);
			if(KEY_DOWN(MOUSE_MOVED))
				break;
			else
				Sleep(50);
		}
		i++;
		if(i==15)
			i++;
		system("cls");
	}
	SetColor(15,0);
	system("cls");
}
int double_game()
{
	system("mode con cols=63 lines=32");
	system("title 双人模式~~~~");
	int i,st,yfen=0,efen=0,alv=1,blv=1;
	char ch;
	i=0;
	for(i=0;i<10;i++)
		rand_start(i);
	for(i=0;i<10;i++)
	{
		sxy(srt[i][0],srt[i][1]);
		printf("%c",4);
	}
	SetColor(15,0);
	sxy(0,0);
	printf("%c 玩家1分数:%03d %c 玩家2分数:%03d",2,yfen,1,efen);
	sxy(1,0);
	printf("%c 玩家1等级:%03d %c 玩家2等级:%03d",2,alv,1,blv);
	while(1)
	{
		SetColor(15,0);
		sxy(x,y);
		printf("%c",2);
		sxy(a,b);
		printf("%c",1);
		ch=getch();
		switch(ch)
		{
			case 72:sxy(x,y);printf(" ");x--;break;
			case 80:sxy(x,y);printf(" ");x++;break;
			case 75:sxy(x,y);printf(" ");y--;break;
			case 77:sxy(x,y);printf(" ");y++;break;
			case 'w':sxy(a,b);printf(" ");a--;break;
			case 's':sxy(a,b);printf(" ");a++;break;
			case 'a':sxy(a,b);printf(" ");b--;break;
			case 'd':sxy(a,b);printf(" ");b++;break;
		}
		if(x>=32||y>=63||x<0||y<0)
		{
			SetColor(15,0);
			system("cls");
			printf("\n\n\n\t\t玩家1撞墙了,玩家2获胜");
			Sleep(1000);
			return 0;
		}
		else if(a>=32||b>=63||a<0||b<0)
		{
			SetColor(15,0);
			system("cls");
			printf("\n\n\n\t\t玩家2撞墙了,玩家1获胜");
			Sleep(1000);
			return 0;
		}
		st=ate(1);
		if(st!=-1)
		{
			yfen++;
			sxy(0,12);
			printf("%03d",yfen);//更新分数输出 
			if(yfen%5==0)
			{
				alv++;
				sxy(1,12);
				printf("%03d",alv); //更新等级输出 
			}
			rand_start(st);
			sxy(srt[st][0],srt[st][1]);
			printf("%c",4);
		}
		st=ate(2);
		if(st!=-1)
		{
			efen++;
			sxy(0,28);
			printf("%03d",efen);//更新分数输出 
			if(efen%5==0)
			{
				blv++;
				sxy(1,28);
				printf("%03d",blv);//更新等级输出 
			}
			rand_start(st);
			sxy(srt[st][0],srt[st][1]);
			printf("%c",4);
		}
		if(a==x&&b==y)
		{
			if(alv>blv)
			{
				system("cls");
				printf("\n\n\n\t\t玩家2被吞噬!玩家1获胜!!");
				Sleep(1000);
				return 1;
			}
			else if(alv<blv)
			{
				system("cls");
				printf("\n\n\n\t\t玩家1被吞噬!玩家2获胜!!");
				Sleep(1000);
				return 2;
			}
			else
			{
				sxy(a-1,b-1);
				printf("碰 撞");
				Sleep(500);
				system("cls");
				printf("\n\n\t\t\t同归于尽!");
				Sleep(1000);
				return 0;
			}
		}
	}
}
int main()
{
	system("mode con cols=63 lines=32");
	int choose=10;
	char c; 
	star();
	printf("欢迎回来~~~\n");
	sxy(10,25);
	printf("==比==赛==");
	sxy(11,25);
	printf("==训==练==");
	sxy(12,25);
	printf("==娱==乐==");
	sxy(13,25);
	printf("==退==出==");
	while(1)
	{
		sxy(choose-1,23);
		printf("  ");
		sxy(choose+1,23);
		printf("  ");
		sxy(choose,23);
		SetColor(12,0);
		printf("->");
		SetColor(15,0);
		c=getch();
		if(c==72&&choose>10)
			choose--;
		else if(c==80&&choose<13)
			choose++;
		else if(c==13)
		{
			if(choose==10)
			{
				choose=11;
				while(1)
				{
					sxy(choose-1,23);
					printf("  ");
					sxy(choose+1,23);
					printf("  ");
					sxy(choose,23);
					SetColor(12,0);
					printf("->");
					SetColor(15,0);
					sxy(10,25);
					printf("==比==赛==");
					sxy(11,25);
					printf(" = 双人 = ");
					sxy(12,25);
					printf(" = 单人 = ");
					sxy(13,25);
					printf(" = 收起 = ");
					sxy(14,25);
					printf("==娱==乐==");
					sxy(15,25);
					printf("==退==出==");
					c=getch();
					if(c==72&&choose>11)
						choose--;
					else if(c==80&&choose<13)
						choose++;
					else if(c==13)
					{
						if(choose==11)
						{
							double_game();
							x=3;
							y=1; 
							a=4;
							b=1;
							system("cls");
						}
						else if(choose==12)
						{
							MessageBox(NULL,TEXT("该功能还未开放哦!"), TEXT("敬请期待"), MB_OK | MB_ICONINFORMATION );
						}
						else if(choose==13)
						{
							system("cls");
							sxy(10,25);
							printf("==比==赛==");
							sxy(11,25);
							printf("==训==练==");
							sxy(12,25);
							printf("==娱==乐==");
							sxy(13,25);
							printf("==退==出==");
							choose=10;
							break; 
						}
					}
				}
			}
			else if(choose==13)
			{
				return 0;
			}
			else
			{ 
				MessageBox(NULL,TEXT("该功能还未开放哦!"), TEXT("敬请期待"), MB_OK | MB_ICONINFORMATION );
			}
		}
	}
}