您的位置:首页 > 编程语言

挑战编程 程序设计竞赛训练手册-1.6.7 将军(Check_the_Check)

2013-01-23 03:49 676 查看
挑战编程 程序设计竞赛训练手册-1.6.7 将军(Check_the_Check)







public class problem_Check_The_Check {

/**1.思路问题:直接判断王周围能够被将军的线路的布子情况更简单易行
* 2.哨兵 能有效解决越界问题
* 3.通个了宵完成的……
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
char[][] check1 = {				//大写表示白子,小写表示黑子
{'.','.','k','.','.','.','.','.'},
{'p','p','p','.','p','p','p','p'},
{'.','.','.','.','.','.','.','.'},
{'.','.','.','.','.','B','.','.'},
{'.','.','.','.','.','.','.','.'},
{'.','.','.','.','.','.','.','.'},
{'P','P','P','P','P','P','P','P'},
{'K','.','.','.','.','.','.','.'},
};
char[][] check = {				//大写表示白子,小写表示黑子
{'r','n','b','q','k','.','n','r'},
{'p','p','p','.','.','p','p','p'},
{'.','.','.','.','p','.','.','.'},
{'.','.','.','P','.','.','.','.'},
{'.','b','P','P','.','.','.','.'},
{'.','.','.','.','.','.','.','.'},
{'P','P','.','.','P','P','P','P'},
{'R','N','B','Q','K','B','.','R'},
};
/*循环棋盘,记录两个王的位置*/
int rK[]=kKPosition(check);//[0]k行的位置,[1]k列的位置
//[2]K行的位置,[3]K列的位置
/*判断黑子k是否被将军*/
if(judgekChecked(check,rK[0],rK[1])){
System.out.println("black king is in check");
}
if(judgeKChecked(check,rK[2],rK[3])){
System.out.println("white king is in check");
}
}

private static boolean judgeKChecked(char[][] check, int i, int j) {
// TODO Auto-generated method stub
boolean white = false;
int x ;//记录行,列中较小值
/*		如果k的左上角或右上角有对手,且棋子为p或者b或者q 皆可将军*/
if(i-1>=0&&j-1>=0&&check[i-1][j-1]=='p'||i-1>=0&&j-1>=0&&check[i-1][j-1]=='b'||i-1>=0&&j-1>=0&&check[i-1][j-1]=='q'
||i-1>=0&&j+1<8&&check[i-1][j+1]=='p'||i-1>=0&&j+1<8&&check[i-1][j+1]=='b'||i-1>=0&&j+1<8&&check[i-1][j+1]=='q'){
white = true;
}
/*判断被马将的情况*/
if((i-2>=0&&j-1>=0&&check[i-2][j-1]=='n')||
(i-2>=0&&j+1<8&&check[i-2][j+1]=='n')||
(i+2<8&&j-1>=0&&check[i+2][j-1]=='n')||
(i+2<8&&j+1<8&&check[i+2][j+1]=='n')||
(i-1>=0&&j-2>=0&&check[i-1][j-2]=='n')||
(i-1>=0&&j+2<8&&check[i-1][j+2]=='n')||
(i+1<8&&j-2>=0&&check[i+1][j-2]=='n')||
(i+1<8&&j+2<8&&check[i+1][j+2]=='n')){
white = true;
}
/*判断k在周围的情况*/
if(i+1<8&&j+1<8&&check[i+1][j+1]=='k'||
j+1<8&&check[i][j+1]=='k'||
i-1>=0&&j+1<8&&check[i-1][j+1]=='k'||
i-1>=0&&check[i-1][j]=='k'||
i-1>=0&&j-1>=0&&check[i-1][j-1]=='k'||
i+1<8&&j-1>=0&&check[i+1][j-1]=='k'||
i+1<8&&check[i+1][j]=='k'||
j-1>=0&&check[i][j-1]=='k'){
white=true;
}
/*上线段上有对手,且棋子为r或者q*/
for(int a=i-1;a>=0;a--){
if(check[a][j]<'a'&&check[a][j]>'.'){ //如有阻碍则推出判断 .-46 A-65 a-97
break;
}else{
if(check[a][j]=='r'||check[a][j]=='q'){
white=true;
}
}
}
//下线段上有对手,且棋子为r或者q
for(int a=i+1;a<8;a++){
if((check[a][j]<'a'&&check[a][j]>'.')){ //如有阻碍则推出判断
break;
}else{
if(check[a][j]=='r'||check[a][j]=='q'){
white=true;
}
}
}
//右线段上有对手,且棋子为r或者q
for(int a=j+1;a<8;a++){
if((check[i][a]<'a'&&check[i][a]>'.')){ //如有阻碍则推出判断
break;
}else{
if(check[i][a]=='r'||check[i][a]=='q'){
white=true;
}
}
}
//左线段上有对手,且棋子为r或者q
for(int a=j-1;a>=0;a--){
if((check[i][a]<'a'&&check[i][a]>'.')){ //如有阻碍则推出判断
break;
}else{
if(check[i][a]=='r'||check[i][a]=='q'){
white=true;
}
}
}
//左上线段有对手,且棋子为b或者q
for(int a=1;a<((i<j)?i:j);a++){//循环取行,列中较小的一个,以免出界
if((check[i-a][j-a]<'a'&&check[i-a][j-a]>'.')){ //如有阻碍则推出判断
break;
}else{
if(check[i-a][j-a]=='b'||check[i-a][j-a]=='q'){
white=true;
}
}
}
//右上线段有对手,且棋子为b或者q
for(int a=1;a<=((i<8-j)?i:8-j);a++){//循环取行,列中较小的一个,以免出界
if((i-a>=0&&j+a<8&&check[i-a][j+a]<'a'&&check[i-a][j+a]>'.')){ //如有阻碍则推出判断
break;
}else{
if(i-a>=0&&j+a<8&&check[i-a][j+a]=='b'||i-a>=0&&j+a<8&&check[i-a][j+a]=='q'){
white=true;
}
}
}
//右下线段有对手,且棋子为b或者q
for(int a=1;a<((8-i<8-j)?8-i:8-j);a++){//循环取行,列中较小的一个,以免出界
if((check[i+a][j-a]<'a'&&check[i+a][j-a]>'.')){ //如有阻碍则推出判断
break;
}else{
if(check[i+a][j-a]=='b'||check[i+a][j-a]=='q'){
white=true;
}
}
}
//左下线段有对手,且棋子为b或者q
for(int a=1;a<((8-i<j)?8-i:j);a++){//循环取行,列中较小的一个,以免出界
if((i+a<8&&j-a>=0&&check[i+a][j-a]<'a')&&check[i+a][j-a]>'.'){ //如有阻碍则推出判断
break;
}else{
if(i+a<8&&j-a>=0&&check[i+a][j-a]=='b'||i+a<8&&j-a>=0&&check[i+a][j-a]=='q'){
white=true;
}
}
}
return white;
}

private static boolean judgekChecked(char[][] check, int i, int j) {
// TODO Auto-generated method stub
boolean black = false;
int x ;//记录行,列中较小值
/*如果k的左下角或右下角有对手,且棋子为P或者B或者Q 皆可将军*/
if(i+1<8&&j-1>=0&&check[i+1][j-1]=='P'||i+1<8&&j-1>=0&&check[i+1][j-1]=='B'||i+1<8&&j-1>=0&&check[i+1][j-1]=='Q'
||i+1<8&&j+1<8&&check[i+1][j+1]=='P'||i+1<8&&j+1<8&&check[i+1][j+1]=='B'||i+1<8&&j+1<8&&check[i+1][j+1]=='Q'){
black = true;
}
/*判断被马将的情况*/
if((i-2>=0&&j-1>=0&&check[i-2][j-1]=='N')||
(i-2>=0&&j+1<8&&check[i-2][j+1]=='N')||
(i+2<8&&j-1>=0&&check[i+2][j-1]=='N')||
(i+2<8&&j+1<8&&check[i+2][j+1]=='N')||
(i-1>=0&&j-2>=0&&check[i-1][j-2]=='N')||
(i-1>=0&&j+2<8&&check[i-1][j+2]=='N')||
(i+1<8&&j-2>=0&&check[i+1][j-2]=='N')||
(i+1<8&&j+2<8&&check[i+1][j+2]=='N')){
black = true;
}
/*判断K在周围的情况*/
if(i+1<8&&j+1<8&&check[i+1][j+1]=='K'||
j+1<8&&check[i][j+1]=='K'||
i-1>=0&&j+1<8&&check[i-1][j+1]=='K'||
i-1>=0&&check[i-1][j]=='K'||
i-1>=0&&j-1>=0&&check[i-1][j-1]=='K'||
i+1<8&&j-1>=0&&check[i+1][j-1]=='K'||
i+1<8&&check[i+1][j]=='K'||
j-1>=0&&check[i][j-1]=='K'){
black=true;
}
/*上线段上有对手,且棋子为R或者Q或者K*/
for(int a=i-1;a>=0;a--){
if(check[a][j]>'a'){ //如有阻碍则推出判断 .-46 A-65 a-97
break;
}else{
if(check[a][j]=='R'||check[a][j]=='Q'){
black=true;
}
}
}
//下线段上有对手,且棋子为R或者Q
for(int a=i+1;a<8;a++){
if((check[a][j]>'a')){ //如有阻碍则推出判断
break;
}else{
if(check[a][j]=='R'||check[a][j]=='Q'){
black=true;
}
}
}
//右线段上有对手,且棋子为R或者Q
for(int a=j+1;a<8;a++){
if((check[i][a]>'a')){ //如有阻碍则推出判断
break;
}else{
if(check[i][a]=='R'||check[i][a]=='Q'){
black=true;
}
}
}
//左线段上有对手,且棋子为R或者Q
for(int a=j-1;a>=0;a--){
if((check[i][a]>'a')){ //如有阻碍则推出判断
break;
}else{
if(check[i][a]=='R'||check[i][a]=='Q'){
black=true;
}
}
}
//左上线段有对手,且棋子为B或者Q
for(int a=1;a<((i<j)?i:j);a++){//循环取行,列中较小的一个,以免出界
if((check[i-a][j-a]>'a')){ //如有阻碍则推出判断
break;
}else{
if(check[i-a][j-a]=='B'||check[i-a][j-a]=='Q'){
black=true;
}
}
}
//右上线段有对手,且棋子为B或者Q
for(int a=1;a<=((i<8-j)?i:8-j);a++){//循环取行,列中较小的一个,以免出界
if((i-a>=0&&j+a<8&&check[i-a][j+a]>'a')){ //如有阻碍则推出判断
break;
}else{
if(i-a>=0&&j+a<8&&check[i-a][j+a]=='B'||i-a>=0&&j+a<8&&check[i-a][j+a]=='Q'){
black=true;
}
}
}
//右下线段有对手,且棋子为B或者Q
for(int a=1;a<((8-i<8-j)?8-i:8-j);a++){//循环取行,列中较小的一个,以免出界
if((check[i+a][j-a]>'a')){ //如有阻碍则推出判断
break;
}else{
if(check[i+a][j-a]=='B'||check[i+a][j-a]=='Q'){
black=true;
}
}
}
//左下线段有对手,且棋子为B或者Q
for(int a=1;a<((8-i<j)?8-i:j);a++){//循环取行,列中较小的一个,以免出界
if((i+a<8&&j-a>=0&&check[i+a][j-a]>'a')){ //如有阻碍则推出判断
break;
}else{
if(i+a<8&&j-a>=0&&check[i+a][j-a]=='B'||i+a<8&&j-a>=0&&check[i+a][j-a]=='Q'){
black=true;
}
}
}
return black;
}

public static int[] kKPosition(char[][] check){//用一维数组记录坐标 i,j每隔两位为一个坐标
int kingPosition[]=new int[4];
for(int i=0;i<check.length;i++){
for(int j=0;j<check[i].length;j++){
if(check[i][j]=='k'){
kingPosition[0]=i;
kingPosition[1]=j;
}else if(check[i][j]=='K'){
kingPosition[2]=i;
kingPosition[3]=j;
}
}
}
return kingPosition;
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: