模拟题,代码稍长,一定仔细。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
char Map[8][9];
int Hstep_x[8] = {2, 2, -2, -2, 1, 1, -1, -1};
int Hstep_y[8] = {1, -1, 1, -1, 2, -2, 2, -2};
// 马的走法
bool Border(int i, int j)
// 判断边界
{
if(i>=0&&i<8&&j>=0&&j<8)
return true;
return false;
}
bool Judge_Straight(int x, int y, char k)
// 判断横竖直线攻击
{
for(int i=y+1; i<8; i++)
if(Map[x][i] == k)
return true;
else if(Map[x][i] != '.')
break;
for(int i=y-1; i>=0; i--)
if(Map[x][i] == k)
return true;
else if(Map[x][i] != '.')
break;
for(int i=x+1; i<8; i++)
if(Map[i][y] == k)
return true;
else if(Map[i][y] != '.')
break;
for(int i=x-1; i>=0; i--)
if(Map[i][y] == k)
return true;
else if(Map[i][y] != '.')
break;
return false;
}
bool Judge_Diagonal(int x, int y, char k)
// 判断对角线攻击
{
for(int i=x+1,j=y+1; ; i++,j++)
if(Border(i, j))
{
if(Map[i][j]==k)
return true;
else if(Map[i][j]!='.')
break;
}
else
break;
for(int i=x+1,j=y-1; ; i++,j--)
if(Border(i, j))
{
if(Map[i][j]==k)
return true;
else if(Map[i][j]!='.')
break;
}
else
break;
for(int i=x-1,j=y+1; ; i--,j++)
if(Border(i, j))
{
if(Map[i][j]==k)
return true;
else if(Map[i][j]!='.')
break;
}
else
break;
for(int i=x-1,j=y-1; ; i--,j--)
if(Border(i, j))
{
if(Map[i][j]==k)
return true;
else if(Map[i][j]!='.')
break;
}
else
break;
return false;
}
bool Judge_Horse(int x, int y, char k)
// ‘马’的攻击判断
{
for(int i=0; i<8; i++)
if(Border(x+Hstep_x[i], y+Hstep_y[i])
&&Map[x+Hstep_x[i]][y+Hstep_y[i]] == k)
return true;
return false;
}
int Judge(int x, int y)
{
switch(Map[x][y])
{
case 'p':
// ‘卒’攻击判断
if(Border(x+1, y+1)&&Map[x+1][y+1]=='K')
return 1;
else if(Border(x+1, y-1)&&Map[x+1][y-1]=='K')
return 1;
break;
case 'r'://‘车’攻击判断
if(Judge_Straight(x, y, 'K'))
return 1;
break;
case 'b'://‘象’攻击判断
if(Judge_Diagonal(x, y, 'K'))
return 1;
break;
case 'q'://‘后’攻击判断
if(Judge_Straight(x, y, 'K') || Judge_Diagonal(x, y, 'K'))
return 1;
break;
case 'n'://‘马’攻击判断
if(Judge_Horse(x, y, 'K'))
return 1;
break;
case 'P':
if(Border(x-1, y+1)&&Map[x-1][y+1]=='k')
return -1;
else if(Border(x-1, y-1)&&Map[x-1][y-1]=='k')
return -1;
break;
case 'R':
if(Judge_Straight(x, y, 'k'))
return -1;
break;
case 'B':
if(Judge_Diagonal(x, y, 'k'))
return -1;
break;
case 'Q':
if(Judge_Straight(x, y, 'k') || Judge_Diagonal(x, y, 'k'))
return -1;
break;
case 'N':
if(Judge_Horse(x, y, 'k'))
return -1;
break;
}
return 0;
}
int solve()
{
int ans;
for(int i=0; i<8; i++)
for(int j=0; j<8; j++)
{
ans = Judge(i, j);
if(ans)
return ans;
}
return 0;
}
int main()
{
#ifdef test
freopen("sample.txt", "r", stdin);
#endif
int ans, cct = 0;
while(1)
{
int flag = 0;
for(int i=0; i<8; i++)
scanf("%s", Map[i]);
for(int i=0; i<8; i++)
if(strcmp(Map[i], "........"))
flag = 1;
if(!flag)
break;
ans = solve();
printf("Game #%d: ", ++cct);
if(ans == -1)
printf("black king is in check.\n");
else if(ans == 1)
printf("white king is in check.\n");
else
printf("no king is in check.\n");
}
return 0;
}