/// <summary> /// Retorna a representação FEN atual das peças no tabuleiro de xadrez. /// Exemplo para posição inicial: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR /// </summary> /// <param name="tabuleiro">tabuleiro com a posição para gerar a string FEN</param> /// <returns>Descrição FEN das peças no tabuleiro</returns> private static string ObtemDescPosicao(Tabuleiro tabuleiro) { var desc = ""; for (var fileira = Defs.PRIMEIRA_FILEIRA; fileira < Defs.ULTIMA_FILEIRA; fileira++) { if (desc != "") { desc += "/"; } var contador_casas_vazias = 0; for (var coluna = Defs.PRIMEIRA_COLUNA; coluna < Defs.ULTIMA_COLUNA; coluna++) { var peca = tabuleiro.ObtemPeca(fileira * Defs.NUMERO_COLUNAS + coluna); if (peca == Peca.Nenhuma) { contador_casas_vazias++; continue; } if (contador_casas_vazias != 0) { desc += contador_casas_vazias.ToString(); contador_casas_vazias = 0; } desc += peca.ParaTexto(); } if (contador_casas_vazias != 0) { desc += contador_casas_vazias.ToString(); contador_casas_vazias = 0; } } return(desc); }
/// <summary> /// Gera a chave para a posição atual do tabuleiro. /// </summary> /// <remarks> /// Aqui estamos gerando a chave para a posição sempre que tivermos uma nova posição. /// A maioria dos programas irá fazer isso de forma incremental, apenas atualizando /// os elementos que mudaram quando o movimento foi feito, exemplo a peça do movimento. /// Isso é possível por causa da forma como o "ou exclusivo" funciona. /// </remarks> /// <param name="tabuleiro">Tabuleiro.</param> /// <returns>Chave da posição.</returns> public static ulong ObtemChave(Tabuleiro tabuleiro) { ulong chave = 0; for (var fileira = Defs.PRIMEIRA_FILEIRA; fileira < Defs.ULTIMA_FILEIRA; fileira++) { for (var coluna = Defs.PRIMEIRA_COLUNA; coluna < Defs.ULTIMA_COLUNA; coluna++) { var indice12x12 = fileira * Defs.NUMERO_COLUNAS + coluna; var peca = tabuleiro.ObtemPeca(indice12x12); if (peca == Peca.Nenhuma) { continue; } var indice8x8 = Defs.Converte12x12Para8x8(indice12x12); switch (peca) { case Peca.PeaoBranco: chave ^= Chave.Branco.PEAO[indice8x8]; break; case Peca.CavaloBranco: chave ^= Chave.Branco.CAVALO[indice8x8]; break; case Peca.BispoBranco: chave ^= Chave.Branco.BISPO[indice8x8]; break; case Peca.TorreBranca: chave ^= Chave.Branco.TORRE[indice8x8]; break; case Peca.DamaBranca: chave ^= Chave.Branco.DAMA[indice8x8]; break; case Peca.ReiBranco: chave ^= Chave.Branco.REI[indice8x8]; break; case Peca.PeaoPreto: chave ^= Chave.Preto.PEAO[indice8x8]; break; case Peca.CavaloPreto: chave ^= Chave.Preto.CAVALO[indice8x8]; break; case Peca.BispoPreto: chave ^= Chave.Preto.BISPO[indice8x8]; break; case Peca.TorrePreta: chave ^= Chave.Preto.TORRE[indice8x8]; break; case Peca.DamaPreta: chave ^= Chave.Preto.DAMA[indice8x8]; break; case Peca.ReiPreto: chave ^= Chave.Preto.REI[indice8x8]; break; } } } if (tabuleiro.IndiceEnPassant != 0) { chave ^= Chave.ENPASSANT[Defs.Converte12x12Para8x8(tabuleiro.IndiceEnPassant)]; } chave ^= Chave.Roque.E1G1[tabuleiro.RoqueE1G1 ? 0 : 1]; chave ^= Chave.Roque.E1C1[tabuleiro.RoqueE1C1 ? 0 : 1]; chave ^= Chave.Roque.E8G8[tabuleiro.RoqueE8G8 ? 0 : 1]; chave ^= Chave.Roque.E8C8[tabuleiro.RoqueE8C8 ? 0 : 1]; if (tabuleiro.CorJogar == Cor.Preta) { chave ^= Chave.COR; } return(chave); }
/// <summary> /// Avalia o tabuleiro. /// </summary> /// <remarks> /// Percorre o tabuleiro e avalia cada peça. /// </remarks> private void AvaliaTabuleiro() { for (var fileira = Defs.PRIMEIRA_FILEIRA; fileira < Defs.ULTIMA_FILEIRA; fileira++) { for (var coluna = Defs.PRIMEIRA_COLUNA; coluna < Defs.ULTIMA_COLUNA; coluna++) { var indice = fileira * Defs.NUMERO_COLUNAS + coluna; var peca = Tabuleiro.ObtemPeca(indice); switch (peca) { case Peca.Nenhuma: break; case Peca.PeaoBranco: AvaliaPeaoBranco(indice); break; case Peca.CavaloBranco: AvaliaCavalo(Branco, indice); break; case Peca.BispoBranco: AvaliaBispo(Branco, indice); break; case Peca.TorreBranca: AvaliaTorre(Branco, indice, DadosTorreBranca); break; case Peca.DamaBranca: AvaliaDama(Branco, indice); break; case Peca.ReiBranco: AvaliaRei(Branco, indice, DadosReiBranco); break; case Peca.PeaoPreto: AvaliaPeaoPreto(indice); break; case Peca.CavaloPreto: AvaliaCavalo(Preto, indice); break; case Peca.BispoPreto: AvaliaBispo(Preto, indice); break; case Peca.TorrePreta: AvaliaTorre(Preto, indice, DadosTorreBranca); break; case Peca.DamaPreta: AvaliaDama(Preto, indice); break; case Peca.ReiPreto: AvaliaRei(Preto, indice, DadosReiBranco); break; } } } }