/// <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); }