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); }