示例#1
0
        public HistoryMove MoveCheckerToNewPlace(int currentCol
                                                 , int currentRow
                                                 , int nextCol
                                                 , int nextRow
                                                 , bool convertBackToChecker = false)
        {
            CheckerModel checker = PlayerPositions.Single(x => x.Column == currentCol && x.Row == currentRow);
            IEnumerable <LinkedList <CheckerModel> > availablePaths = CalculateAvailablePaths();
            LinkedList <CheckerModel> path = availablePaths.Where(x => x.Last.Value.Column == nextCol && x.Last.Value.Row == nextRow).OrderByDescending(x => x.Count).FirstOrDefault();
            bool isConvertedToQueen        = false;

            if (ShouldConvertToQueenByPathDuringTaking(path))
            {
                checker.BecomeAQueen();
                isConvertedToQueen = true;
            }
            CheckerModel newPosition          = _dataProvider.GetElementAtPosition(nextCol, nextRow);
            CheckerModel oldPositionedChecker = _dataProvider.GetElementAtPosition(currentCol, currentRow);

            if (convertBackToChecker)
            {
                oldPositionedChecker.DowngradeToChecker();
            }
            if (_pathCalculator.IsMoveToucheBoard(newPosition))
            {
                oldPositionedChecker.BecomeAQueen();
                isConvertedToQueen = true;
            }
            _dataProvider.StartTrackChanges();
            List <CheckerModel> itemsToTake = GetToTakeCheckers(availablePaths, nextCol, nextRow, checker);
            var historyMove = new HistoryMove(isConvertedToQueen);

            foreach (CheckerModel checkerElement in itemsToTake)
            {
                var element = new CheckerModel(checkerElement.Column, checkerElement.Row, PieceType.Checker, Side.Empty);
                historyMove.DeletedList.Add(new KeyValuePair <CheckerModel, CheckerModel>(checkerElement.Clone(), element.Clone()));
                _dataProvider.MoveCheckerToNewPosition(element, checkerElement.Column, checkerElement.Row);
            }
            historyMove.MovedFromTo = new KeyValuePair <CheckerModel, CheckerModel>(oldPositionedChecker.Clone(), newPosition.Clone());
            _dataProvider.MoveCheckerToNewPosition(oldPositionedChecker, nextCol, nextRow);
            _dataProvider.StopTrackChanges();

            return(historyMove);
        }