一份简易飞行棋

爆肝7小时,手打600行代码,终于把这飞行棋搞定了

这就是C++作业吗,i了i了(

//飞行棋
#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <cstring>
#include <ctime>

using namespace std;

char table[53]="OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", base[5]="YYYY"; //定义棋盘与玩家基地
int a=-1, b=-1, c=-1, d=-1, color=0, i, circle=0, circleNum, point, lucky=6, A=-1, B=-1, C=-1, D=-1, E=-2; //四个玩家的步数、棋盘定位、回合、骰子点数、取6、位置、同位判断
bool get6=false, termin=false; //判定是否已开始游戏以及到达终点
string info="\n\n", FLY="", EATI=""; //步数及奖励信息

void rule() //打印规则
{
	cout << "欢迎运行简易飞行棋!" << endl << endl;
	cout << "为简化操作,每个玩家仅拥有1架飞机," << endl;
	cout << "每局以先绕棋盘一圈返回基地的玩家胜" << endl;
	cout << "出(不要求点数恰好)。" << endl;
	cout << "1.骰子掷到数字6方可起飞。" << endl;
	cout << "2.遇到同色格子可前进至下一同色格。" << endl;
	cout << "3.遇到同色航线可沿航线飞行至对应的" << endl;
	cout << "格子。" << endl;
	cout << "4.遇到其他玩家的飞机,则将对方玩家" << endl;
	cout << "的飞机驱逐回基地。" << endl;
	cout << "5.掷到数字6可再掷一次。" << endl << endl;

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
	cout << "玩家A(真人) ";
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
	cout << "玩家B(电脑)" << endl;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
	cout << "玩家D(电脑) ";
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
	cout << "玩家C(真人)" << endl << endl;

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
	cout << "现在轮到玩家A,要掷骰子,";
	system("pause");
}

void color_judge_table(int j) //判断格子输出颜色
{
	//棋盘默认
	if(j%4==2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
	if(j%4==3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
	if(j%4==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
	if(j%4==0) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);

	//棋子颜色
	if(j==A) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
	if(j==B) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
	if(j==D) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
	if(j==C) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
}
void color_judge_player(char j) //判断玩家输出颜色
{
	if(j=='A') SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
	if(j=='B') SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
	if(j=='D') SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
	if(j=='C') SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
}

void print_table() //打印棋盘
{
	system("cls");

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
	cout << "玩家A(真人) ";
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
	cout << "玩家B(电脑)" << endl;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
	cout << "玩家D(电脑) ";
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
	cout << "玩家C(真人)" << endl << endl;

	//显示点数
	//cout << circleNum;
	char circleName=circleNum+65;
	color_judge_player(circleName);
	cout << "玩家" << circleName << "掷出了" << point << "点" << endl << endl;
	cout << FLY << info;
	FLY="";

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
	cout << base[0];
	cout << "                             ";
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
	cout << base[1] << endl;
	cout << "  ";
	for(i=0;i<14;i++)
	{
		color_judge_table(i);
		cout << table[i] << ' ';
	}
	cout << endl;
	for(i=0;i<12;i++)
	{
		color_judge_table(51-i);
		cout << "  " << table[51-i];
		if(i<4)
		{
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
			cout << "             | ";
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
			cout << "|         ";
		}
		if(i==4)
		{
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
			cout << "-------------+ ";
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
			cout << "|         ";
		}
		if(i==5)
		{
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
			cout << "---------+     ";
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
			cout << "|         ";
		}
		if(i==6)
		{
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
			cout << "         |     ";
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
			cout << "+---------";
		}
		if(i==7)
		{
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
			cout << "         | ";
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
			cout << "+-------------";
		}
		if(i>7)
		{
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
			cout << "         | ";
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
			cout << "|             ";
		}
		color_judge_table(14+i);
		cout << table[14+i] << endl;
	}
	cout << "  ";
	for(i=0;i<14;i++)
	{
		color_judge_table(39-i);
		cout << table[39-i] << ' ';
	}
	cout << endl;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
	cout << base[2];
	cout << "                             ";
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
	cout << base[3] << endl << endl;

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

	cout << EATI;
	EATI="";

	if(termin)
	{
		cout << "游戏结束!" << endl;
		system("pause");
		abort();
	}

	circleNum=circleNum+66;
	if(circleNum==69) circleNum=65;
	circleName=circleNum;
	if(circleNum%2==0)
	{
		int downcount,rt1,rt2;
		srand( static_cast<unsigned int>(time(0)) );
		rt1=rand()%1000;
		rt2=rand()%1000;
		downcount=(rt1*rt2)%4000+2000;
		//downcount=1;
		cout << "现在轮到玩家" << circleName << ",将在" << downcount << "毫秒后掷骰子";
		Sleep(downcount);
	}
	else
	{
		cout << "现在轮到玩家" << circleName << ",要掷骰子,";
		system("pause");
	}
}

void get_point() //掷色子
{
	srand( static_cast<unsigned int>(time(0)));
	point=1+rand()%6;
}

void move_judge() //步数判定
{
	if(point==6)
	{
		switch(circleNum) //circle--是为了再掷一次
		{
			case 0 :
				if(a==-1)
				{
					a=0;
					info="A起飞了\n\n";
					base[0]='O';
				}
				else
				{
					a=a+6;
					get6=true;
					if(a%4==2)
					{
						if(a==34)
						{
							a=a+12;
							FLY="A抵达了航线,飞行12步~";
						}
						else
						{
							a=a+4;
							FLY="A抵达了同色格子,前跳4步~";
						}
					}
				}
				if(a>=52)
				{
					info="A到达了终点!\n\n";
					termin=true;
					a=52;
				}
				table[A]='O';
				A=a%52;
				table[A]='Y';
				E=A;
				break;
			case 1 :
				if(b==-1)
				{
					b=13;
					info="B起飞了\n\n";
					base[1]='O';
				}
				else
				{
					b=b+6;
					get6=true;
					if(b%4==3)
					{
						if(b==47)
						{
							b=b+12;
							FLY="B抵达了航线,飞行12步~";
						}
						else
						{
							b=b+4;
							FLY="B抵达了同色格子,前跳4步~";
						}
					}
				}
				if(b>=65)
				{
					info="B到达了终点!\n\n";
					termin=true;
					b=65;
				}
				table[B]='O';
				B=b%52;
				E=B;
				table[B]='Y';
				break;
			case 2 :
				if(c==-1)
				{
					c=26;
					info="C起飞了\n\n";
					base[3]='O';
				}
				else
				{
					c=c+6;
					get6=true;
					if(c%4==1)
					{
						if(c==60)
						{
							c=c+12;
							FLY="C抵达了航线,飞行12步~";
						}
						else
						{
							c=c+4;
							FLY="C抵达了同色格子,前跳4步~";
						}
					}
				}
				if(c>=78)
				{
					info="C到达了终点!\n\n";
					termin=true;
					c=78;
				}
				table[C]='O';
				C=c%52;
				E=C;
				table[C]='Y';
				break;
			case 3 :
				if(d==-1)
				{
					d=39;
					info="D起飞了\n\n";
					base[2]='O';
				}
				else
				{
					d=d+6;
					get6=true;
					if(d%4==0)
					{
						if(d==73)
						{
							d=d+12;
							FLY="D抵达了航线,飞行12步~";
						}
						else
						{
							d=d+4;
							FLY="D抵达了同色格子,前跳4步~";
						}
					}
				}
				if(d>=91)
				{
					info="D到达了终点!\n\n";
					termin=true;
					d=91;
				}
				table[D]='O';
				D=d%52;
				E=D;
				table[D]='Y';
				break;
			default :
				system("cls");
				cout << "游戏崩溃!非常抱歉!" << endl;
				system("pause");
				abort();
   		}
	}
	else
	{
		switch(circleNum)
		{
			case 0 :
				if(a==-1)
				{
					info="A未能起飞\n\n";
				}
				else
				{
					a=a+point;
					info="\n\n";
					if(a%4==2)
					{
						if(a==34)
						{
							a=a+12;
							FLY="A抵达了航线,飞行12步~";
						}
						else
						{
							a=a+4;
							FLY="A抵达了同色格子,前跳4步~";
						}
					}
				}
				if(a>=52)
				{
					info="A到达了终点!\n\n";
					termin=true;
					a=52;
				}
				table[A]='O';
				A=a%52;
				E=A;
				table[A]='Y';
				break;
			case 1 :
				if(b==-1)
				{
					info="B未能起飞\n\n";
				}
				else
				{
					b=b+point;
					info="\n\n";
					if(b%4==3)
					{
						if(b==47)
						{
							b=b+12;
							FLY="B抵达了航线,飞行12步~";
						}
						else
						{
							b=b+4;
							FLY="B抵达了同色格子,前跳4步~";
						}
					}
				}
				if(b>=65)
				{
					info="B到达了终点!\n\n";
					termin=true;
					b=65;
				}
				table[B]='O';
				B=b%52;
				E=B;
				table[B]='Y';
				break;
			case 2 :
				if(c==-1)
				{
					info="C未能起飞\n\n";
				}
				else
				{
					c=c+point;
					info="\n\n";
					if(c%4==1)
					{
						if(c==60)
						{
							c=c+12;
							FLY="C抵达了航线,飞行12步~";
						}
						else
						{
							c=c+4;
							FLY="C抵达了同色格子,前跳4步~";
						}
					}
				}
				if(c>=78)
				{
					info="C到达了终点!\n\n";
					termin=true;
					c=78;
				}
				table[C]='O';
				C=c%52;
				E=C;
				table[C]='Y';
				break;
			case 3 :
				if(d==-1)
				{
					info="D未能起飞\n\n";
				}
				else
				{
					d=d+point;
					info="\n\n";
					if(d%4==0)
					{
						if(d==73)
						{
							d=d+12;
							FLY="D抵达了航线,飞行12步~";
						}
						else
						{
							d=d+4;
							FLY="D抵达了同色格子,前跳4步~";
						}
					}
				}
				if(d>=91)
				{
					info="D到达了终点!\n\n";
					termin=true;
					d=91;
				}
				table[D]='O';
				D=d%52;
				E=D;
				table[D]='Y';
				break;
			default :
				system("cls");
				cout << "游戏崩溃!非常抱歉!" << endl;
				system("pause");
				abort();
   		}
	}
}

void eat_judge(int ej, char ejc)
{
	if(ej!=-1)
	{
		if(ej==A && ejc!='A')
		{
			E=-2;
			A=-1;
			a=-1;
			base[0]='Y';
			EATI="噢,A被驱逐回基地了……\n\n";
		}
		if(ej==B && ejc!='B')
		{
			E=-2;
			B=-1;
			b=-1;
			base[1]='Y';
			EATI="噢,B被驱逐回基地了……\n\n";
		}
		if(ej==C && ejc!='C')
		{
			E=-2;
			C=-1;
			c=-1;
			base[3]='Y';
			EATI="噢,C被驱逐回基地了……\n\n";
		}
		if(ej==D && ejc!='D')
		{
			E=-2;
			D=-1;
			d=-1;
			base[2]='Y';
			EATI="噢,D被驱逐回基地了……\n\n";
		}
	}
}

int main()
{
	rule();

	while(1)
	{
		circleNum=circle%4;
		get_point();
		move_judge();
		if(get6)
		{
			cout << "恭喜,你掷到了6,可以再掷一次!";
			if(circleNum%2==0) system("pause");
			while(point==6) get_point();
			move_judge();
			point=point+6;
			get6=false;
		}
		eat_judge(E, circleNum+65);
		//cout << circleNum;
		print_table();
		circle++;
		//system("pause");
	}

	return 0;
}