示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }