/// <summary> /// Verifica se o movimento é permitido. /// </summary> /// <param name="origem">Posição de origem</param> /// <param name="destino">Posição de destino</param> public void ValidarPosicaoDeDestino(Posicao origem, Posicao destino) { if (!Tabuleiro.GetPeca(origem).PodeMoverPara(destino)) { throw new TabuleiroException("Posição de destino inválida!"); } }
public override bool[,] MovimentosPossiveis() { bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao tempPosicao = new Posicao(Posicao.Linha, Posicao.Coluna); // N tempPosicao.SetPosicao(Posicao.Linha - 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(tempPosicao) && PodeMover(tempPosicao)) { matriz[tempPosicao.Linha, tempPosicao.Coluna] = true; if (Tabuleiro.GetPeca(tempPosicao) != null && Tabuleiro.GetPeca(tempPosicao).Cor != Cor) { break; } tempPosicao.Linha--; } // S tempPosicao.SetPosicao(Posicao.Linha + 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(tempPosicao) && PodeMover(tempPosicao)) { matriz[tempPosicao.Linha, tempPosicao.Coluna] = true; if (Tabuleiro.GetPeca(tempPosicao) != null && Tabuleiro.GetPeca(tempPosicao).Cor != Cor) { break; } tempPosicao.Linha++; } //E tempPosicao.SetPosicao(Posicao.Linha, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(tempPosicao) && PodeMover(tempPosicao)) { matriz[tempPosicao.Linha, tempPosicao.Coluna] = true; if (Tabuleiro.GetPeca(tempPosicao) != null && Tabuleiro.GetPeca(tempPosicao).Cor != Cor) { break; } tempPosicao.Coluna++; } // W tempPosicao.SetPosicao(Posicao.Linha, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(tempPosicao) && PodeMover(tempPosicao)) { matriz[tempPosicao.Linha, tempPosicao.Coluna] = true; if (Tabuleiro.GetPeca(tempPosicao) != null && Tabuleiro.GetPeca(tempPosicao).Cor != Cor) { break; } tempPosicao.Coluna--; } return(matriz); }
/// <summary> /// Retorna os movimentos que a torre pode realizar no contexto atual /// </summary> /// <returns></returns> public override bool[,] GetMovimentosPossiveis() { bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; // A torre pode avançar para as direções norte, leste, sul e oeste, // então defino pontos de início para cada uma dessas direções. List <Posicao> posicoes = new List <Posicao>() { new Posicao(Posicao.Linha - 1, Posicao.Coluna), // 0 => Norte new Posicao(Posicao.Linha, Posicao.Coluna + 1), // 1 => Leste new Posicao(Posicao.Linha + 1, Posicao.Coluna), // 2 => Sul new Posicao(Posicao.Linha, Posicao.Coluna - 1), // 3 => Oeste }; // Avança em cada direção até não ser mais possível foreach (var posicao in posicoes) { while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; // Caso a torre encontre uma peça adversária if (Tabuleiro.GetPeca(posicao) != null && Tabuleiro.GetPeca(posicao).Cor != Cor) { break; } switch (posicoes.IndexOf(posicao)) { case 0: posicao.Linha--; break; case 1: posicao.Coluna++; break; case 2: posicao.Linha++; break; case 3: posicao.Coluna--; break; default: break; } } } return(matriz); }
public override bool[,] MovimentosPossiveis() { bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao posicao = new Posicao(0, 0); // NW posicao.SetPosicao(Posicao.Linha - 1, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; if (Tabuleiro.GetPeca(posicao) != null && Tabuleiro.GetPeca(posicao).Cor != Cor) { break; } posicao.SetPosicao(posicao.Linha - 1, posicao.Coluna - 1); } // NE posicao.SetPosicao(Posicao.Linha - 1, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; if (Tabuleiro.GetPeca(posicao) != null && Tabuleiro.GetPeca(posicao).Cor != Cor) { break; } posicao.SetPosicao(posicao.Linha - 1, posicao.Coluna + 1); } // SE posicao.SetPosicao(Posicao.Linha + 1, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; if (Tabuleiro.GetPeca(posicao) != null && Tabuleiro.GetPeca(posicao).Cor != Cor) { break; } posicao.SetPosicao(posicao.Linha + 1, posicao.Coluna + 1); } // SW posicao.SetPosicao(Posicao.Linha + 1, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; if (Tabuleiro.GetPeca(posicao) != null && Tabuleiro.GetPeca(posicao).Cor != Cor) { break; } posicao.SetPosicao(posicao.Linha + 1, posicao.Coluna - 1); } return(matriz); }
public void ValidarPosicaoOrigem(Posicao posicao) { if (Tabuleiro.GetPeca(posicao) == null) { throw new TabuleiroException("Não existe peça na posição de origem escolhida!"); } if (JogadorAtual != Tabuleiro.GetPeca(posicao).Cor) { throw new TabuleiroException("A peça de origem escolhida não é sua!"); } if (!Tabuleiro.GetPeca(posicao).ExisteMovimentoPossivel()) { throw new TabuleiroException("Não há movimentos possíveis para a peça escolhida!"); } }
/// <summary> /// Verifica se a posição informada como origem é válida. /// </summary> /// <param name="posicao">Posição de origem</param> public void ValidarPosicaoDeOrigem(Posicao posicao) { var pecaDeOrigem = Tabuleiro.GetPeca(posicao); if (pecaDeOrigem == null) { throw new TabuleiroException("Não há nenhuma peça na posição informada."); } if (JogadorAtual != pecaDeOrigem.Cor) { throw new TabuleiroException("Atenção: Não é a vez da peça informada."); } if (!pecaDeOrigem.ExisteMovimentosPossiveis()) { throw new TabuleiroException("Não há movimentos possíveis para a peça informada."); } }
public void RealizaJogada(Posicao origem, Posicao destino) { Peca pecaCapturada = ExecutarMovimento(origem, destino); Peca temPeca = Tabuleiro.GetPeca(destino); if (EstaEmXeque(JogadorAtual)) { DesfazerMovimento(origem, destino, pecaCapturada); throw new TabuleiroException("\nPara de pensar com a bunda!!\nVocê não pode se colocar em Xeque!!"); } // #jogadaespecial promocao if (temPeca is Peao) { if ((temPeca.Cor == Cor.branca && destino.Linha == 0) || (temPeca.Cor == Cor.preta && destino.Linha == 7)) { temPeca = Tabuleiro.RetirarPeca(destino); Pecas.Remove(temPeca); Peca dama = new Queen(temPeca.Cor, Tabuleiro); Tabuleiro.InserirPeca(dama, destino); Pecas.Add(dama); } } Xeque = (EstaEmXeque(Adversario(JogadorAtual))) ? true : false; if (XequeMate(Adversario(JogadorAtual))) { Terminada = true; } else { Turno++; TrocaJogador(); } // #jogadaespecial en passant VulneravelEnPassant = (temPeca is Peao && (destino.Linha == origem.Linha - 2 || destino.Linha == origem.Linha + 2)) ? temPeca : null; }
public override bool[,] MovimentosPossiveis() { bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao tempPosicao = new Posicao(Posicao.Linha, Posicao.Coluna); // N tempPosicao.SetPosicao(Posicao.Linha - 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(tempPosicao) && PodeMover(tempPosicao)) { matriz[tempPosicao.Linha, tempPosicao.Coluna] = true; } // NE tempPosicao.SetPosicao(Posicao.Linha - 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(tempPosicao) && PodeMover(tempPosicao)) { matriz[tempPosicao.Linha, tempPosicao.Coluna] = true; } // E tempPosicao.SetPosicao(Posicao.Linha, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(tempPosicao) && PodeMover(tempPosicao)) { matriz[tempPosicao.Linha, tempPosicao.Coluna] = true; } // SE tempPosicao.SetPosicao(Posicao.Linha + 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(tempPosicao) && PodeMover(tempPosicao)) { matriz[tempPosicao.Linha, tempPosicao.Coluna] = true; } // S tempPosicao.SetPosicao(Posicao.Linha + 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(tempPosicao) && PodeMover(tempPosicao)) { matriz[tempPosicao.Linha, tempPosicao.Coluna] = true; } // SW tempPosicao.SetPosicao(Posicao.Linha + 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(tempPosicao) && PodeMover(tempPosicao)) { matriz[tempPosicao.Linha, tempPosicao.Coluna] = true; } // W tempPosicao.SetPosicao(Posicao.Linha, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(tempPosicao) && PodeMover(tempPosicao)) { matriz[tempPosicao.Linha, tempPosicao.Coluna] = true; } // NW tempPosicao.SetPosicao(Posicao.Linha - 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(tempPosicao) && PodeMover(tempPosicao)) { matriz[tempPosicao.Linha, tempPosicao.Coluna] = true; } // #JogadaEspecial Roque if (QtdMovimentos == 0 && !partida.Xeque) { // #JogadaEspecial Roque Pequeno Posicao posTorre1 = new Posicao(Posicao.Linha, Posicao.Coluna + 3); if (TestarRoque(posTorre1)) { Posicao tempPos1 = new Posicao(Posicao.Linha, Posicao.Coluna + 1); Posicao tempPos2 = new Posicao(Posicao.Linha, Posicao.Coluna + 2); if (Tabuleiro.GetPeca(tempPos1) == null && Tabuleiro.GetPeca(tempPos2) == null) { matriz[Posicao.Linha, Posicao.Coluna + 2] = true; } } // #JogadaEspecial Roque Grande Posicao posTorre2 = new Posicao(Posicao.Linha, Posicao.Coluna - 4); if (TestarRoque(posTorre2)) { Posicao tempPos1 = new Posicao(Posicao.Linha, Posicao.Coluna - 1); Posicao tempPos2 = new Posicao(Posicao.Linha, Posicao.Coluna - 2); Posicao tempPos3 = new Posicao(Posicao.Linha, Posicao.Coluna - 3); if (Tabuleiro.GetPeca(tempPos1) == null && Tabuleiro.GetPeca(tempPos2) == null && Tabuleiro.GetPeca(tempPos3) == null) { matriz[Posicao.Linha, Posicao.Coluna - 2] = true; } } } return(matriz); }
private bool TestarRoque(Posicao pos) { Peca peca = Tabuleiro.GetPeca(pos); return(peca != null && peca is Torre && peca.Cor == Cor && peca.QtdMovimentos == 0); }
public override bool[,] MovimentosPossiveis() { bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao tempPos = new Posicao(0, 0); if (Cor == Cor.branca) { tempPos.SetPosicao(Posicao.Linha - 2, Posicao.Coluna); if (Tabuleiro.PosicaoValida(tempPos) && Livre(tempPos) && Livre(new Posicao(tempPos.Linha + 1, tempPos.Coluna)) && QtdMovimentos == 0) { matriz[tempPos.Linha, tempPos.Coluna] = true; } tempPos.SetPosicao(Posicao.Linha - 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(tempPos) && Livre(tempPos)) { matriz[tempPos.Linha, tempPos.Coluna] = true; } tempPos.SetPosicao(Posicao.Linha - 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(tempPos) && ExisteInimigo(tempPos)) { matriz[tempPos.Linha, tempPos.Coluna] = true; } tempPos.SetPosicao(Posicao.Linha - 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(tempPos) && ExisteInimigo(tempPos)) { matriz[tempPos.Linha, tempPos.Coluna] = true; } // #jogadaespecial en passant if (Posicao.Linha == 3) { tempPos.SetPosicao(Posicao.Linha, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(tempPos) && ExisteInimigo(tempPos) && Tabuleiro.GetPeca(tempPos) == partida.VulneravelEnPassant) { matriz[tempPos.Linha - 1, tempPos.Coluna] = true; } tempPos.SetPosicao(Posicao.Linha, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(tempPos) && ExisteInimigo(tempPos) && Tabuleiro.GetPeca(tempPos) == partida.VulneravelEnPassant) { matriz[tempPos.Linha - 1, tempPos.Coluna] = true; } } } else { tempPos.SetPosicao(Posicao.Linha + 2, Posicao.Coluna); if (Tabuleiro.PosicaoValida(tempPos) && Livre(tempPos) && Livre(new Posicao(tempPos.Linha - 1, tempPos.Coluna)) && QtdMovimentos == 0) { matriz[tempPos.Linha, tempPos.Coluna] = true; } tempPos.SetPosicao(Posicao.Linha + 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(tempPos) && Livre(tempPos)) { matriz[tempPos.Linha, tempPos.Coluna] = true; } tempPos.SetPosicao(Posicao.Linha + 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(tempPos) && ExisteInimigo(tempPos)) { matriz[tempPos.Linha, tempPos.Coluna] = true; } tempPos.SetPosicao(Posicao.Linha + 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(tempPos) && ExisteInimigo(tempPos)) { matriz[tempPos.Linha, tempPos.Coluna] = true; } // #jogadaespecial en passant if (Posicao.Linha == 4) { tempPos.SetPosicao(Posicao.Linha, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(tempPos) && ExisteInimigo(tempPos) && Tabuleiro.GetPeca(tempPos) == partida.VulneravelEnPassant) { matriz[tempPos.Linha + 1, tempPos.Coluna] = true; } tempPos.SetPosicao(Posicao.Linha, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(tempPos) && ExisteInimigo(tempPos) && Tabuleiro.GetPeca(tempPos) == partida.VulneravelEnPassant) { matriz[tempPos.Linha + 1, tempPos.Coluna] = true; } } } return(matriz); }
private bool Livre(Posicao posicao) { return(Tabuleiro.GetPeca(posicao) == null); }
private bool ExisteInimigo(Posicao posicao) { Peca peca = Tabuleiro.GetPeca(posicao); return(peca != null && peca.Cor != Cor); }
public override bool[,] MovimentosPossiveis() { bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao pos = new Posicao(0, 0); /* * (N) * nw | ne * (W)---|---(E) * sw | se * (S) */ //posicao N pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matriz[pos.Linha, pos.Coluna] = true; if (Tabuleiro.GetPeca(pos) != null && Tabuleiro.GetPeca(pos).Cor != Cor) { break; } pos.Linha = pos.Linha - 1; } //posicao S pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matriz[pos.Linha, pos.Coluna] = true; if (Tabuleiro.GetPeca(pos) != null && Tabuleiro.GetPeca(pos).Cor != Cor) { break; } pos.Linha = pos.Linha + 1; } //posicao E pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matriz[pos.Linha, pos.Coluna] = true; if (Tabuleiro.GetPeca(pos) != null && Tabuleiro.GetPeca(pos).Cor != Cor) { break; } pos.Coluna = pos.Coluna + 1; } //posicao W pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matriz[pos.Linha, pos.Coluna] = true; if (Tabuleiro.GetPeca(pos) != null && Tabuleiro.GetPeca(pos).Cor != Cor) { break; } pos.Coluna = pos.Coluna - 1; } return(matriz); }
private bool PodeMover(Posicao posicao) { Peca p = Tabuleiro.GetPeca(posicao); return(p == null || p.Cor != Cor); }