Sunday, March 06, 2011

110107 Jaque al jaque

import java.util.*;

/**
* 110107 - Jaque al jaque
*
* @author BreakDark
* @version 1.2 beta
*/
public class Main {
static char[][] Tab = new char[10][10]; // para el tablero de ajedrez

public static void main(String[] args) {
int d = 1; // número de configuraciones
String linea; // para leer una linea
Scanner Lee; // para leer los datos
int i, j; // los índices de la matriz
boolean sw; // par controlar que no haya un tablero vacio

// AQUI EMPIEZA EL PROGRAMA
Lee = new Scanner(System.in);
// leemos la entrada
do{
sw = true;
for(i = 0; i < 8; i++){
linea = Lee.nextLine();
for(j = 0; j < 8; j++){
Main.Tab[i][j] = linea.charAt(j);
if(Main.Tab[i][j] != '.')
sw = false;
}
}
if(!sw){
linea = Lee.nextLine(); // lee una linea en blanco
if(Main.evaluar('p', 'n', 'b', 'r', 'q', 'K'))
System.out.println("Game #" + d + ": white king is in check.");
else
if(Main.evaluar('P', 'N', 'B', 'R', 'Q', 'k'))
System.out.println("Game #" + d + ": black king is in check.");
else
System.out.println("Game #" + d + ": no king is in check.");
d++;
}
} while(!sw);
}

/**
* Método que evalua el tablero Retorna verdad si hay jaque. donde:
* evaluar(peon, caballo, alfil, torre, dama, rey);
*/
static boolean evaluar(char peon, char caballo, char alfil, char torre, char dama, char rey) {
int i, j; // los índices de la matriz
int k, l; // otros indices auxiliares
boolean sw; // para ver si se produce el jaque
boolean aux; // un auxiliar para no repetir procesos
// buscamos al rey
sw = false;
for(i = 0; i < 8; i++)
for(j = 0; j < 8; j++){
if(Main.Tab[i][j] == rey){
// pregunto si es atacado por un peon
if(rey == 'k'){
k=i+1;
if(k < 8){
l=j-1;
if((l >= 0) && (Main.Tab[k][l] == peon))
sw = true;
l=j+1;
if((l < 8) && (Main.Tab[k][l] == peon)&&!sw)
sw = true;
}
}
else{
k=i-1;
if(k >= 0){
l=j-1;
if((l > 0) && (Main.Tab[k][l] == peon))
sw = true;
l=j+1;
if((l < 8) && (Main.Tab[k][l] == peon)&&!sw)
sw = true;
}
}
if(!sw){
// pregunto si es atacado por una torre o una reina
// hacia el norte
k = i - 1;
aux = true;
while((k >= 0) && (aux)){
if(Main.Tab[k][j] != '.'){
if((Main.Tab[k][j] == torre) || (Main.Tab[k][j] == dama))
sw = true;
aux = false;
}
k--;
}
}
if(!sw){
// hacia el sur
k = i + 1;
aux = true;
while((k < 8) && (aux)){
if(Main.Tab[k][j] != '.'){
if((Main.Tab[k][j] == torre) || (Main.Tab[k][j] == dama))
sw = true;
aux = false;
}
k++;
}
}
if(!sw){
// hacia el oeste
k = j - 1;
aux = true;
while((k >= 0) && (aux)){
if(Main.Tab[i][k] != '.'){
if((Main.Tab[i][k] == torre) || (Main.Tab[i][k] == dama))
sw = true;
aux=false;
}
k--;
}
}
if(!sw){
// hacia el este
k = j + 1;
aux = true;
while((k < 8) && (aux)){
if(Main.Tab[i][k] != '.'){
if((Main.Tab[i][k] == torre) || (Main.Tab[i][k] == dama))
sw = true;
aux=false;
}
k++;
}
}
if(!sw){
// pregunto si es atacado por una alfil o una reina
// hacia el noroeste
k = i - 1;
l = j - 1;
aux = true;
while((k >= 0) && (l >= 0) && (aux)){
if(Main.Tab[k][l] != '.'){
if((Main.Tab[k][l] == alfil) || (Main.Tab[k][l] == dama))
sw = true;
aux=false;
}
k--;
l--;
}
}
if(!sw){
// hacia el noreste
k = i - 1;
l = j + 1;
aux = true;
while((k >= 0) && (l < 8) && (aux)){
if(Main.Tab[k][l] != '.'){
if((Main.Tab[k][l] == alfil) || (Main.Tab[k][l] == dama))
sw = true;
aux = false;
}
k--;
l++;
}
}
if(!sw){
// hacia el sudoeste
k = i + 1;
l = j - 1;
aux = true;
while((k <>= 0) && (aux)){
if(Main.Tab[k][l] != '.'){
if((Main.Tab[k][l] == alfil) || (Main.Tab[k][l] == dama))
sw = true;
aux = false;
}
k++;
l--;
}
}
if(!sw){
// hacia el sudeste
k = i + 1;
l = j + 1;
aux = true;
while((k < 8) && (l < 8) && (aux)){
if(Main.Tab[k][l] != '.'){
if((Main.Tab[k][l] == alfil) || (Main.Tab[k][l] == dama))
sw = true;
aux = false;
}
k++;
l++;
}
}
if(!sw){
// busco amenaza de algun caballo
// por arriba
k = i - 2;
if(k >= 0){
l = j - 1;
if(l >= 0)
if(Main.Tab[k][l] == caballo)
sw = true;
l=j+1;
if((l < 8) && !sw)
if(Main.Tab[k][l] == caballo)
sw = true;
}
k=i-1;
if((k >= 0)&&!sw){
l = j -2;
if(l >= 0)
if(Main.Tab[k][l] == caballo)
sw = true;
l=j+2;
if((l < 8) && !sw)
if(Main.Tab[k][l] == caballo)
sw = true;
}
// por abajo
k=i+2;
if((k <8)&&!sw){
l = j -1;
if(l >= 0)
if(Main.Tab[k][l] == caballo)
sw = true;
l=j+1;
if((l < 8) && !sw)
if(Main.Tab[k][l] == caballo)
sw = true;
}
k=i+1;
if((k <8)&&!sw){
l = j -2;
if(l >= 0)
if(Main.Tab[k][l] == caballo)
sw = true;
l=j+2;
if((l < 8) && !sw)
if(Main.Tab[k][l] == caballo)
sw = true;
}
}
}
}
return sw;
}
}

No comments: