private bool posicaoInimigo(Posicao pos) { Peca p = tabuleiro.peca(pos); return(p != null && p.cor != this.cor); }
//método sobrescrevendo o da superclasse Peca public override bool[,] movimentosPossiveis() { /* REGRA: * A torre pode se mover na horizontal e na vertical até encontrar uma peça ou acabar o tabuleiro */ bool[,] mat = new bool[tab.linhas, tab.colunas]; Posicao pos = new Posicao(0, 0); //Posição acima da posição da Torre pos.definirValores(posicao.linha - 1, posicao.coluna); while (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; //forçar a parada do while quando encontrar uma peça adversária if (tab.peca(pos) != null && tab.peca(pos).cor != cor) { break; } //continua verificando nas linhas acima da posição atual da torre pos.linha = pos.linha - 1; } //Posição abaixo da posição da Torre pos.definirValores(posicao.linha + 1, posicao.coluna); while (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; //forçar a parada do while quando encontrar uma peça adversária if (tab.peca(pos) != null && tab.peca(pos).cor != cor) { break; } //continua verificando nas linhas acima da posição atual da torre pos.linha = pos.linha + 1; } //Posição direita da posição da Torre pos.definirValores(posicao.linha, posicao.coluna + 1); while (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; //forçar a parada do while quando encontrar uma peça adversária if (tab.peca(pos) != null && tab.peca(pos).cor != cor) { break; } //continua verificando nas linhas acima da posição atual da torre pos.coluna = pos.coluna + 1; } //Posição esquerda da posição da Torre pos.definirValores(posicao.linha, posicao.coluna - 1); while (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; //forçar a parada do while quando encontrar uma peça adversária if (tab.peca(pos) != null && tab.peca(pos).cor != cor) { break; } //continua verificando nas linhas acima da posição atual da torre pos.coluna = pos.coluna - 1; } return(mat); }
private bool posicaoLivre(Posicao pos) { return(tabuleiro.peca(pos) == null); }
private bool TesteTorreParaRoque(Posicao pos) { Peca p = Tab.Peca(pos); return(p != null && p is Torre && p.Cor == Cor && p.QtdeMovimentos == 0); }
public override bool[,] MovimentosPossiveis() { bool[,] mat = new bool[Tab.Linhas, Tab.Colunas]; Posicao pos = new Posicao(0, 0); //acima pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); if (Tab.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } //nordeste pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); if (Tab.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } //direita pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1); if (Tab.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } //sudeste pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); if (Tab.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } //abaixo pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); if (Tab.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } //sudoeste pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); if (Tab.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } //esquerda pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1); if (Tab.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } //noroeste pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); if (Tab.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } // #jogadaespecial Roque if (QtdeMovimentos == 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 (Tab.Peca(p1) == null && Tab.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 (Tab.Peca(p1) == null && Tab.Peca(p2) == null && Tab.Peca(p3) == null) { mat[Posicao.Linha, Posicao.Coluna - 2] = true; } } } return(mat); }
private bool _PodeMover(Posicao pos) { Peca_Tabuleiro p = tabuleiro.peca(pos); return p == null || p.cor != cor; }
public override bool[,] movimentoPossiveis() { bool[,] mat = new bool[tab.linhas, tab.colunas]; Posicao pos = new Posicao(0, 0); // Acima // pos.definirValores(posicao.linha - 1, posicao.coluna); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // NE // pos.definirValores(posicao.linha - 1, posicao.coluna + 1); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // Direita // pos.definirValores(posicao.linha, posicao.coluna + 1); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // SE // pos.definirValores(posicao.linha + 1, posicao.coluna + 1); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // Abaixo // pos.definirValores(posicao.linha + 1, posicao.coluna); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // SO // pos.definirValores(posicao.linha + 1, posicao.coluna - 1); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // Esquerda // pos.definirValores(posicao.linha, posicao.coluna - 1); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // NO // pos.definirValores(posicao.linha - 1, posicao.coluna - 1); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } if (qteMovimentos == 0 && !partida.xeque) { 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 (tab.peca(p1) == null && tab.peca(p2) == null) { mat[posicao.linha, posicao.coluna + 2] = true; } } 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 (tab.peca(p1) == null && tab.peca(p2) == null && tab.peca(p3) == null) { mat[posicao.linha, posicao.coluna - 2] = true; } } } return(mat); }
private bool Livre(Posicao pos) { return(Tab.Peca(pos) == null); }
public override bool[,] MovimentosPossiveis() { bool[,] mat = new bool[Tab.Linhas, Tab.Colunas]; Posicao pos = new Posicao(0, 0); if (Cor == Cor.Branca) { pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); if (Tab.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 (Tab.PosicaoValida(p2) && Livre(p2) && Tab.PosicaoValida(pos) && Livre(pos) && QteDeMovimentos == 0) { mat[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1); if (Tab.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1); if (Tab.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } // #en passant if (Posicao.Linha == 3) { Posicao esquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1); if (Tab.PosicaoValida(esquerda) && PodeMover(esquerda) && Tab.Peca(esquerda) == Partida.VulneravelEnPassant) { mat[esquerda.Linha - 1, esquerda.Coluna] = true; } Posicao direita = new Posicao(Posicao.Linha, Posicao.Coluna + 1); if (Tab.PosicaoValida(direita) && PodeMover(esquerda) && Tab.Peca(direita) == Partida.VulneravelEnPassant) { mat[direita.Linha - 1, direita.Coluna] = true; } } } else { pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); if (Tab.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 (Tab.PosicaoValida(p2) && Livre(p2) && Tab.PosicaoValida(pos) && Livre(pos) && QteDeMovimentos == 0) { mat[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1); if (Tab.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1); if (Tab.PosicaoValida(pos) && PodeMover(pos)) { mat[pos.Linha, pos.Coluna] = true; } // #en passant if (Posicao.Linha == 4) { Posicao esquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1); if (Tab.PosicaoValida(esquerda) && PodeMover(esquerda) && Tab.Peca(esquerda) == Partida.VulneravelEnPassant) { mat[esquerda.Linha + 1, esquerda.Coluna] = true; } Posicao direita = new Posicao(Posicao.Linha, Posicao.Coluna + 1); if (Tab.PosicaoValida(direita) && PodeMover(direita) && Tab.Peca(direita) == Partida.VulneravelEnPassant) { mat[direita.Linha + 1, direita.Coluna] = true; } } } return(mat); }
public void realizarJogada(Posicao origem, Posicao destino) { Peca pecaCapturada = executarMovimento(origem, destino); if (estaEmXeque(jogadorAtual)) { desfazMovimento(origem, destino, pecaCapturada); throw new TabuleiroException("Você não pode se colocar em xeque!"); } Peca p = tab.peca(destino); // #jogadaespecial promocao if (p is Peao) { if ((p.cor == Cor.Branco && destino.Linha == 0) || (p.cor == Cor.Preto && destino.Linha == 7)) { p = tab.retirarPeca(destino); pecas.Remove(p); ConsoleColor aux = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(); Console.WriteLine("#--- PROMOÇÃO! ---#"); Console.WriteLine("Opções de promoção:"); Console.WriteLine(" - Dama[D]\n - Torre[T]\n - Bispo[B]\n - Cavalo[C]"); Console.ForegroundColor = aux; Console.Write("Digite o caractere da opção escolhida: "); char escolha = char.Parse(Console.ReadLine()); switch (escolha) { //DAMA case 'D': Peca dama = new Dama(tab, p.cor); tab.colocarPeca(destino, dama); pecas.Add(dama); break; case 'd': Peca dama1 = new Dama(tab, p.cor); tab.colocarPeca(destino, dama1); pecas.Add(dama1); break; //TORRE case 'T': Peca torre = new Torre(tab, p.cor); tab.colocarPeca(destino, torre); pecas.Add(torre); break; case 't': Peca torre1 = new Torre(tab, p.cor); tab.colocarPeca(destino, torre1); pecas.Add(torre1); break; //BISPO case 'B': Peca bispo = new Bispo(tab, p.cor); tab.colocarPeca(destino, bispo); pecas.Add(bispo); break; case 'b': Peca bispo1 = new Bispo(tab, p.cor); tab.colocarPeca(destino, bispo1); pecas.Add(bispo1); break; //CAVALO case 'C': Peca cavalo = new Cavalo(tab, p.cor); tab.colocarPeca(destino, cavalo); pecas.Add(cavalo); break; case 'c': Peca cavalo1 = new Cavalo(tab, p.cor); tab.colocarPeca(destino, cavalo1); pecas.Add(cavalo1); break; } } } if (estaEmXeque(adversaria(jogadorAtual))) { xeque = true; } else { xeque = false; } if (testeXequemate(adversaria(jogadorAtual))) { terminada = true; } else { turno++; mudaJogador(); } // #jogadaespecial en passant if (p is Peao && (destino.Linha == origem.Linha - 2 || destino.Linha == origem.Linha + 2)) { vulneravelEnPassant = p; } else { vulneravelEnPassant = null; } }
public override bool[,] movimentosPossiveis() { bool[,] mat = new bool[tab.linhas, tab.colunas]; Posicao pos = new Posicao(0, 0); // VALIDACAO PECA BRANCA - ANDA SOMENTE PARA CIMA if (cor == Cor.Branca) { pos.definirValores(posicao.linha - 1, posicao.coluna); if (tab.posicaoValida(pos) && livre(pos)) { mat[pos.linha, pos.coluna] = true; } pos.definirValores(posicao.linha - 2, posicao.coluna); if (tab.posicaoValida(pos) && livre(pos) && qteMovimentos == 0) { mat[pos.linha, pos.coluna] = true; } pos.definirValores(posicao.linha - 1, posicao.coluna - 1); if (tab.posicaoValida(pos) && existeInimigo(pos)) { mat[pos.linha, pos.coluna] = true; } pos.definirValores(posicao.linha - 1, posicao.coluna + 1); if (tab.posicaoValida(pos) && existeInimigo(pos)) { mat[pos.linha, pos.coluna] = true; } // #JOGADA ESPECIAL EN PASSANT if (posicao.linha == 3) { Posicao esquerda = new Posicao(posicao.linha, posicao.coluna - 1); if (tab.posicaoValida(esquerda) && existeInimigo(esquerda) && tab.peca(esquerda) == partida.vulneravelEnPassant) { mat[esquerda.linha - 1, esquerda.coluna] = true; } Posicao direita = new Posicao(posicao.linha, posicao.coluna + 1); if (tab.posicaoValida(direita) && existeInimigo(direita) && tab.peca(direita) == partida.vulneravelEnPassant) { mat[direita.linha - 1, direita.coluna] = true; } } } else { pos.definirValores(posicao.linha + 1, posicao.coluna); if (tab.posicaoValida(pos) && livre(pos)) { mat[pos.linha, pos.coluna] = true; } pos.definirValores(posicao.linha + 2, posicao.coluna); if (tab.posicaoValida(pos) && livre(pos) && qteMovimentos == 0) { mat[pos.linha, pos.coluna] = true; } pos.definirValores(posicao.linha + 1, posicao.coluna - 1); if (tab.posicaoValida(pos) && existeInimigo(pos)) { mat[pos.linha, pos.coluna] = true; } pos.definirValores(posicao.linha + 1, posicao.coluna + 1); if (tab.posicaoValida(pos) && existeInimigo(pos)) { mat[pos.linha, pos.coluna] = true; } // #JOGADA ESPECIAL EN PASSANT if (posicao.linha == 4) { Posicao esquerda = new Posicao(posicao.linha, posicao.coluna - 1); if (tab.posicaoValida(esquerda) && existeInimigo(esquerda) && tab.peca(esquerda) == partida.vulneravelEnPassant) { mat[esquerda.linha + 1, esquerda.coluna] = true; } Posicao direita = new Posicao(posicao.linha, posicao.coluna + 1); if (tab.posicaoValida(direita) && existeInimigo(direita) && tab.peca(direita) == partida.vulneravelEnPassant) { mat[direita.linha + 1, direita.coluna] = true; } } } return(mat); }
public override bool[,] movimentosPossiveis() { bool[,] mat = new bool[tab.linhas, tab.colunas]; Posicao pos = new Posicao(0, 0); pos.definirValores(posicao.linha - 1, posicao.coluna - 2); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } //norte pos.definirValores(posicao.linha - 1, posicao.coluna); while (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; if (tab.peca(pos) != null && tab.peca(pos).cor != cor) { break; } pos.linha = pos.linha - 1; } //sul pos.definirValores(posicao.linha + 1, posicao.coluna); while (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; if (tab.peca(pos) != null && tab.peca(pos).cor != cor) { break; } pos.linha = pos.linha + 1; } //leste pos.definirValores(posicao.linha, posicao.coluna + 1); while (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; if (tab.peca(pos) != null && tab.peca(pos).cor != cor) { break; } pos.coluna = pos.coluna + 1; } //oeste pos.definirValores(posicao.linha, posicao.coluna - 1); while (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; if (tab.peca(pos) != null && tab.peca(pos).cor != cor) { break; } pos.coluna = pos.coluna - 1; } //noroeste pos.definirValores(posicao.linha - 1, posicao.coluna - 1); while (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; if (tab.peca(pos) != null && tab.peca(pos).cor != cor) { break; } pos.definirValores(pos.linha - 1, pos.coluna - 1); } //nordeste pos.definirValores(posicao.linha - 1, posicao.coluna + 1); while (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; if (tab.peca(pos) != null && tab.peca(pos).cor != cor) { break; } pos.definirValores(pos.linha - 1, pos.coluna + 1); } //sudeste pos.definirValores(posicao.linha + 1, posicao.coluna + 1); while (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; if (tab.peca(pos) != null && tab.peca(pos).cor != cor) { break; } pos.definirValores(pos.linha + 1, pos.coluna + 1); } //sudoeste pos.definirValores(posicao.linha + 1, posicao.coluna - 1); while (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; if (tab.peca(pos) != null && tab.peca(pos).cor != cor) { break; } pos.definirValores(pos.linha + 1, pos.coluna - 1); } return(mat); }
public override bool[,] movimentosPossiveis() { bool[,] mat = new bool[tab.linhas, tab.colunas]; Posicao pos = new Posicao(0, 0); // verificando // acima pos.definirValores(posicao.linha - 1, posicao.coluna); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // nordeste pos.definirValores(posicao.linha - 1, posicao.coluna + 1); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // direita pos.definirValores(posicao.linha, posicao.coluna + 1); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // sudeste pos.definirValores(posicao.linha + 1, posicao.coluna + 1); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // abaixo pos.definirValores(posicao.linha + 1, posicao.coluna); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // sudoeste pos.definirValores(posicao.linha + 1, posicao.coluna - 1); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // Esquerda pos.definirValores(posicao.linha, posicao.coluna - 1); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // noroeste pos.definirValores(posicao.linha - 1, posicao.coluna - 1); if (tab.posicaoValida(pos) && podeMover(pos)) { mat[pos.linha, pos.coluna] = true; } // #JogadaEspecial: Roque if (qteMovimentos == 0 && !partida.xeque) { // Checando a posição da torre // #Roque Pequeno Posicao posT1 = new Posicao(posicao.linha, posicao.coluna + 3); if (testeDoReiParaRoque(posT1)) { // Teste para ver se as duas posições ao lado do rei estão vagas Posicao p1 = new Posicao(posicao.linha, posicao.coluna + 1); Posicao p2 = new Posicao(posicao.linha, posicao.coluna + 2); if (tab.peca(p1) == null && tab.peca(p2) == null) { mat[posicao.linha, posicao.coluna + 2] = true; } } // #Roque Grande Posicao posT2 = new Posicao(posicao.linha, posicao.coluna - 4); if (testeDoReiParaRoque(posT2)) { // Teste para ver se as duas posições ao lado do rei estão vagas 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 (tab.peca(p1) == null && tab.peca(p2) == null && tab.peca(p3) == null) { mat[posicao.linha, posicao.coluna - 2] = true; } } } return(mat); }
private bool podeMover(Posicao pos) { Piece p = tab.piece(pos); return(p == null || p.color != color); }