/*
  * 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);
 }