// Metodo para verificar os possiveis movimentos do Peão Branco e Preto public override bool[,] MovimentosPossiveis() { bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; // Criar uma matriz de linhas e colunas igual ao do tabuleiro especificado Posicao posicao = new Posicao(0, 0); if (Cor == Cor.Branca) { posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); // Peça branca só anda para cima if (Tabuleiro.TestarPosicao(posicao) && Livre(posicao)) // Se a posição está ok e está livre { matriz[posicao.Linha, posicao.Coluna] = true; if (QtdMovimentos == 0) { posicao.DefinirValores(Posicao.Linha - 2, Posicao.Coluna); if (Tabuleiro.TestarPosicao(posicao) && Livre(posicao)) // Se a posição está ok e está livre e se for o primeiro movimento do peão { matriz[posicao.Linha, posicao.Coluna] = true; } } } // Verificar o lado superior esquerdo se existe inimigo posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); if (Tabuleiro.TestarPosicao(posicao) && ExisteInimigo(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; } // Verificar o lado superior direito se existe inimigo posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); if (Tabuleiro.TestarPosicao(posicao) && ExisteInimigo(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; } // En Passant if (Posicao.Linha == 3) // o en passant da branca só acontece na linha 3, contando de cima para baixo { Posicao posicaoEsquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1); if (Tabuleiro.TestarPosicao(posicaoEsquerda) && ExisteInimigo(posicaoEsquerda) && Tabuleiro.Peca(posicaoEsquerda) == Partida.VulneravelEnPassant) // Testa se a posição é valida, se tem um inimigo la e se a peca é a peca que está vulneravel, no caso somente o peao pode ficar vulneravel { matriz[posicaoEsquerda.Linha - 1, posicaoEsquerda.Coluna] = true; } Posicao posicaoDireita = new Posicao(posicao.Linha, posicao.Coluna + 1); if (Tabuleiro.TestarPosicao(posicaoDireita) && ExisteInimigo(posicaoDireita) && Tabuleiro.Peca(posicaoDireita) == Partida.VulneravelEnPassant) // Testa se a posição é valida, se tem um inimigo la e se a peca é a peca que está vulneravel, no caso somente o peao pode ficar vulneravel { matriz[posicaoDireita.Linha - 1, posicaoDireita.Coluna] = true; } } } else { posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); // Peça branca só anda para baixo if (Tabuleiro.TestarPosicao(posicao) && Livre(posicao)) // Se a posição está ok e está livre { matriz[posicao.Linha, posicao.Coluna] = true; if (QtdMovimentos == 0) { posicao.DefinirValores(Posicao.Linha + 2, Posicao.Coluna); if (Tabuleiro.TestarPosicao(posicao) && Livre(posicao)) // Se a posição está ok e está livre e se for o primeiro movimento do peão { matriz[posicao.Linha, posicao.Coluna] = true; } } } // Verificar o lado superior esquerdo se existe inimigo posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); if (Tabuleiro.TestarPosicao(posicao) && ExisteInimigo(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; } // Verificar o lado superior direito se existe inimigo posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); if (Tabuleiro.TestarPosicao(posicao) && ExisteInimigo(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; } // En Passant if (Posicao.Linha == 4) // o en passant da preta só acontece na linha 4, contando de cima para baixo { Posicao posicaEsquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1); if (Tabuleiro.TestarPosicao(posicaEsquerda) && ExisteInimigo(posicaEsquerda) && Tabuleiro.Peca(posicaEsquerda) == Partida.VulneravelEnPassant) // Testa se a posição é valida, se tem um inimigo la e se a peca é a peca que está vulneravel, no caso somente o peao pode ficar vulneravel { matriz[posicaEsquerda.Linha + 1, posicaEsquerda.Coluna] = true; } Posicao posicaoDireita = new Posicao(posicao.Linha, posicao.Coluna + 1); if (Tabuleiro.TestarPosicao(posicaoDireita) && ExisteInimigo(posicaoDireita) && Tabuleiro.Peca(posicaoDireita) == Partida.VulneravelEnPassant) // Testa se a posição é valida, se tem um inimigo la e se a peca é a peca que está vulneravel, no caso somente o peao pode ficar vulneravel { matriz[posicaoDireita.Linha + 1, posicaoDireita.Coluna] = true; } } } return(matriz); }
public bool PodeMover(Posicao pos) { Peca p = Tabuleiro.Peca(pos); return(p == null || p.Cor != Cor); }
private bool TesteTorreParaRoque(Posicao posicao) { Peca peca = Tabuleiro.Peca(posicao); return(peca != null && peca is Torre && peca.Cor == Cor && peca.QtdMovimentos == 0); }
public override bool[,] MovimentosPossiveis() { bool[,] movimentosPossiveis = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao p = new Posicao(0, 0); if (Cor == Cor.Branca) { p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(p) && PosicaoLivre(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } p.DefinirValores(Posicao.Linha - 2, Posicao.Coluna); if (Tabuleiro.PosicaoValida(p) && PosicaoLivre(p) && QuantidadeMovimentos == 0) { movimentosPossiveis[p.Linha, p.Coluna] = true; } p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(p) && ExisteAdversario(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(p) && ExisteAdversario(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } //Jogada Especial En Passant if (Posicao.Linha == 3) { Posicao esquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1); Posicao direita = new Posicao(Posicao.Linha, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(esquerda) && ExisteAdversario(esquerda) && Tabuleiro.Peca(esquerda) == _partida.VulneravelEnPassant) { movimentosPossiveis[esquerda.Linha - 1, esquerda.Coluna] = true; } if (Tabuleiro.PosicaoValida(direita) && ExisteAdversario(direita) && Tabuleiro.Peca(direita) == _partida.VulneravelEnPassant) { movimentosPossiveis[direita.Linha - 1, direita.Coluna] = true; } } } else { p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(p) && PosicaoLivre(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } p.DefinirValores(Posicao.Linha + 2, Posicao.Coluna); if (Tabuleiro.PosicaoValida(p) && PosicaoLivre(p) && QuantidadeMovimentos == 0) { movimentosPossiveis[p.Linha, p.Coluna] = true; } p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(p) && ExisteAdversario(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(p) && ExisteAdversario(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } //Jogada Especial En Passant if (Posicao.Linha == 4) { Posicao esquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1); Posicao direita = new Posicao(Posicao.Linha, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(esquerda) && ExisteAdversario(esquerda) && Tabuleiro.Peca(esquerda) == _partida.VulneravelEnPassant) { movimentosPossiveis[esquerda.Linha + 1, esquerda.Coluna] = true; } if (Tabuleiro.PosicaoValida(direita) && ExisteAdversario(direita) && Tabuleiro.Peca(direita) == _partida.VulneravelEnPassant) { movimentosPossiveis[direita.Linha + 1, direita.Coluna] = true; } } } return(movimentosPossiveis); }
private bool Livre(Posicao pos) { return(Tabuleiro.Peca(pos) == null); }
private bool TesteTorreParaRoque(Posicao pos) { Peca p = Tabuleiro.Peca(pos); return(p != null && p is Torre && p.Cor == Cor && p.QuantidadeDeMovimentos == 0); }
private bool ExisteAdversario(Posicao posicaoDesejada) { Peca pecaPosicaoDesejada = Tabuleiro.Peca(posicaoDesejada); return(pecaPosicaoDesejada != null && pecaPosicaoDesejada.Cor != Cor); }
public override bool[,] MovimentosPossiveis() { bool[,] movimentosPossiveis = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao p = new Posicao(0, 0); //Norte p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor) { break; } p.Linha -= 1; } //Leste p.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor) { break; } p.Coluna += 1; } //Sul p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor) { break; } p.Linha += 1; } //Oeste p.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor) { break; } p.Coluna -= 1; } //Nordeste p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor) { break; } p.Linha -= 1; p.Coluna += 1; } //Sudeste p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor) { break; } p.Linha += 1; p.Coluna += 1; } //Sudoeste p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor) { break; } p.Linha += 1; p.Coluna -= 1; } //Noroeste p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor) { break; } p.Linha -= 1; p.Coluna -= 1; } return(movimentosPossiveis); }
private bool PodeMover(Posicao posicaoDesejada) { Peca pecaMovida = Tabuleiro.Peca(posicaoDesejada); return(pecaMovida == null || pecaMovida.Cor != Cor); }
private bool TesteTorreRoque(Posicao posicaoTorre) { Peca torre = Tabuleiro.Peca(posicaoTorre); return(torre != null && torre is Torre && torre.Cor == Cor && torre.QuantidadeMovimentos == 0); }
public override bool[,] MovimentosPossiveis() { bool[,] movimentosPossiveis = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao p = new Posicao(0, 0); //Norte p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } //Nordeste p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } //Leste p.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } //Sudeste p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } //Sul p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } //Sudoeste p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } //Oeste p.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } //Noroeste p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentosPossiveis[p.Linha, p.Coluna] = true; } //#Jogada Especial Roque if (QuantidadeMovimentos == 0 && _partida.Xeque == false) { //Pequeno Posicao posicaoTorreCurta = new Posicao(Posicao.Linha, Posicao.Coluna + 3); if (TesteTorreRoque(posicaoTorreCurta)) { Posicao p1 = new Posicao(Posicao.Linha, Posicao.Coluna + 1); Posicao p2 = new Posicao(Posicao.Linha, Posicao.Coluna + 2); if (Tabuleiro.Peca(p1) == null && Tabuleiro.Peca(p2) == null) { movimentosPossiveis[Posicao.Linha, Posicao.Coluna + 2] = true; } } //Grande Posicao posicaoTorreLonga = new Posicao(Posicao.Linha, Posicao.Coluna - 4); if (TesteTorreRoque(posicaoTorreLonga)) { Posicao p1 = new Posicao(Posicao.Linha, Posicao.Coluna - 1); Posicao p2 = new Posicao(Posicao.Linha, Posicao.Coluna - 2); Posicao p3 = new Posicao(Posicao.Linha, Posicao.Coluna - 3); if (Tabuleiro.Peca(p1) == null && Tabuleiro.Peca(p2) == null && Tabuleiro.Peca(p3) == null) { movimentosPossiveis[Posicao.Linha, Posicao.Coluna - 2] = true; } } } return(movimentosPossiveis); }
public override bool[,] MovimentosPossiveis() { bool[,] mat = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao pos = new Posicao(0, 0); //acima pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != this.Cor) { break; } pos.Linha = pos.Linha - 1; } //abaixo pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != this.Cor) { break; } pos.Linha = pos.Linha + 1; } //direita pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != this.Cor) { break; } pos.Coluna = pos.Coluna + 1; } //esquerda pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != this.Cor) { break; } pos.Coluna = pos.Coluna - 1; } //Noroeste pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.DefinirValores(pos.Linha - 1, pos.Coluna - 1); } //Nordeste pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.DefinirValores(pos.Linha - 1, pos.Coluna + 1); } //Sudeste pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.DefinirValores(pos.Linha + 1, pos.Coluna + 1); } //Sudoeste pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.DefinirValores(pos.Linha + 1, pos.Coluna - 1); } return(mat); }
public void Jogada(Posicao origem, Posicao destino) { Peca captura = MoverPeca(origem, destino); if (EmXeque(JogadorAtual)) { ReverterJogada(origem, destino, captura); throw new TabuleiroException("Impossível se colocar em cheque!"); } Peca p = Tabuleiro.Peca(destino); //PROMOÇÃO DE PEÇA if (p is Peao) { if (p.Cor == Cor.Branco && destino.Linha == 0 || p.Cor == Cor.Preto && destino.Linha == 7) { Console.WriteLine(); Console.WriteLine("Possível promoção!"); Console.Write("Escolha [T]Torre, [B]Bispo, [C]Cavalo ou [D]Dama: "); string promo = Console.ReadLine().ToLower(); switch (promo) { case "t": Peca T = new Torre(Tabuleiro, p.Cor); Tabuleiro.RetirarPeca(destino); pecas.Remove(p); Tabuleiro.ColocarPeca(T, destino); pecas.Add(T); break; case "b": Peca B = new Bispo(Tabuleiro, p.Cor); Tabuleiro.RetirarPeca(destino); pecas.Remove(p); Tabuleiro.ColocarPeca(B, destino); pecas.Add(B); break; case "c": Peca C = new Cavalo(Tabuleiro, p.Cor); Tabuleiro.RetirarPeca(destino); pecas.Remove(p); Tabuleiro.ColocarPeca(C, destino); pecas.Add(C); break; case "d": Peca D = new Dama(Tabuleiro, p.Cor); Tabuleiro.RetirarPeca(destino); pecas.Remove(p); Tabuleiro.ColocarPeca(D, destino); pecas.Add(D); break; } } } if (EmXeque(GetCorAdversaria(JogadorAtual))) { JogadorEmXeque = true; } else { JogadorEmXeque = false; } if (XequeMate(GetCorAdversaria(JogadorAtual))) { Finalizada = true; } else { Turno++; MudarJogador(); } //EN PASSANT if (p is Peao && (destino.Linha == origem.Linha + 2 || destino.Linha == origem.Linha - 2)) { EnPassant = p; } else { EnPassant = null; } }
public override bool[,] MovimentosPossiveis() { bool[,] movimentos = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao p = new Posicao(Posicao.Linha, Posicao.Coluna); //ACIMA(PEÇAS BRANCAS) if (Cor == Cor.Branco) { p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha - 1, p.Coluna); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; p.SetPosicao(p.Linha - 1, p.Coluna); if (Tabuleiro.PosicaoValida(p) && PodeMover(p) && QtdeMovimentos == 0) { movimentos[p.Linha, p.Coluna] = true; } } p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha - 1, p.Coluna - 1); if (Tabuleiro.PosicaoValida(p) && Tabuleiro.ExistePeca(p) && Tabuleiro.Peca(p).Cor == Cor.Preto && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; } p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha - 1, p.Coluna + 1); if (Tabuleiro.PosicaoValida(p) && Tabuleiro.ExistePeca(p) && Tabuleiro.Peca(p).Cor == Cor.Preto && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; } //En Passant Branca p.SetPosicao(Posicao.Linha, Posicao.Coluna); if (p.Linha == 3) { Posicao esquerda = new Posicao(p.Linha, p.Coluna - 1); if (Tabuleiro.PosicaoValida(esquerda) && Tabuleiro.ExistePeca(esquerda) && Tabuleiro.Peca(esquerda).Cor == Cor.Preto && Tabuleiro.Peca(esquerda) == partida.EnPassant) { movimentos[esquerda.Linha - 1, esquerda.Coluna] = true; } Posicao direita = new Posicao(p.Linha, p.Coluna + 1); if (Tabuleiro.PosicaoValida(direita) && Tabuleiro.ExistePeca(direita) && Tabuleiro.Peca(direita).Cor == Cor.Preto && Tabuleiro.Peca(direita) == partida.EnPassant) { movimentos[direita.Linha - 1, direita.Coluna] = true; } } } //ABAIXO(PEÇAS PRETAS) else if (Cor == Cor.Preto) { p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha + 1, p.Coluna); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; p.SetPosicao(p.Linha + 1, p.Coluna); if (Tabuleiro.PosicaoValida(p) && PodeMover(p) && QtdeMovimentos == 0) { movimentos[p.Linha, p.Coluna] = true; } } p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha + 1, p.Coluna - 1); if (Tabuleiro.PosicaoValida(p) && Tabuleiro.ExistePeca(p) && Tabuleiro.Peca(p).Cor == Cor.Branco && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; } p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha + 1, p.Coluna + 1); if (Tabuleiro.PosicaoValida(p) && Tabuleiro.ExistePeca(p) && Tabuleiro.Peca(p).Cor == Cor.Branco && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; } //En Passant Preta p.SetPosicao(Posicao.Linha, Posicao.Coluna); if (p.Linha == 4) { Posicao esquerda = new Posicao(p.Linha, p.Coluna - 1); if (Tabuleiro.PosicaoValida(esquerda) && Tabuleiro.ExistePeca(esquerda) && Tabuleiro.Peca(esquerda).Cor == Cor.Branco && Tabuleiro.Peca(esquerda) == partida.EnPassant) { movimentos[esquerda.Linha + 1, esquerda.Coluna] = true; } Posicao direita = new Posicao(p.Linha, p.Coluna + 1); if (Tabuleiro.PosicaoValida(direita) && Tabuleiro.ExistePeca(direita) && Tabuleiro.Peca(direita).Cor == Cor.Branco && Tabuleiro.Peca(direita) == partida.EnPassant) { movimentos[direita.Linha + 1, direita.Coluna] = true; } } } return(movimentos); }
public override bool[,] MovimentosPossiveis() { bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; // Verificação das possíveis posições de movimentação desta peça (Rei) Posicao pos = new Posicao(0, 0); // Rainha = Movimentos da Torre + Movimentos do Bisco // Movimentos da Torre: // Acima pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matriz[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Linha--; } // Lateral direita pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matriz[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Coluna++; } // Abaixo pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matriz[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Linha++; } // Lateral esquerda pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matriz[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Coluna--; } // Movimentos do Bispo: // Diagonal superior direita (Nordeste) pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matriz[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Linha--; pos.Coluna++; } // Diagonal inferior direita (Sudeste) pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matriz[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Linha++; pos.Coluna++; } // Diagonal inferior esquerda (Sudoeste) pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matriz[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Linha++; pos.Coluna--; } // Diagonal superior esquerda (Noroeste) pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matriz[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Linha--; pos.Coluna--; } return(matriz); }
private bool TorreElegivelRoque(Posicao P) { Peca T = Tabuleiro.Peca(P); return(T != null && T is Torre && T.QtdeMovimentos == 0 && T.Cor == Cor); }
public override bool[,] MovimentosPossiveis() { bool[,] mat = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao pos = new Posicao(0, 0); //acima pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Linha -= 1; // faz subir a linha } //abaixo pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Linha += 1; // faz descer a linha } //direita pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Coluna += 1; // faz ir a direita } //esquerda pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Coluna -= 1; // faz ir a esquerda } return(mat); }
public override bool[,] MovimentosPossiveis() { bool[,] movimentos = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao inicial = Posicao; Posicao p = new Posicao(Posicao.Linha, Posicao.Coluna); //N p.SetPosicao(p.Linha - 1, p.Coluna); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; } ////NE p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha - 1, p.Coluna + 1); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; } //L p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha, p.Coluna + 1); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; } //SE p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha + 1, p.Coluna + 1); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; } //S p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha + 1, p.Coluna); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; } //SO p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha + 1, p.Coluna - 1); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; } //O p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha, p.Coluna - 1); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; } //NO p.SetPosicao(Posicao.Linha, Posicao.Coluna); p.SetPosicao(p.Linha - 1, p.Coluna - 1); if (Tabuleiro.PosicaoValida(p) && PodeMover(p)) { movimentos[p.Linha, p.Coluna] = true; } //ROQUE PEQUENO if (QtdeMovimentos == 0 && !partida.JogadorEmXeque) { Posicao T1 = new Posicao(this.Posicao.Linha, this.Posicao.Coluna + 3); if (Tabuleiro.PosicaoValida(T1) && TorreElegivelRoque(T1)) { Posicao P1 = new Posicao(Posicao.Linha, Posicao.Coluna + 1); Posicao P2 = new Posicao(Posicao.Linha, Posicao.Coluna + 2); if (Tabuleiro.PosicaoValida(P1) && Tabuleiro.PosicaoValida(P2)) { if (Tabuleiro.Peca(P1) == null && Tabuleiro.Peca(P2) == null) { movimentos[Posicao.Linha, Posicao.Coluna + 2] = true; } } } } ////ROQUE GRANDE if (QtdeMovimentos == 0 && !partida.JogadorEmXeque) { Posicao T2 = new Posicao(Posicao.Linha, Posicao.Coluna - 4); if (Tabuleiro.PosicaoValida(T2) && TorreElegivelRoque(T2)) { Posicao P1 = new Posicao(Posicao.Linha, Posicao.Coluna - 1); Posicao P2 = new Posicao(Posicao.Linha, Posicao.Coluna - 2); Posicao P3 = new Posicao(Posicao.Linha, Posicao.Coluna - 3); if (Tabuleiro.PosicaoValida(P1) && Tabuleiro.PosicaoValida(P2) && Tabuleiro.PosicaoValida(P3)) { if (Tabuleiro.Peca(P1) == null && Tabuleiro.Peca(P2) == null && Tabuleiro.Peca(P3) == null) { movimentos[Posicao.Linha, Posicao.Coluna - 2] = true; } } } } return(movimentos); }
public override bool[,] MovimentosPossiveis() { bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao posicao = new Posicao(0, 0); // Esquerda posicao.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor) { break; } posicao.DefinirValores(posicao.Linha, posicao.Coluna - 1); } // Direita posicao.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor) { break; } posicao.DefinirValores(posicao.Linha, posicao.Coluna + 1); } // Acima posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor) { break; } posicao.DefinirValores(posicao.Linha - 1, posicao.Coluna); } // Abaixo posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor) { break; } posicao.DefinirValores(posicao.Linha + 1, posicao.Coluna); } // Noroeste posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor) { break; } posicao.DefinirValores(posicao.Linha - 1, posicao.Coluna - 1); } // Nordeste posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor) { break; } posicao.DefinirValores(posicao.Linha - 1, posicao.Coluna + 1); } // Sudeste posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor) { break; } posicao.DefinirValores(posicao.Linha + 1, posicao.Coluna + 1); } // Sudoeste posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor) { break; } posicao.DefinirValores(posicao.Linha + 1, posicao.Coluna - 1); } return(matriz); }
private bool podeMover(Posicao pos) { Peca p = Tabuleiro.Peca(pos); return(p == null || p.Cor != Cor); }
private bool PosicaoLivre(Posicao posicaoDesejada) { return(Tabuleiro.Peca(posicaoDesejada) == null); }
public override bool[,] MovimentosPossiveis() { bool[,] matrizDeMovimentos = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao pos = new Posicao(0, 0); //Esquerda pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matrizDeMovimentos[pos.Linha, pos.Coluna] = true; if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Coluna--; } //Direita pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matrizDeMovimentos[pos.Linha, pos.Coluna] = true; if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Coluna++; } //Acima pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matrizDeMovimentos[pos.Linha, pos.Coluna] = true; if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Linha--; } //Abaixo pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matrizDeMovimentos[pos.Linha, pos.Coluna] = true; if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.Linha++; } //NO pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matrizDeMovimentos[pos.Linha, pos.Coluna] = true; if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.DefinirValores(pos.Linha - 1, pos.Coluna - 1); } //NE pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matrizDeMovimentos[pos.Linha, pos.Coluna] = true; if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.DefinirValores(pos.Linha - 1, pos.Coluna + 1); } //SE pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matrizDeMovimentos[pos.Linha, pos.Coluna] = true; if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.DefinirValores(pos.Linha + 1, pos.Coluna + 1); } //SO pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { matrizDeMovimentos[pos.Linha, pos.Coluna] = true; if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor) { break; } pos.DefinirValores(pos.Linha + 1, pos.Coluna - 1); } return(matrizDeMovimentos); }
private bool ExisteInimigo(Posicao pos) { Peca p = Tabuleiro.Peca(pos); return(p != null && p.Cor != this.Cor); }
public override bool[,] MovimentosPossiveis() { bool[,] mat = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao pos = new Posicao(0, 0); // acima pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } // nordeste pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } // direita pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } // sudeste pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } // abaixo pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } // sudoeste pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } // esquerda pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } // nordeste pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } // #jogadaespecial roque if (QuantidadeMovimentos == 0 && !partida.Xeque) { // #jogadaespecial roque pequeno Posicao posT1 = new Posicao(Posicao.Linha, Posicao.Coluna + 3); if (TesteTorreParaRoque(posT1)) { Posicao p1 = new Posicao(Posicao.Linha, Posicao.Coluna + 1); Posicao p2 = new Posicao(Posicao.Linha, Posicao.Coluna + 2); if (Tabuleiro.Peca(p1) == null && Tabuleiro.Peca(p2) == null) { mat[Posicao.Linha, Posicao.Coluna + 2] = true; } } // #jogadaespecial roque grande Posicao posT2 = new Posicao(Posicao.Linha, Posicao.Coluna - 4); if (TesteTorreParaRoque(posT2)) { Posicao p1 = new Posicao(Posicao.Linha, Posicao.Coluna - 1); Posicao p2 = new Posicao(Posicao.Linha, Posicao.Coluna - 2); Posicao p3 = new Posicao(Posicao.Linha, Posicao.Coluna - 3); if (Tabuleiro.Peca(p1) == null && Tabuleiro.Peca(p2) == null && Tabuleiro.Peca(p3) == null) { mat[Posicao.Linha, Posicao.Coluna - 2] = true; } } } return(mat); }
public override bool[,] MovimentosPossiveis() { bool[,] mat = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao pos = new Posicao(0, 0); if (Cor == Cor.Branca) { pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(pos) && Livre(pos)) { mat[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha - 2, Posicao.Coluna); Posicao p2 = new Posicao(Posicao.Linha - 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(p2) && Livre(p2) && Tabuleiro.PosicaoValida(pos) && Livre(pos) && QtdMovimentos == 0) { mat[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos)) { mat[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos)) { mat[pos.Linha, pos.Coluna] = true; } // enpassant if (Posicao.Linha == 3) { Posicao esquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(esquerda) && ExisteInimigo(esquerda) && Tabuleiro.Peca(esquerda) == partida.VulveravelEnPassant) { mat[esquerda.Linha - 1, esquerda.Coluna] = true; } Posicao direita = new Posicao(Posicao.Linha, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(direita) && ExisteInimigo(direita) && Tabuleiro.Peca(direita) == partida.VulveravelEnPassant) { mat[direita.Linha - 1, direita.Coluna] = true; } } } else { pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(pos) && Livre(pos)) { mat[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha + 2, Posicao.Coluna); Posicao p2 = new Posicao(Posicao.Linha + 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(p2) && Livre(p2) && Tabuleiro.PosicaoValida(pos) && Livre(pos) && QtdMovimentos == 0) { mat[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos)) { mat[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos)) { mat[pos.Linha, pos.Coluna] = true; } // enpassant if (Posicao.Linha == 4) { Posicao esquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(esquerda) && ExisteInimigo(esquerda) && Tabuleiro.Peca(esquerda) == partida.VulveravelEnPassant) { mat[esquerda.Linha + 1, esquerda.Coluna] = true; } Posicao direita = new Posicao(Posicao.Linha, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(direita) && ExisteInimigo(direita) && Tabuleiro.Peca(direita) == partida.VulveravelEnPassant) { mat[direita.Linha + 1, direita.Coluna] = true; } } } return(mat); }
private bool ExisteInimigo(Posicao posicao) { Peca peca = Tabuleiro.Peca(posicao); return(peca != null && peca.Cor != Cor); }
private bool PodeMover(Posicao posicao) { Peca peca = Tabuleiro.Peca(posicao); return(peca == null || peca.Cor != Cor); }
public override bool[,] MovimentosPossiveis() { bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; // Verificação das possíveis posições de movimentação desta peça (Rei) Posicao pos = new Posicao(0, 0); // Peao só anda pra "frente" // Se a cor for Branca só ando para as linhas menores if (Cor == Cor.Branca) { // O Peão só captura peças laterais, portando só ando para frente se tiver Livre pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(pos) && PosicaoLivre(pos)) { matriz[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha - 2, Posicao.Coluna); if (Tabuleiro.PosicaoValida(pos) && PosicaoLivre(pos) && QtdeMovimentos == 0) // Na 1ª jogada o Peao pode andar 2 casas { matriz[pos.Linha, pos.Coluna] = true; } // O Peão só captura peças laterais, portando ando para a lateral se tiver Inimigo pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos)) { matriz[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos)) { matriz[pos.Linha, pos.Coluna] = true; } // #JogadaEspecial EnPassant if (Posicao.Linha == 3) { pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos) && Tabuleiro.Peca(pos) == _partida.VulneravemEnPassant) { matriz[Posicao.Linha - 1, Posicao.Coluna - 1] = true; } pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos) && Tabuleiro.Peca(pos) == _partida.VulneravemEnPassant) { matriz[Posicao.Linha - 1, Posicao.Coluna + 1] = true; } } } else { // O Peão só captura peças laterais, portando só ando para frente se tiver Livre pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(pos) && PosicaoLivre(pos)) { matriz[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha + 2, Posicao.Coluna); if (Tabuleiro.PosicaoValida(pos) && PosicaoLivre(pos) && QtdeMovimentos == 0) // Na 1ª jogada o Peao pode andar 2 casas { matriz[pos.Linha, pos.Coluna] = true; } // O Peão só captura peças laterais, portando ando para a lateral se tiver Inimigo pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos)) { matriz[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos)) { matriz[pos.Linha, pos.Coluna] = true; } // #JogadaEspecial EnPassant if (Posicao.Linha == 4) { pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos) && Tabuleiro.Peca(pos) == _partida.VulneravemEnPassant) { matriz[Posicao.Linha + 1, Posicao.Coluna - 1] = true; } pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos) && Tabuleiro.Peca(pos) == _partida.VulneravemEnPassant) { matriz[Posicao.Linha + 1, Posicao.Coluna + 1] = true; } } } return(matriz); }
public override bool[,] MovimentosPossiveis() { bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; Posicao posicao = new Posicao(0, 0); // Acima posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; } // Nordeste posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; } // Direita posicao.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; } // Sudeste posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; } // Abaixo posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; } // Sudoeste posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; } // Esquerda posicao.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; } // Noroestes posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao)) { matriz[posicao.Linha, posicao.Coluna] = true; } // #jogadaespecial Roque if (QtdMovimentos == 0 && !Partida.Xeque) { // #jogadaespecial Roque Pequeno Posicao posicaoTorreRoquePequeno = new Posicao(Posicao.Linha, Posicao.Coluna + 3); if (TesteTorreParaRoque(posicaoTorreRoquePequeno)) { Posicao p1 = new Posicao(Posicao.Linha, Posicao.Coluna + 1); Posicao p2 = new Posicao(Posicao.Linha, Posicao.Coluna + 2); if (Tabuleiro.Peca(p1) == null && Tabuleiro.Peca(p2) == null) { matriz[Posicao.Linha, Posicao.Coluna + 2] = true; } } // #jogadaespecial Roque Grande Posicao posicaoTorreRoqueGrande = new Posicao(Posicao.Linha, Posicao.Coluna - 4); if (TesteTorreParaRoque(posicaoTorreRoqueGrande)) { Posicao p1 = new Posicao(Posicao.Linha, Posicao.Coluna - 1); Posicao p2 = new Posicao(Posicao.Linha, Posicao.Coluna - 2); Posicao p3 = new Posicao(Posicao.Linha, Posicao.Coluna - 3); if (Tabuleiro.Peca(p1) == null && Tabuleiro.Peca(p2) == null && Tabuleiro.Peca(p3) == null) { matriz[Posicao.Linha, Posicao.Coluna - 2] = true; } } } return(matriz); }
private bool Livre(Posicao posicao) { return(Tabuleiro.Peca(posicao) == null); // Tem peça naquela possição?, se null true, não tem peça, se false false, tem peça }