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"); } } }