Exemple #1
0
        private IEnumerable <Move> GetAvailableNormalMoves(Checkboard checkboard)
        {
            if (Gameplay.Instance.LowerPawnsColor == Color)
            {
                var ru = Position.MoveRU();
                if (CheckNormalMove(ru, checkboard, out Move moveRu))
                {
                    yield return(moveRu);
                }

                var lu = Position.MoveLU();
                if (CheckNormalMove(lu, checkboard, out Move moveLu))
                {
                    yield return(moveLu);
                }
            }
            else
            {
                var rd = Position.MoveRD();
                if (CheckNormalMove(rd, checkboard, out Move moveRd))
                {
                    yield return(moveRd);
                }

                var ld = Position.MoveLD();
                if (CheckNormalMove(ld, checkboard, out Move moveLd))
                {
                    yield return(moveLd);
                }
            }
        }
Exemple #2
0
    private void InitalizeGame()
    {
        instance        = this;
        TurnColor       = GameColor.White;
        LowerPawnsColor = Random.value > 0.5f ? GameColor.White : GameColor.Black;
        var pawns = checkboardDisplay.Init();

        Checkboard = new Checkboard(pawns);

        if (LowerPawnsColor == GameColor.White)
        {
            whitePlayer = new HumanPlayer(GameColor.White, checkboardDisplay);
            blackPlayer = new BotPlayer(GameColor.Black, Menu.Instance.Depth);
        }
        else
        {
            whitePlayer = new BotPlayer(GameColor.White, Menu.Instance.Depth);
            blackPlayer = new HumanPlayer(GameColor.Black, checkboardDisplay);
        }

        whitePlayer.SingleMoveMadeEvent += OnPlayerSingleMoveMade;
        whitePlayer.TurnFinishedEvent   += OnTurnFinished;

        blackPlayer.SingleMoveMadeEvent += OnPlayerSingleMoveMade;
        blackPlayer.TurnFinishedEvent   += OnTurnFinished;

        whitePlayer.MoveInit();
    }
Exemple #3
0
        private IEnumerable <Move> GetAvailableTakes(Checkboard checkboard)
        {
            var rd = Position.MoveRD();

            if (CheckTake(rd, rd.MoveRD(), checkboard, out Move takeRd))
            {
                yield return(takeRd);
            }

            var ru = Position.MoveRU();

            if (CheckTake(ru, ru.MoveRU(), checkboard, out Move takeRu))
            {
                yield return(takeRu);
            }

            var ld = Position.MoveLD();

            if (CheckTake(ld, ld.MoveLD(), checkboard, out Move takeLd))
            {
                yield return(takeLd);
            }

            var lu = Position.MoveLU();

            if (CheckTake(lu, lu.MoveLU(), checkboard, out Move takeLu))
            {
                yield return(takeLu);
            }
        }
Exemple #4
0
 private void OnPlayerSingleMoveMade(object sender, Move move)
 {
     IsPawnInMove = true;
     checkboardDisplay.MakeMove(move, callback: () => {
         Checkboard.MakeMove(move);
         IsPawnInMove = false;
     });
 }
Exemple #5
0
        private bool CheckNormalMove(Vector2Int movePos, Checkboard checkboard, out Move move)
        {
            move = null;
            if (checkboard.IsEmptyAndExists(movePos))
            {
                move = new Move {
                    NewPos = movePos, PawnPos = Position
                };
                return(true);
            }

            return(false);
        }
Exemple #6
0
        private bool CheckTake(Vector2Int takePos, Vector2Int posAfterTake, Checkboard checkboard, out Move move)
        {
            move = null;
            if (checkboard.Exists(takePos) &&
                !checkboard.IsEmptyAndExists(takePos) &&
                checkboard[takePos].Color != Color &&
                checkboard.IsEmptyAndExists(posAfterTake))
            {
                move = new Move {
                    NewPos = posAfterTake, PawnPos = Position, TakePos = takePos
                };
                return(true);
            }

            return(false);
        }
Exemple #7
0
        public IEnumerable <Move> GetAvailableMoves(Checkboard checkboard)
        {
            var availableTakes = IsKing ? GetAvailableKingTakes(checkboard) : GetAvailableTakes(checkboard);

            if (availableTakes?.Any() == true)
            {
                return(availableTakes.ToList());
            }

            var normalMoves = IsKing ? GetAvailableNormalKingMoves(checkboard) : GetAvailableNormalMoves(checkboard);

            if (normalMoves?.Any() == true)
            {
                return(normalMoves.ToList());
            }

            return(null);
        }
Exemple #8
0
        private IEnumerable <Move> GetAvailableKingTakes(Checkboard checkboard)
        {
            foreach (var move in CheckKingTakes(Position, Vector2IntExtensions.MoveRD, checkboard))
            {
                yield return(move);
            }

            foreach (var move in CheckKingTakes(Position, Vector2IntExtensions.MoveLD, checkboard))
            {
                yield return(move);
            }

            foreach (var move in CheckKingTakes(Position, Vector2IntExtensions.MoveRU, checkboard))
            {
                yield return(move);
            }

            foreach (var move in CheckKingTakes(Position, Vector2IntExtensions.MoveLU, checkboard))
            {
                yield return(move);
            }
        }
Exemple #9
0
        private IEnumerable <Move> CheckKingMoves(Vector2Int startPos, System.Func <Vector2Int, Vector2Int> moveFunc, Checkboard checkboard)
        {
            var checkPos = moveFunc(startPos);

            while (checkboard.IsEmptyAndExists(checkPos))
            {
                yield return(new Move {
                    NewPos = checkPos,
                    PawnPos = startPos,
                });

                checkPos = moveFunc(checkPos);
            }
        }
Exemple #10
0
        private IEnumerable <Move> CheckKingTakes(Vector2Int startPos, System.Func <Vector2Int, Vector2Int> moveFunc, Checkboard checkboard)
        {
            var checkPos = startPos;
            var prevPos  = startPos;

            while (checkboard.Exists(checkPos))
            {
                checkPos = moveFunc(checkPos);
                var posAfterTake = moveFunc(checkPos);

                if (!(checkboard.IsEmptyAndExists(prevPos) || checkboard[prevPos].Position == startPos))
                {
                    yield break;
                }

                if (CheckTake(checkPos, posAfterTake, checkboard, out var move))
                {
                    yield return(move);

                    var endPos = moveFunc(move.NewPos);

                    while (checkboard.IsEmptyAndExists(endPos))
                    {
                        yield return(new Move {
                            NewPos = endPos,
                            PawnPos = move.PawnPos,
                            TakePos = move.TakePos,
                        });

                        endPos = moveFunc(endPos);
                    }

                    yield break;
                }
                prevPos = moveFunc(prevPos);
            }
        }