public String EstadoAtual() { String str = "A jogar: " + JogadorDaVez().Cor + "\n"; for (int i = 0; i < Tabuleiro.Tamanho; i++) { for (int j = 0; j < Tabuleiro.Tamanho; j++) { str += "Casa (" + i + "," + j + ") "; Peca peca = Tabuleiro.GetCasa(i, j).PecaAtual; if (peca == null) { str += "__"; } else { if (peca is Torre) { str += "T"; } else if (peca is Cavalo) { str += "C"; } else if (peca is Bispo) { str += "B"; } else if (peca is Rei) { str += "E"; } else if (peca is Rainha) { str += "A"; } else if (peca is Peao) { str += "P"; } else { str += "?"; Debug.LogWarning("Tipo de peça desconhecido ao registrar no histórico."); } str += peca.Cor; str += peca.ListaMovimentosToString(); } str += "\n"; } str += "\n"; } return(str); }
void Start() { Tabuleiro tabuleiro = GetComponentInParent <UITabuleiro>().Tabuleiro; // Assume que o nome é no formato "Casa XY", em que X é qualquer letra e Y qualquer número. string coordenadas = this.name.Substring(startIndex: 5); casa = tabuleiro.GetCasa(coordenadas); casa.uiC = this; }
public double pontuacao(Tabuleiro tab, char cor) { double pont = 0; Casa atual; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { atual = tab.GetCasa(i, j); if (atual.PecaAtual != null) { pont += valorCasa(atual, atual.PecaAtual, cor); } } } return(pont); }
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); }
public override Movimento Roque(Tabuleiro tabuleiro, Torre torre = null) { //Rei rei = (Rei)this.jDono.conjuntoPecas[4]; //OQUE ESTA COMENTADO FOI USADO PARA TESTES Rei rei = null; foreach (Peca p in this.jDono.conjuntoPecas) { if (p is Rei) { rei = (Rei)p; //Debug.Log("amem"); break; } } if (rei.CasaAtual == null || this.CasaAtual == null) { return(null); } // criar "movimento" rei deve ser aproximar da torre andando 2 casas (tanto no roque pequeno quanto no grande) // a torre anda 3 casas em casos de roque grande (torre do lado esquerdo) // a torre anda 2 casas em casos de roque pequeno(torre do lado direito) // dependendo da torre escolhida o movimento pode mudar // note que esse metodõ poderia ser chamado pelo rei ou torre(O JOGADOR PODE ESCOLHER FAZER ROQUE CLICANDO NO REI ou TORRE) // como a torre que varia eu implementei que a chamada do metodo do rei direciona para o metodo da torre especifica Casa destinorei, destinotorre; //MUDANÇA POR CAUSA DO TABULEIRO //int linha = rei.CasaAtual.PosX; //int colunaTgrande = this.PosY+3, colunaTpequeno = this.PosY-2; //int colunaRgrande = rei.PosY-2, colunaRpequeno = rei.PosY+2; int linha = rei.CasaAtual.PosY; // linha em que o rei está alinhado com a torre(que é na vdd a coluna da matriz) int colunaTgrande = this.PosX + 3, colunaTpequeno = this.PosX - 2; // coluna que o rei e torre devem se mover (que na vdd é a linha da matriz) int colunaRgrande = rei.PosX - 2, colunaRpequeno = rei.PosX + 2; //Debug.Log("select your roque"); /* * Debug.Log("linha rei:"); * Debug.Log(linha); * Debug.Log("Coluna rei:"); * Debug.Log(rei.CasaAtual.PosX); * Debug.Log("Coluna torre:"); * Debug.Log(this.CasaAtual.PosX); */ if (this.CasaAtual.PosX < rei.CasaAtual.PosX) // roque grande { // Debug.Log("Roque grande"); /* * Debug.Log("coluna Roque grande torre: "); * Debug.Log(colunaTgrande); * Debug.Log("coluna Roque grande rei: "); * Debug.Log(colunaRgrande); */ destinorei = tabuleiro.GetCasa(colunaRgrande, linha); destinotorre = tabuleiro.GetCasa(colunaTgrande, linha); } else // roque pequeno { // Debug.Log("Roque pequeno"); /* * Debug.Log("coluna Roque pequeno torre: "); * Debug.Log(colunaTpequeno); * Debug.Log("coluna Roque pequeno rei: "); * Debug.Log(colunaRpequeno); */ destinorei = tabuleiro.GetCasa(colunaRpequeno, linha); destinotorre = tabuleiro.GetCasa(colunaTpequeno, linha); } Movimento m = new Movimento(origem: rei.CasaAtual, destino: destinorei); Movimento mt = new Movimento(origem: this.CasaAtual, destino: destinotorre); //Debug.Log(this.PodeRoque(this,rei,tabuleiro,m)); if (this.PodeRoque(this, rei, tabuleiro, m, mt)) { //Debug.Log("realizando roque..."); m.movimentoExtra = mt; //this.RealizaMovimento(m); //this.RealizaMovimento(mt); return(m); } return(null); }
// 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); }