Beispiel #1
0
        static HexagonBoard()
        {
            randomNumbers  = new Dictionary <Player, long[, ]>();
            neighborLookup = new HexCoordinate[BOARD_WIDTH, BOARD_WIDTH][];

            var blackRandomNumbers = new long[BOARD_WIDTH, BOARD_WIDTH];
            var whiteRandomNumbers = new long[BOARD_WIDTH, BOARD_WIDTH];
            var random             = new Random(1); // always use the same seed for deterministic results
            var byteBuffer         = new byte[64];

            for (var r = -BOARD_RADIUS; r <= BOARD_RADIUS; r++)
            {
                var q_start = Math.Max(-BOARD_RADIUS - r, -BOARD_RADIUS);
                var q_end   = Math.Min(BOARD_RADIUS - r, BOARD_RADIUS);
                for (var q = q_start; q <= q_end; q++)
                {
                    // Generate random numbers for zobris hashing
                    var arrayPos = new HexCoordinate(r + BOARD_RADIUS, q + BOARD_RADIUS);
                    random.NextBytes(byteBuffer);
                    blackRandomNumbers[arrayPos.R, arrayPos.Q] = Math.Abs(BitConverter.ToInt64(byteBuffer, 0));
                    random.NextBytes(byteBuffer);
                    whiteRandomNumbers[arrayPos.R, arrayPos.Q] = Math.Abs(BitConverter.ToInt64(byteBuffer, 0));

                    // Generate valid neighbors for faster access
                    var pos = new HexCoordinate(r, q);
                    neighborLookup[arrayPos.R, arrayPos.Q] = pos.GetNeighborsClockwise().Where(x => x.Distance(new HexCoordinate(0, 0)) <= BOARD_RADIUS).ToArray();
                }
            }

            randomNumbers.Add(Player.Black, blackRandomNumbers);
            randomNumbers.Add(Player.White, whiteRandomNumbers);
        }