protected bool PodeRoque(Torre torre, Rei rei, Tabuleiro tabuleiro, Movimento movrei, Movimento movtorre) { if (torre == null || rei == null || movrei == null || movtorre == null) { return(false); } // lembrando que as condições de roque são: // rei não pode ter se movimentado nenhuma vez // torre não pode ter se movimentado nenhuma vez if (!torre.primeiraJogada || !rei.primeiraJogada) { // Debug.Log("NÃO É A PRIMEIRA JOGADA!"); return(false); } // nao pode haver peças entre o rei e a torre int linha = rei.CasaAtual.PosY; // Debug.Log("linha rei:"); // Debug.Log(linha); int torrepos = torre.PosX; int reipos = rei.PosX; // Debug.Log("Coluna torre:"); // Debug.Log(torrepos); // Debug.Log("Coluna rei:"); // Debug.Log(reipos); int i, f; if (torrepos < reipos) { // Debug.Log("a posição entre torre e rei caracteriza um roque maior(ou era para caracterizar)"); i = torrepos; f = reipos; } else { // Debug.Log("a posição entre torre e rei caracteriza um roque menor(ou era para caracterizar)"); i = reipos; f = torrepos; } for (int p = i + 1; p < f; p++) { if (tabuleiro.GetCasa(p, linha).EstaOcupada()) { //Debug.Log(p); // Debug.Log("TEM CASAS OCUPADAS NO CAMINHO!"); return(false); } } // rei nao pode estar em xeque if (rei.jDono.EmXeque(false)) { // Debug.Log("Rei está em xeque!"); return(false); } // rei não pode passar nem terminar em uma casa que está sendo atacada por peça adversaria(rei entraria em xeque) //dependendo de quem se mova primeiro (torre ou rei ) antes de chamar a função CausaAutoXeque() sempre teremos um rei em xeque // mesmo se a torre o proteger(bloquear o ataque) // então o movimento da torre será "simulado" Peca movida; movida = movtorre.origem.PopPeca(); // lembrando que se chegamos até aqui não há ninguem ocupando essa casa! (eu acho...), podemos colocar a peça sem receio movtorre.destino.ColocarPeca(movida); if (movrei.CausaAutoXeque()) { // Debug.Log("rei esta indo para casa sob ataque!(entraria em xeque)"); // voltar para a torre para a poisção original movtorre.destino.PopPeca(); movtorre.origem.ColocarPeca(movida); return(false); } // voltar para a torre para a poisção original movida = movtorre.destino.PopPeca(); movtorre.origem.ColocarPeca(movida); return(true); }
// Propaga um movimento na direção dada. public static List <Movimento> SeguindoDirecao(Casa origem, int x, int y, int passos = int.MaxValue, Tipo tipo = Tipo.Normal, bool bloqueavel = true, bool verificaXeque = true) { var possibilidades = new List <Movimento>(); //Debug.Log(origem.PosX + x); Tabuleiro tabuleiro = origem.Tabuleiro; Casa seguinte = tabuleiro.GetCasa(origem.PosX + x, origem.PosY + y); while (seguinte != null && passos > 0) { Movimento novo = new Movimento(origem: origem, destino: seguinte, tipo: tipo); if (seguinte.EstaOcupada()) { if (tipo != Tipo.SemCaptura) { if (origem.PecaAtual.PodeCapturar(seguinte.PecaAtual)) { if (verificaXeque) { if (novo.CausaAutoXeque() == false) { novo.pecaCapturada = seguinte.PecaAtual; possibilidades.Add(novo); } } else { novo.pecaCapturada = seguinte.PecaAtual; possibilidades.Add(novo); } } } // Se for "bloqueável", o movimento não permite atravessar outras peças. (O cavalo "pula", não "atravessa", depois explico melhor) if (bloqueavel) { return(possibilidades); } } else { if (tipo != Tipo.SomenteCaptura) { if (verificaXeque) { if (novo.CausaAutoXeque() == false) { possibilidades.Add(novo); } } else { possibilidades.Add(novo); } } } seguinte = tabuleiro.GetCasa(seguinte.PosX + x, seguinte.PosY + y); passos--; } return(possibilidades); }