function move($x, $y)
 {
     parent::setPosX($x);
     parent::setPosY($y);
 }
 public function testaMove($peca, $tabuleiro)
 {
     $eat = false;
     $retorno = array();
     $melhorPref = MIN_PREF;
     $come = $tabuleiro->isComivel($peca);
     foreach ($come as $i => $chave) {
         $valor = MIN_PREF;
         $pref = MIN_PREF;
         $move = array();
         $direcao = $this->direcaoMove($i);
         $x = $direcao[0];
         $y = $direcao[1];
         //BUGADOOOO TCHOOOOW!!!!
         if ($peca->isDama() || $peca->canMove($x, $y)) {
             if ($chave === -1 || $chave === 0 && !$eat) {
                 $prefAux = MIN_PREF;
                 if ($chave === -1) {
                     $valor = -4;
                 } else {
                     $valor = 0;
                 }
                 for ($j = $peca->max_Move(); $j > 0; $j--) {
                     $moveAux = array($peca->getPosX() + $x * $j, $peca->getPosY() + $y * $j);
                     if (PecaAbstrata::isValidPosition($moveAux[0], $moveAux[1])) {
                         if ($tabuleiro->contemPeca($moveAux[0], $moveAux[1])) {
                             $testeAux = -100000000;
                         } else {
                             $testeAux = $this->testandoMove(new Peca($moveAux[0], $moveAux[1], $peca->getCor(), $peca->isDama()), $valor, array($move), $tabuleiro);
                         }
                         if ($prefAux < $testeAux) {
                             $move[0] = $moveAux[0];
                             $move[1] = $moveAux[1];
                             $prefAux = $testeAux;
                         }
                     }
                 }
                 $pref = $prefAux;
             } elseif (is_array($chave)) {
                 $move[0] = $chave[0];
                 $move[1] = $chave[1];
                 $valor = 3;
                 $eat = True;
                 if (PecaAbstrata::isValidPosition($move[0], $move[1])) {
                     $pref = $this->testandoMove(new Peca($move[0], $move[1], $peca->getCor(), $peca->isDama()), $valor, array($move), $tabuleiro);
                 }
             }
         }
         if ($pref > $melhorPref) {
             $melhorPref = $pref;
             $retorno = $move;
         }
     }
     return array($retorno, $melhorPref, $eat);
 }
 public function jogaPeca($prevX, $prevY, $aftX, $aftY)
 {
     //Testa a condicao de se o campo de antes possui uma peca dentro dele.
     if (!PecaAbstrata::isValidPosition($prevX, $prevY) || $this->getPeca($prevX, $prevY) == NULL) {
         throw new TabuleiroException("O campo de origem nao tem peca nenhuma.");
     }
     if (!PecaAbstrata::isValidPosition($aftX, $aftY) || $this->getPeca($aftX, $aftY) !== NULL) {
         throw new TabuleiroException("O campo de destino ja esta ocupado.");
     }
     $direcoes = $this->isComivel($this->getPeca($prevX, $prevY));
     /**
      * testa se a direcao do movimento � possivel , de acordo com a peca que tem que ser
      * comida
      */
     $hasMove = False;
     $condicao1 = is_array($direcoes[0]) && PecaAbstrata::isValidPosition($direcoes[0][0], $direcoes[0][1]);
     $condicao2 = is_array($direcoes[1]) && PecaAbstrata::isValidPosition($direcoes[1][0], $direcoes[1][1]);
     $condicao3 = is_array($direcoes[2]) && PecaAbstrata::isValidPosition($direcoes[2][0], $direcoes[2][1]);
     $condicao4 = is_array($direcoes[3]) && PecaAbstrata::isValidPosition($direcoes[3][0], $direcoes[3][1]);
     if ($condicao1 && !$hasMove) {
         if ($direcoes[0][0] == $aftX && $direcoes[0][1] == $aftY) {
             $hasMove = True;
             $this->movePeca($prevX, $prevY, $aftX, $aftY);
             $this->decrementaPecas($aftX - 1, $aftY - 1);
             $PecaMorta = $this->getPeca($aftX - 1, $aftY - 1);
             $this->delPeca($aftX - 1, $aftY - 1);
             unset($PecaMorta);
         }
     }
     if ($condicao2 && !$hasMove) {
         if ($direcoes[1][0] == $aftX && $direcoes[1][1] == $aftY) {
             $hasMove = True;
             $this->movePeca($prevX, $prevY, $aftX, $aftY);
             $this->decrementaPecas($aftX + 1, $aftY - 1);
             $PecaMorta = $this->getPeca($aftX + 1, $aftY - 1);
             $this->delPeca($aftX + 1, $aftY - 1);
             unset($PecaMorta);
         }
     }
     if ($condicao3 && !$hasMove) {
         if ($direcoes[2][0] == $aftX && $direcoes[2][1] == $aftY) {
             $hasMove = True;
             $this->movePeca($prevX, $prevY, $aftX, $aftY);
             $PecaMorta = $this->getPeca($aftX - 1, $aftY + 1);
             $this->decrementaPecas($aftX - 1, $aftY + 1);
             $this->delPeca($aftX - 1, $aftY + 1);
             unset($PecaMorta);
         }
     }
     if ($condicao4 && !$hasMove) {
         if ($direcoes[3][0] == $aftX && $direcoes[3][1] == $aftY) {
             $hasMove = True;
             $this->movePeca($prevX, $prevY, $aftX, $aftY);
             $this->decrementaPecas($aftX + 1, $aftY + 1);
             $PecaMorta = $this->getPeca($aftX + 1, $aftY + 1);
             $this->delPeca($aftX + 1, $aftY + 1);
             unset($PecaMorta);
         }
     }
     if (($condicao1 || $condicao2 || $condicao3 || $condicao4) && !$hasMove) {
         throw new Exception("Erro , Deve comer a peca");
     } elseif (!$hasMove) {
         // Testa se o movimento eh possivel pelo numero de casas movidas
         $direcao_move = diagonalMove($aftX - $prevX, $aftY - $prevY);
         if ($this->canMove($prevX, $prevY, $aftX, $aftY)) {
             //Testa se o movimento esta na direcao que a peca pode ir
             echo "WOWOWOWWO\n";
             if ($this->getPeca($prevX, $prevY)->getCor() == BLACK && $direcao_move[1] > 0 || $this->getPeca($prevX, $prevY)->isDama()) {
                 $this->movePeca($prevX, $prevY, $aftX, $aftY);
             } else {
                 if ($this->getPeca($prevX, $prevY)->getCor() == WHITE && $direcao_move[1] < 0 || $this->getPeca($prevX, $prevY)->isDama()) {
                     $this->movePeca($prevX, $prevY, $aftX, $aftY);
                 } else {
                     throw new Exception("Erro , Mova a peca apenas para frente");
                 }
             }
         } else {
             throw new Exception("Erro , Nao pode mover tantas casas");
         }
     }
 }