コード例 #1
0
        internal void TryMakeMove(string moveText)
        {
            _logger.InfoFormat("Making Move");
            _gameState.GenerateMoves(MoveGenerationMode.All, 1, _moveData);

            uint move;
            var  canParse = MoveUtility.TryConvertStringToMove(moveText.ToUpper(), _gameState.WhiteToMove, out move);

            if (!canParse)
            {
                _logger.ErrorFormat("Unable to Parse Move Text");
            }

            var foundMove = _gameState.Moves[1].FirstOrDefault(
                x =>
                x.GetFromMove() == move.GetFromMove() && x.GetToMove() == move.GetToMove() && (move.GetPromotedPiece() == 0 ||
                                                                                               x.GetPromotedPiece() == move.GetPromotedPiece()));

            if (foundMove == uint.MinValue)
            {
                _logger.ErrorFormat("Unable to Locate Move in Move Generator");
                return;
            }

            _gameState.MakeMove(foundMove, _zobristHash);
            _logger.InfoFormat("Move Made");
        }
コード例 #2
0
        private void GenerateWhitePawnMoves()
        {
            for (int i = 0; i < 64; i++)
            {
                var file = MoveUtility.Files[i];
                var rank = MoveUtility.Ranks[i];

                var targetRank = rank + 1;
                var targetFile = file;

                //Single Move
                if (ValidLocation(targetFile, targetRank))
                {
                    WhitePawnMoves[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Double Move
                if (rank == 2)
                {
                    targetRank = rank + 2;

                    if (ValidLocation(targetFile, targetRank))
                    {
                        WhitePawnDoubleMoves[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                    }
                }
            }
        }
コード例 #3
0
        private void GenerateWhitePawnAttacks()
        {
            for (int i = 0; i < 64; i++)
            {
                var file = MoveUtility.Files[i];
                var rank = MoveUtility.Ranks[i];

                //Attack Left
                var targetFile = file - 1;
                var targetRank = rank + 1;

                if (ValidLocation(targetFile, targetRank))
                {
                    WhitePawnAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Attack Right
                targetFile = file + 1;

                if (ValidLocation(targetFile, targetRank))
                {
                    WhitePawnAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }
            }
        }
コード例 #4
0
        private void GenerateMasks()
        {
            for (var file = 1; file < 9; file++)
            {
                for (var rank = 1; rank < 9; rank++)
                {
                    for (var bit = 2; bit < 8; bit++)
                    {
                        RankMask[MoveUtility.BoardIndex[rank][file]] |= MoveUtility.GetBitStatesByBoardIndex(rank, bit);
                        FileMask[MoveUtility.BoardIndex[rank][file]] |= MoveUtility.GetBitStatesByBoardIndex(bit, file);
                    }

                    var diagonalA8H1 = file + rank; // from 2 to 16, longest diagonal = 9

                    if (diagonalA8H1 < 10)
                    {
                        for (var square = 2; square < diagonalA8H1 - 1; square++)
                        {
                            DiagonalA8H1Mask[MoveUtility.BoardIndex[rank][file]] |=
                                MoveUtility.GetBitStatesByBoardIndex(diagonalA8H1 - square, square);
                        }
                    }
                    else
                    {
                        for (var square = 2; square < 17 - diagonalA8H1; square++)
                        {
                            DiagonalA8H1Mask[MoveUtility.BoardIndex[rank][file]] |=
                                MoveUtility.GetBitStatesByBoardIndex(9 - square, diagonalA8H1 + square - 9);
                        }
                    }

                    var diagonalA1H8 = file - rank; // from -7 to +7, longest diagonal = 0

                    if (diagonalA1H8 > -1)          // lower half, diagonals 0 to 7
                    {
                        for (var square = 2; square < 8 - diagonalA1H8; square++)
                        {
                            DiagonalA1H8Mask[MoveUtility.BoardIndex[rank][file]] |=
                                MoveUtility.GetBitStatesByBoardIndex(square, diagonalA1H8 + square);
                        }
                    }
                    else
                    {
                        for (var square = 2; square < 8 + diagonalA1H8; square++)
                        {
                            DiagonalA1H8Mask[MoveUtility.BoardIndex[rank][file]] |=
                                MoveUtility.GetBitStatesByBoardIndex(square - diagonalA1H8, square);
                        }
                    }
                }
            }
        }
コード例 #5
0
    public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        if (p.Hit)
        {
            return;
        }

        rb.MovePosition(rb.position + MoveUtility.Move((destPos - rb.position), data) * data.Speed * Time.fixedDeltaTime);

        if (MoveUtility.Arrived(rb.position, destPos, data))
        {
            Next();
        }
    }
コード例 #6
0
        public void Execute(Entity ent, int idx, [ReadOnly] ref BulletMovement bm, ref PhysicsVelocity vel,
                            [ReadOnly] ref Translation pos, [ReadOnly] ref Rotation rotation)
        {
            // the % does nothing for single player, but will distribute the homing
            //    for multiplayer
            float3 playerPos = (playerPositions.Length > 0)
                                ? playerPositions[ent.Index % playerPositions.Length].Value
                                : new float3(0, 0, 0);

            float3 forward = MoveUtility.Up(rotation.Value);

            vel.Linear  = forward * bm.moveSpeed;
            vel.Angular = new float3(0, 0,
                                     MoveUtility.GetRotationSpeed(bm.moveType, bm.rotateSpeed,
                                                                  forward, math.normalize(playerPos - pos.Value)));
        }
コード例 #7
0
 /// <summary>
 /// Generates the file attacks for rooks and queens.
 /// The Sliding attack is transformed from top to bottom to left to right.
 ///
 ///                   H8
 ///     . . . . . A . .         LSB         MSB
 ///     . . . . . B . .     =>  A B C D E F G H
 ///     . . . . . C . .
 ///     . . . . . D . .
 ///     . . . . . E . .
 ///     . . . . . F . .
 ///     . . . . . G . .
 ///     . . . . . H . .
 ///     A1
 /// </summary>
 private void GenerateFileAttacks()
 {
     for (var square = 0; square < 64; square++)
     {
         for (var attackState = 0; attackState < 64; attackState++)
         {
             for (var attackbit = 0; attackbit < 8; attackbit++)
             {
                 if ((SlidingAttacks[8 - MoveUtility.Ranks[square]][attackState] & _byteBitStates[attackbit]) > 0)
                 {
                     var file = MoveUtility.Files[square];
                     var rank = 8 - attackbit;
                     FileAttacks[square][attackState] |= MoveUtility.GetBitStatesByBoardIndex(rank, file);
                 }
             }
         }
     }
 }
コード例 #8
0
        private void GenerateDiagonalA1H8Attacks()
        {
            for (var square = 0; square < 64; square++)
            {
                for (var attackState = 0; attackState < 64; attackState++)
                {
                    for (var attackbit = 0; attackbit < 8; attackbit++)
                    {
                        var slidingattackindex = (MoveUtility.Ranks[square] - 1) < (MoveUtility.Files[square] - 1)
                            ? (MoveUtility.Ranks[square] - 1)
                            : (MoveUtility.Files[square] - 1);
                        if ((SlidingAttacks[slidingattackindex][attackState] & _byteBitStates[attackbit]) > 0)
                        {
                            var diagonalLength = MoveUtility.Files[square] - MoveUtility.Ranks[square];

                            int file;
                            int rank;

                            if (diagonalLength < 0)
                            {
                                file = attackbit + 1;
                                rank = file - diagonalLength;
                            }
                            else
                            {
                                rank = attackbit + 1;
                                file = diagonalLength + rank;
                            }

                            if ((file > 0) && (file < 9) && (rank > 0) && (rank < 9))
                            {
                                DiagonalA1H8Attacks[square][attackState] |= MoveUtility.GetBitStatesByBoardIndex(rank,
                                                                                                                 file);
                            }
                        }
                    }
                }
            }
        }
コード例 #9
0
        private void GenerateDiagonalA8H1Attacks()
        {
            for (var square = 0; square < 64; square++)
            {
                for (var attackState = 0; attackState < 64; attackState++)
                {
                    for (var attackbit = 0; attackbit < 8; attackbit++)
                    {
                        var slidingattackindex = 8 - MoveUtility.Ranks[square] < MoveUtility.Files[square] - 1
                            ? 8 - MoveUtility.Ranks[square]
                            : MoveUtility.Files[square] - 1;
                        if ((SlidingAttacks[slidingattackindex][attackState] & _byteBitStates[attackbit]) > 0)
                        {
                            var diagonalLength = MoveUtility.Files[square] + MoveUtility.Ranks[square];

                            int file;
                            int rank;

                            if (diagonalLength < 10)
                            {
                                file = attackbit + 1;
                                rank = diagonalLength - file;
                            }
                            else
                            {
                                rank = 8 - attackbit;
                                file = diagonalLength - rank;
                            }

                            if ((file > 0) && (file < 9) && (rank > 0) && (rank < 9))
                            {
                                DiagonalA8H1Attacks[square][attackState] |= MoveUtility.GetBitStatesByBoardIndex(rank,
                                                                                                                 file);
                            }
                        }
                    }
                }
            }
        }
コード例 #10
0
        private void GenerateKnightAttacks()
        {
            for (int i = 0; i < 64; i++)
            {
                var file = MoveUtility.Files[i];
                var rank = MoveUtility.Ranks[i];

                //Down 2 Right 1
                var targetRank = rank - 2;
                var targetFile = file + 1;

                if (ValidLocation(targetFile, targetRank))
                {
                    KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Down 2 Left 1
                targetFile = file - 1;

                if (ValidLocation(targetFile, targetRank))
                {
                    KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Down 1 Right 2
                targetRank = rank - 1;
                targetFile = file + 2;

                if (ValidLocation(targetFile, targetRank))
                {
                    KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Down 1 Left 2
                targetFile = file - 2;

                if (ValidLocation(targetFile, targetRank))
                {
                    KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Up 2 Right 1
                targetRank = rank + 2;
                targetFile = file + 1;

                if (ValidLocation(targetFile, targetRank))
                {
                    KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Up 2 Left 1
                targetFile = file - 1;

                if (ValidLocation(targetFile, targetRank))
                {
                    KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Up 1 Right 2
                targetRank = rank + 1;
                targetFile = file + 2;

                if (ValidLocation(targetFile, targetRank))
                {
                    KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Up 1 Left 2
                targetFile = file - 2;

                if (ValidLocation(targetFile, targetRank))
                {
                    KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }
            }
        }
コード例 #11
0
        private void GenerateKingAttacks()
        {
            for (int i = 0; i < 64; i++)
            {
                var file = MoveUtility.Files[i];
                var rank = MoveUtility.Ranks[i];

                //Down
                var targetRank = rank - 1;
                var targetFile = file;

                if (ValidLocation(targetFile, targetRank))
                {
                    KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Up
                targetRank = rank + 1;
                targetFile = file;

                if (ValidLocation(targetFile, targetRank))
                {
                    KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Left
                targetRank = rank;
                targetFile = file - 1;

                if (ValidLocation(targetFile, targetRank))
                {
                    KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Right
                targetRank = rank;
                targetFile = file + 1;

                if (ValidLocation(targetFile, targetRank))
                {
                    KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Down Left
                targetRank = rank - 1;
                targetFile = file - 1;

                if (ValidLocation(targetFile, targetRank))
                {
                    KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Down Right
                targetRank = rank - 1;
                targetFile = file + 1;

                if (ValidLocation(targetFile, targetRank))
                {
                    KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Up Left
                targetRank = rank + 1;
                targetFile = file - 1;

                if (ValidLocation(targetFile, targetRank))
                {
                    KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }

                //Up Right
                targetRank = rank + 1;
                targetFile = file + 1;

                if (ValidLocation(targetFile, targetRank))
                {
                    KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile);
                }
            }
        }