/** * Verifica se o rei preto sofreu cheque mate. * * @return <code>true</code> o rei preto sofreu cheque mate. */ public boolean isChequeMatePreto() { ReiPretoGUI reiPreto = null; CasaGUI casaDoReiTemp = null; CasaGUI casaDoRei = null; // Pega o rei branco no tabuleiro. for (int x = 0; x < 8; x++) for (int y = 0; y < 8; y++) { casaDoReiTemp = (CasaGUI) this.getCasa(x, y); if ((casaDoReiTemp.getPeca() instanceof ReiPretoGUI)) { casaDoRei = casaDoReiTemp; reiPreto = (ReiPretoGUI) casaDoRei.getPeca(); } } // verifica se o rei está sendo atacado if (casaDoRei.isAtaqueBranco()) { // se o rei não pode mover-se if (reiPreto.getCasasEmAtaque(this).size() == 0) { // Veririca se o cavalo adversário dá cheque mate. if (this.cavaloDaChequeMate(reiPreto)) { return true; } Vector pecasQueAtacam = this.pecasQueAtacamRei(reiPreto); // Verifica se mais de uma peça está atacando o rei. if (pecasQueAtacam.size() >= 2) { return true; } else { Peca peca = (Peca) pecasQueAtacam.get(0); CasaGUI casaTemp = (CasaGUI) this.getCasa(peca.getPosicaoX(), peca.getPosicaoY()); // verifica se a peça que está atacando o rei também está // sendo atacada. if (casaTemp.isAtaquePreto()) return false; // verifica se uma peça branca impede que a peça preta der // cheque mate. if (pecaPretaImpedeCheque((Peca) pecasQueAtacam.get(0), reiPreto)) { return false; } else { return true; } } // fim else } // fim do if(reiBranco.getCasasEmAtaque(this).size()==0) } return false; }
/** * Verifica se uma peça preta impede o cheque mate no seu rei. * * @param pecaAdversaria * @param reiPreto * @return boolean */ private boolean pecaPretaImpedeCheque(Peca pecaAdversaria, ReiPretoGUI reiPreto) { int xRei = reiPreto.getPosicaoX(); int yRei = reiPreto.getPosicaoY(); if (pecaAdversaria.getPosicaoX() < xRei && pecaAdversaria.getPosicaoY() < yRei) { xRei--; yRei--; while (pecaAdversaria.getPosicaoX() < xRei) { if (((CasaGUI) getCasa(xRei, yRei)).isAtaquePreto()) { return true; } xRei--; yRei--; } } else if ((pecaAdversaria.getPosicaoX() < xRei) && pecaAdversaria.getPosicaoY() == yRei) { xRei--; while (pecaAdversaria.getPosicaoX() < xRei) { if (((CasaGUI) getCasa(xRei, yRei)).isAtaquePreto()) { return true; } xRei--; } } else if ((pecaAdversaria.getPosicaoX() < xRei) && pecaAdversaria.getPosicaoY() > yRei) { xRei--; yRei++; while (pecaAdversaria.getPosicaoX() < xRei) { if (((CasaGUI) getCasa(xRei, yRei)).isAtaquePreto()) { return true; } xRei--; yRei++; } } else if ((pecaAdversaria.getPosicaoX() == xRei) && (pecaAdversaria.getPosicaoY() > yRei)) { yRei++; while (pecaAdversaria.getPosicaoY() > yRei) { if (((CasaGUI) getCasa(xRei, yRei)).isAtaquePreto()) { return true; } yRei++; } } else if ((pecaAdversaria.getPosicaoX() > xRei) && (pecaAdversaria.getPosicaoY() > yRei)) { xRei++; yRei++; while (pecaAdversaria.getPosicaoX() > xRei) { if (((CasaGUI) getCasa(xRei, yRei)).isAtaquePreto()) { return true; } xRei++; yRei++; } } else if ((pecaAdversaria.getPosicaoX() > xRei) && (pecaAdversaria.getPosicaoY() == yRei)) { xRei++; while (pecaAdversaria.getPosicaoX() > xRei) { if (((CasaGUI) getCasa(xRei, yRei)).isAtaquePreto()) { return true; } xRei++; } } else if ((pecaAdversaria.getPosicaoX() > xRei) && (pecaAdversaria.getPosicaoY() < yRei)) { xRei++; yRei--; while (pecaAdversaria.getPosicaoX() > xRei) { if (((CasaGUI) getCasa(xRei, yRei)).isAtaquePreto()) { return true; } xRei++; yRei--; } } else if ((pecaAdversaria.getPosicaoX() == xRei) && (pecaAdversaria.getPosicaoY() < yRei)) { yRei--; while (pecaAdversaria.getPosicaoY() < yRei) { if (((CasaGUI) getCasa(xRei, yRei)).isAtaquePreto()) { return true; } yRei--; } } return false; }