#include<bits/stdc++.h>
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<time.h>
//#define basemet(x) (x == 0) : 0 ? x/abs(x);
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兵 

int basemet(int x)
{
	if(x == 0) return 0;
	return x/abs(x);
}

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 <<"            河界            "; 
				Color(0);
				cout << endl;
				Color(5);
			}
			else
			{
				for(int i = 1;i <= 10;i++)
				{
					cout << "丨 ";
				}
				cout << endl;
			}
		}
	}
	Color(0);
	cout << endl << endl;
	return;
}

int path(int y,int i,int m)//从i到m横着
{
	if(i == m) return 0;
	if(i > m) swap(i,m);
	int cnt = 0;
	for(int k = i + 1;k < m;k++)
	{
		if(ground[y][k] != 0) cnt++;
	}
	return cnt;
} 

int way(int x,int j,int l)//从j到l竖着 
{
	if(j == l) return 0;
	if(j > l) swap(j,l);
	int cnt = 0;
	for(int k = j + 1;k < l;k++)
	{
		if(ground[k][x] != 0) cnt++;
	}
	return cnt;
}

bool horse(int deltax,int deltay,int x,int y)
{
	if(deltax == 2) return ground[x + 1][y] == 0;
	if(deltax == -2) return ground[x - 1][y] == 0;
	if(deltay == 2) return ground[x][y + 1] == 0;
	return ground[x][y - 1] == 0;
}

int locatey(int tar)
{
	for(int i = 0;i <= 9;i++)
	{
		for(int j = 0;j <= 8;j++)
		{
			if(ground[i][j] == tar) return j;
		} 
	}
	return -1;
}

int locatex(int tar)
{
	for(int i = 0;i <= 9;i++)
	{
		for(int j = 0;j <= 8;j++)
		{
			if(ground[i][j] == tar) return i;
		} 
	}
	return -1;
}

bool go(int i,int j,int l,int m)
{
	if(ground[i][j] * ground[l][m] > 0) return false;//不能吃自己的棋 
	if(i == l && j == m) return false;
	if(l > 10 || l < 0 || m < 0 || m > 9) return false;
	
	switch(abs(ground[i][j]))
	{
		case 1:{if((l - i) * (m - j) != 0) return false;
				if(l == i && path(l,j,m) == 0) return true;
				if(m == j && way(m,i,l) == 0) return true;
				return false;}
		case 2:{if(abs((l - i) * (m - j)) != 2) return false;
				return horse(l - i,m - j,i,j);}
		case 3:{if((l - 4.5) * basemet(ground[i][j]) < 0) return false;
				if(abs(l - i) != 2 || abs(j - m) != 2) return false;
				return ground[(i + l) / 2][(j + m) / 2] == 0;}
		case 4:{if(abs((l - i) * (m - j)) != 1) return false;
				if((l - 4.5) * basemet(ground[i][j]) < 2.5) return false;
				if(m <= 2 || m >= 6) return false;
				return true;}
		case 5:{if((l - 4.5) * basemet(ground[i][j]) < 2.5) return false;
				if(m <= 2 || m >= 6) return false;
				if(locatey(-1 * ground[i][j]) == m && way(m,locatex(-1 * ground[i][j]),l) == 0) return false;
				if((l - i) * (l - i) + (m - j) * (m - j) != 1) return false;}
		case 7:{if((l - 4.5) * basemet(ground[i][j]) >= 0) return (l == i - basemet(ground[i][j]) && m == j);
				if((l - 4.5) * basemet(ground[i][j]) < 0)  return ((l - i) * (l - i) + (m - j) * (m - j) == 1 && l != i - basemet(ground[i][j]));}
		case 6:{if((l - i) * (m - j) != 0) return false;
				if(l == i)
				{
					if(ground[l][m] == 0) return path(l,j,m) == 0;
					if(ground[l][m] != 0) return path(l,j,m) == 1;
				}
				if(m == j)
				{
					if(ground[l][m] == 0) return way(m,i,l) == 0;
					if(ground[l][m] != 0) return way(m,i,l) == 1;
				}
				}
		default:return false;
	}
}

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);
		cout << endl;
		zouqi(cur);
		cur *= -1;
	}
	Color(5);
	if(checkmate() == 1) cout << "红被将死!";
	else cout << "黑被将死!";
	cout << endl;
	return 0;
}

更新日志: 2025/11/26 发布