/* * Verifica se o cavalo está dando cheque mate. */ private boolean cavaloDaChequeMate(Peca reiBranco) { Vector casasTemp = new Vector(); casasTemp.add(this.getCasa(reiBranco.getPosicaoX() - 1, reiBranco.getPosicaoY() - 2)); casasTemp.add(this.getCasa(reiBranco.getPosicaoX() + 1, reiBranco.getPosicaoY() - 2)); casasTemp.add(this.getCasa(reiBranco.getPosicaoX() - 2, reiBranco.getPosicaoY() + 1)); casasTemp.add(this.getCasa(reiBranco.getPosicaoX() - 2, reiBranco.getPosicaoY() - 1)); casasTemp.add(this.getCasa(reiBranco.getPosicaoX() + 2, reiBranco.getPosicaoY() + 1)); casasTemp.add(this.getCasa(reiBranco.getPosicaoX() + 2, reiBranco.getPosicaoY() - 1)); casasTemp.add(this.getCasa(reiBranco.getPosicaoX() - 1, reiBranco.getPosicaoY() + 2)); casasTemp.add(this.getCasa(reiBranco.getPosicaoX() + 1, reiBranco.getPosicaoY() + 2)); Iterator it = casasTemp.iterator(); Casa casaTemp; while (it.hasNext()) { casaTemp = (Casa) it.next(); if (reiBranco.getCor() == Color.WHITE) { if (casaTemp != null && casaTemp.getPeca() != null && (casaTemp.getPeca() instanceof CavaloPretoGUI)) { if (!((CasaGUI) casaTemp).isAtaqueBranco()) return true; } } else { if (casaTemp != null && casaTemp.getPeca() != null && (casaTemp.getPeca() instanceof CavaloBrancoGUI)) { if (!((CasaGUI) casaTemp).isAtaquePreto()) return true; } } } return false; }
/** Atualiza todas as casas que estão sendo atacadas pelas peças brancas. */ public void atualizaAtaqueBranco() { Casa casaTemp; for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { casaTemp = this.getCasa(x, y); if ((casaTemp.getPeca() != null) && (casaTemp.getPeca().getCor() == Color.WHITE)) casaTemp.getPeca().setCasasEmAtaque(this); } } }
/** @see com.darlan.xadrez.gui.AbstractPecaGUI#getCasasVisiveis(Tabuleiro) */ public Vector getCasasVisiveis(Tabuleiro tabuleiro) { super.casasVisiveis = new Vector(); // Verifica se pode mover para baixo Casa casaTemp = tabuleiro.getCasa(x, y + 1); if (casaTemp != null) { if (!casaTemp.temPeca()) { casasVisiveis.add(casaTemp); if ((y == 1) && (tabuleiro.getCasa(x, y + 2) != null) && !(tabuleiro.getCasa(x, y + 2).temPeca())) { casasVisiveis.add(tabuleiro.getCasa(x, y + 2)); } } } return casasVisiveis; }
/** @see com.darlan.xadrez.gui.AbstractPecaGUI#getCasasEmAtaque(Tabuleiro) */ public Vector getCasasEmAtaque(Tabuleiro tabuleiro) { super.casasEmAtaque = new Vector(); // Verifica se pode mover para baixo e para a esquerda Casa casaTemp = tabuleiro.getCasa(x - 1, y + 1); if (casaTemp != null) { if (casaTemp.temPeca(Color.WHITE)) casasEmAtaque.add(casaTemp); // verifica se é passante. else if (((CasaGUI) casaTemp).getPassante() && (casaTemp.getPeca() == null)) { casasEmAtaque.add(casaTemp); } } // Verifica se pode mover para baixo e para direita casaTemp = tabuleiro.getCasa(x + 1, y + 1); if (casaTemp != null) { if (casaTemp.temPeca(Color.WHITE)) casasEmAtaque.add(casaTemp); // verifica se é passante else if (((CasaGUI) casaTemp).getPassante() && (casaTemp.getPeca() == null)) { casasEmAtaque.add(casaTemp); } } return casasEmAtaque; }
/** @see com.darlan.xadrez.gui.AbstractPecaGUI#move(Casa, Casa, Tabuleiro) */ public void move(Casa casaOrigem, Casa casaDestino, Tabuleiro tabuleiro) throws PosicaoInvalidaException { Vector casasEmAtaqueTemp = this.getCasasEmAtaque(tabuleiro); Vector casasVisiveisTemp = this.getCasasVisiveis(tabuleiro); // Verifica se a casa destino está contida numas das possíveis casas de // movimento. if (casasEmAtaqueTemp.contains(casaDestino) || casasVisiveisTemp.contains(casaDestino)) { // verifica se o peão pulou uma casa na sua saída. Set a casa pulada // como passante. if ((casaDestino.getPosicaoY() - casaOrigem.getPosicaoY()) == 2) ((CasaGUI) tabuleiro.getCasa(x, y + 1)).setPassante(true); // verifica se pode fazer passante. if ((casaOrigem.getPosicaoY() == 4) && (casaDestino.getPassante())) { // pega a casa em que está o peão que sofrerá passante. Casa casaTemp = tabuleiro.getCasa(casaDestino.getPosicaoX(), casaDestino.getPosicaoY() - 1); // pega o peão que sofre passante. Peca pecaTemp = casaTemp.getPeca(); casaOrigem.removePeca(); // remove o peão que sofreu passante. casaTemp.removePeca(); casaDestino.setPeca(this); // atualiza o tabuleiro. TabuleiroGUI tabuleiroTemp = (TabuleiroGUI) tabuleiro; tabuleiroTemp.removeAllAtaques(); tabuleiroTemp.atualizaAtaqueBranco(); tabuleiroTemp.atualizaAtaquePreto(); // verifica se o movimento que fiz causou reque mate no // adversário. if (tabuleiroTemp.isChequeMateBranco()) { ((TabuleiroGUI) tabuleiro).mensagemFimJogo("Cheque Mate! Preto Vence!"); // verifica se o movimento que fiz deixou o meu rei em cheque. } else if (tabuleiroTemp.isChequePreto()) { // volta ao estado anterior. casaTemp.setPeca(pecaTemp); casaDestino.removePeca(); casaOrigem.setPeca(this); // atualiza tabuleiro tabuleiroTemp.removeAllAtaques(); tabuleiroTemp.atualizaAtaqueBranco(); tabuleiroTemp.atualizaAtaquePreto(); throw new PosicaoInvalidaException("Em xeque possição inválida"); } // VERIFICA SE VAI SER PROMOVIDO. } else if (casaDestino.getPosicaoY() == 7) { Peca pecaTemp = casaDestino.getPeca(); casaOrigem.removePeca(); casaDestino.removePeca(); casaDestino.setPeca(this); casaDestino.removePeca(); casaDestino.setPeca(getPromocao()); TabuleiroGUI tabuleiroTemp = (TabuleiroGUI) tabuleiro; tabuleiroTemp.removeAllAtaques(); tabuleiroTemp.atualizaAtaqueBranco(); tabuleiroTemp.atualizaAtaquePreto(); // verifica se as peças brancas venceram o jogo if (tabuleiroTemp.isChequeMateBranco()) { ((TabuleiroGUI) tabuleiro).mensagemFimJogo("Cheque Mate! Preto Vence!"); // se o movimento que fiz deixou meu rei em xeque. } else if (tabuleiroTemp.isChequePreto()) { // volta ao estado anterior casaOrigem.setPeca(this); casaDestino.removePeca(); casaDestino.setPeca(pecaTemp); tabuleiroTemp.removeAllAtaques(); tabuleiroTemp.atualizaAtaqueBranco(); tabuleiroTemp.atualizaAtaquePreto(); throw new PosicaoInvalidaException("Em xeque possição inválida"); } // MOVE PEÇA } else { Peca pecaTemp = casaDestino.getPeca(); casaOrigem.removePeca(); casaDestino.removePeca(); casaDestino.setPeca(this); TabuleiroGUI tabuleiroTemp = (TabuleiroGUI) tabuleiro; tabuleiroTemp.removeAllAtaques(); tabuleiroTemp.atualizaAtaqueBranco(); tabuleiroTemp.atualizaAtaquePreto(); if (tabuleiroTemp.isChequeMateBranco()) { ((TabuleiroGUI) tabuleiro).mensagemFimJogo("Cheque Mate! Preto Vence!"); // se o movimento que fiz deixou o meu rei em exque. } else if (tabuleiroTemp.isChequePreto()) { // volta ao estado anterior casaOrigem.setPeca(this); casaDestino.removePeca(); casaDestino.setPeca(pecaTemp); tabuleiroTemp.removeAllAtaques(); tabuleiroTemp.atualizaAtaqueBranco(); tabuleiroTemp.atualizaAtaquePreto(); throw new PosicaoInvalidaException("Em xeque possição inválida"); } } movePassante(tabuleiro); } else throw new PosicaoInvalidaException("Posicao invalida"); }
/** @see com.darlan.xadrez.gui.AbstractPecaGUI#setCasasEmAtaque(Tabuleiro) */ public void setCasasEmAtaque(Tabuleiro tabuleiro) { Casa casaTemp = tabuleiro.getCasa(x - 1, y + 1); if (casaTemp != null && casaTemp.temPeca()) ((CasaGUI) casaTemp).setAtaquePreto(true); casaTemp = tabuleiro.getCasa(x + 1, y + 1); if (casaTemp != null && casaTemp.temPeca()) ((CasaGUI) casaTemp).setAtaquePreto(true); }