- BC20270080's blog
象棋(不断优化中)
- @ 2025-10-22 11:35:20
#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 发布