import java.util.Arrays; import java.util.ArrayList; enum ChessPiece{ K(new int[][]{{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}}), N(new int[][]{{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1},{-1,2}}), R(new int[][]{{-1,0},{0,1},{1,0},{0,-1}}), Q(new int[][]{{-1,0},{0,1},{1,0},{0,-1},{-1,-1},{-1,1},{1,1},{1,-1}}), B(new int[][]{{-1,-1},{-1,1},{1,1},{1,-1}}), P(new int[][]{{-1,-1},{-1,+1}}); private int[][] moves; ChessPiece(int[][] moves){ this.moves=moves; } public int[][] getMoves(){ int [][] a=new int[this.moves.length][2]; for(int i=0;i enemiesInRange=new ArrayList<>(); if(isBlackKingInCheck()){ int row=-1,col=-1; int[][] a=ChessPiece.K.getMoves(); buidElab(); for(char[] c:elab) System.out.println(Arrays.toString(c)); for(int[] c:a){ row=blackKing[0]+c[0]; col=blackKing[1]+c[1]; if(row<0||row>7||col<0||col>7) continue; else if(elab[row][col]==EMPTY){ System.out.println("Solution found new king pos: "+((7-row)+1)+" "+(char)(65*(col+1))); return; } else if(elab[row][col]>64&&elab[row][col]<91){ enemiesInRange.add(row); enemiesInRange.add(col); } } if(enemiesInRange.size()==0){ System.out.println("Black king cannot move to get out of check");return; } while(enemiesInRange.size()>0){ char[][] b=new char[8][8]; ChessPuzzle n; for(int i=0;i7||newCol>7||newCol<0) continue; else if(elab[newRow][newCol]==EMPTY) elab[newRow][newCol]=INVALID; } } /*Recursive method called to mark invalid zones used for Q R B*/ private void recursiveCalcDangerZones(int index,int pieceRow,int pieceCol,ChessPiece cP){ /*first call*/ if(index<0){ int[][] a=cP.getMoves(); for(int i=0;i7||pieceCol<0||pieceCol>7) return; else if(elab[pieceRow][pieceCol]>64&&elab[pieceRow][pieceCol]<123&&elab[pieceRow][pieceCol]!='k') return; /*recursive steps*/ else if(elab[pieceRow][pieceCol]==INVALID||elab[pieceRow][pieceCol]=='k'){ int[] b=cP.getMoves()[index]; recursiveCalcDangerZones(index,pieceRow+b[0],pieceCol+b[1],cP); } else if(elab[pieceRow][pieceCol]==EMPTY) { int[] b=cP.getMoves()[index]; elab[pieceRow][pieceCol]=INVALID; recursiveCalcDangerZones(index,pieceRow+b[0],pieceCol+b[1],cP); } } /*Boolean methods used to verify if black king is in check*/ private boolean isBlackKingInCheck(){ boolean p=isPawnCheckingBlackKing(); boolean b=isBishopCheckingBlackKing(false); boolean r=isRookCheckingBlackKing(false); boolean n=isKnightCheckingBlackKing(); boolean q=isBishopCheckingBlackKing(true)||isRookCheckingBlackKing(true); return p||b||r||n||q; } private boolean isPawnCheckingBlackKing(){ if(blackKing[0]==7)return false; char case1=EMPTY,case2=EMPTY; if(blackKing[1]<7) case2=board[blackKing[0]+1][blackKing[1]+1]; if(blackKing[1]>0) case1=board[blackKing[0]+1][blackKing[1]-1]; return case1=='P'||case2=='P'; } private boolean isKnightCheckingBlackKing(){ int row,col; int[][] a=ChessPiece.N.getMoves(); for(int[] c:a){ row=blackKing[0]+c[0]; col=blackKing[1]+c[1]; if(row<0||row>7||col>7||col<0) continue; else if(board[row][col]=='N') return true; } return false; } private boolean isBishopCheckingBlackKing(boolean isQueen){ int d1_row,d1_col,d2_row,d2_col; String diag1,diag2; String piece=(isQueen)?"Q":"B"; String regex1=new StringBuilder(".*").append(piece).append("\\u002D*k.*").toString(); String regex2=new StringBuilder(".*k\\u002D*").append(piece).append(".*").toString(); StringBuilder d1=new StringBuilder(),d2=new StringBuilder(); if(blackKing[0]>=blackKing[1]){ d1_row=Math.abs(blackKing[0]-blackKing[1]); d1_col=0; d2_row=Math.abs((7-blackKing[0])-(7-blackKing[1]));; d2_col=7; } else{ d1_row=0; d1_col=Math.abs(blackKing[0]-blackKing[1]); d2_row=0; d2_col=Math.abs((7-blackKing[0])-(7-blackKing[1])); } while(d1_row<8&&d1_col<8){ d1.append(board[d1_row][d1_col]); d1_row++;d1_col++; } while(d2_row<8&&d2_col>-1){ d2.append(board[d2_row][d2_col]); d2_row++;d2_col--; } diag1=d1.toString(); diag2=d2.toString(); return diag1.matches(regex1)||diag1.matches(regex2)|| diag2.matches(regex1)||diag2.matches(regex2); } private boolean isRookCheckingBlackKing(boolean isQueen){ String row=new String(board[blackKing[0]]); String col; String piece=(isQueen)?"Q":"R"; String regex1=new StringBuilder(".*").append(piece).append("\\u002D*k.*").toString(); String regex2=new StringBuilder(".*k\\u002D*").append(piece).append(".*").toString(); StringBuilder buff=new StringBuilder(); for(int j=0;j<8;j++) buff.append(board[blackKing[0]][j]); col=buff.toString(); return row.matches(regex1)||row.matches(regex2)|| col.matches(regex1)||col.matches(regex2); } /*MAIN*/ public static void main(String[] args){ ChessPuzzle a=new ChessPuzzle("1r3kR1/4P3/6NB/8/8/Q7/8/4KR2"); a.solve(); } }