#include<bits/stdc++.h>
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<time.h>
using namespace std;
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|FOREGROUND_BLUE);if(a==8) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);if(a==9) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_GREEN|BACKGROUND_BLUE);if(a==10) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_BLUE);if(a==11) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE);if(a==12) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN);if(a==13) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);if(a==14) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_BLUE);}
int ground[10][9] = {{-1,-2,-3,-4,-5,-4,-3,-2,-1},{0,0,0,0,0,0,0,0,0},{0,-6,0,0,0,0,0,-6,0},{-7,0,-7,0,-7,0,-7,0,-7},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{7,0,7,0,7,0,7,0,7},{0,6,0,0,0,0,0,6,0},{0,0,0,0,0,0,0,0,0},{1,2,3,4,5,4,3,2,1}};
//1车2马3相4士5帅6炮7兵
char* get(int num)
{
switch(num)
{
case 0:return"--";
case 1:return"俥";
case 2:return"馬";
case 3:return"相";
case 4:return"仕";
case 5:return"帅";
case -1:return"車";
case -2:return"马";
case -3:return"象";
case -4:return"士";
case -5:return"将";
case 6:return"炮";
case 7:return"兵";
case -6:return"砲";
case -7:return"卒";
}
}
void printboard()
{
Color(5);
for(int j = 0;j <= 18;j++)
{
if(j % 2 == 0)
{
cout << " ";
for(int i = 0;i <= 8;i++)
{
if(ground[j / 2][i] < 0) Color(13); else if(ground[j / 2][i] > 0) Color(4);
cout << get(ground[j / 2][i]) << " ";
Color(5);
}
cout << endl;
}
else
{
if(j == 9)
{
Color(9);
cout <<" 河界 ";
cout << endl;
Color(5);
}
else
{
for(int i = 1;i <= 10;i++)
{
cout << "丨 ";
}
cout << endl;
}
}
}
Color(0);
cout << endl << endl;
return;
}
bool go(int i,int j,int l,int m)
{
if(ground[i][j] * ground[l][m] > 0) return false;//不能走对手的棋
switch(abs(ground[i][j]))
{
case 1:{if((l - i) * (m - j) != 0) return false;}
}
return true;
}
void zouqi(int now)//1红-1黑
{
Color(0);
cout << "请选择棋子(行,列):";
int i,j;
cin >> i >> j;
i--,j--;
while(ground[i][j] * now <= 0)
{
cout << "请重新选择棋子(行,列):";
cin >> i >> j;
i--,j--;
}
cout << "请选择终点(行,列):";
int l,m;
cin >> l >> m;
l--,m--;
while(!go(i,j,l,m))
{
cout << "请重新选择终点(行,列):";
cin >> l >> m;
l--,m--;
}
int t = ground[i][j];
ground[i][j] = 0;
ground[l][m] = t;
printboard();
}
int checkmate()// -1黑被将死 1红被将死 0不变
{
bool flag1 = false,flag2 = false;
for(int i = 0;i <= 9;i++)
{
for(int j = 3;j <= 5;j++)
{
if(i > 2 && i < 7) continue;
if(ground[i][j] == 5) flag1 = true;
else if(ground[i][j] == -5) flag2 = true;
}
}
if(flag1 && !flag2) return -1;
else if(!flag1 && flag2) return 1;
return 0;
}
int main()
{
printboard();
int cur = 1;
while(checkmate() == 0)
{
Color(5);
cout << "现在是";
if(cur == 1)
{
Color(4);
cout << " 红方 ";
}
else
{
Color(13);
cout << " 黑方 ";
}
Color(5);
cout << "走棋" << endl;
Color(0);
zouqi(cur);
cur *= -1;
}
Color(5);
if(checkmate() == 1) cout << "红被将死!";
else cout << "黑被将死!";
cout << endl;
return 0;
}