/// <summary> /// Generates magic bitboards for the specified parameters. /// </summary> /// <param name="attacksGenerator">The attacks generator.</param> /// <param name="patternBitsCount">The array of pattern set bits count.</param> /// <param name="keys">The array of magic keys.</param> /// <returns>The array of fields containing a list of possible attacks for bishop (accessed by magic keys).</returns> public ulong[][] GenerateMagicBitboards(IAttacksGenerator attacksGenerator, int[] patternBitsCount, ulong[] keys) { var bishopAttacks = new ulong[64][]; for (var i = 0; i < 64; i++) { var attacks = attacksGenerator.Generate(i); var maskBitsCount = patternBitsCount[i]; bishopAttacks[i] = GenerateMagicAttacks(attacks, keys, maskBitsCount, i); } return(bishopAttacks); }
/// <summary> /// Calculates magic keys for the specified piece. /// </summary> /// <param name="attacksGenerator">RookAttacksGenerator for rook or BishopAttacksGenerator for bishop</param> /// <param name="pieceAttackPatterns">BishopAttacksGenerator for rook PatternsContainer.BishopPattern for bishop</param> /// <returns>Array of magic keys for the specified piece</returns> private ulong[] GetKeys(IAttacksGenerator attacksGenerator, ulong[] pieceAttackPatterns) { var keys = new ulong[64]; for (var fieldIndex = 0; fieldIndex < 64; fieldIndex++) { var mask = pieceAttackPatterns[fieldIndex]; var maskLength = BitOperations.Count(mask); var patterns = attacksGenerator.Generate(fieldIndex); keys[fieldIndex] = _magicKeyGenerator.GenerateKey(patterns, maskLength); DisplayStatus(fieldIndex, keys[fieldIndex], maskLength, patterns.Count); } return(keys); }