/// <summary> /// Событие окончания перемещения карт. /// Просматриваются новые позиции карты и определяется, куда их переместить. /// </summary> /// <param name="tableauView">таблица, из которой были перемещены карты</param> /// <param name="draggableCards">перемещаемые карты</param> public void DragCompleted(TableauView tableauView, DraggableCards draggableCards) { CardView bottomCardView = draggableCards.BottomCardView; Rect cardRect = GetCardRect(bottomCardView); // Просматриваем перемещение по стопкам. for (int i = 0; i < GameTable.Foundations * 2; i++) { FoundationView view = _foundationViews[i]; Rect rect = view.Bounds; if (cardRect.IntersectsWith(rect)) { // Проверка правых стопок. if (i >= GameTable.Foundations && draggableCards.Cards.Count != 13) { CancelMove(draggableCards); return; } if (!view.Foundation.IsCorrectMove(bottomCardView.Card)) { CancelMove(draggableCards); return; } // Добавляем карты в стопку. _table.MoveCards(draggableCards.Cards, tableauView.Tableau, view.Foundation); tableauView.RefreshView(); view.RefreshView(); CheckGameOver(); return; } } // Просматриваем перемещение по таблицам. for (int i = 0; i < GameTable.Tableaus; i++) { TableauView view = _tableauViews[i]; if (view.Equals(tableauView)) { continue; } Rect rect = view.Bounds; if (cardRect.IntersectsWith(rect)) { if (!view.Tableau.IsCorrectMove(bottomCardView.Card)) { CancelMove(draggableCards); return; } // Переносим карты в другую таблицу. _table.MoveCards(draggableCards.Cards, tableauView.Tableau, view.Tableau); tableauView.RefreshView(); view.RefreshView(); CheckAutoMovesToRightFoundation(); return; } } CancelMove(draggableCards); }
private void SetTableau() { _tableauViews = new TableauView[GameTable.Tableaus]; for (int i = 0; i < GameTable.Tableaus; i++) { var tableauView = new TableauView(); Grid.SetColumn(tableauView, i); Grid.SetRow(tableauView, 2); Panel.SetZIndex(tableauView, 0); tableauView.SetTableau(_table.GetTableau(i)); RootView.Children.Add(tableauView); _tableauViews[i] = tableauView; } }
/// <summary> /// Проверка автоматических перемещений в правую стопку из таблиц. /// </summary> private void CheckAutoMovesToRightFoundation() { for (int i = 0; i < GameTable.Tableaus; i++) { TableauView view = _tableauViews[i]; if (!view.Tableau.CheckFillKingToAce()) { continue; } // Найдена последовательность от короля до туза. // Ищем, куда её переместить. for (int j = 0; j < GameTable.Foundations; j++) { Foundation fn = _table.GetFoundation(j, false); if (fn.GetTopCard() == null) { _table.MoveCards(view.Tableau.GetDraggableTopCards(), view.Tableau, fn); break; } } RefreshView(); CheckGameOver(); } }