private void Form1_MouseClick(object sender, MouseEventArgs e) { GameData currentState = new GameData(tableau, foundations, cells, selectedOrderedCascade, selectedCellWithCard); gameData.Push(currentState); Cascade clickedCascade = tableau.GetClickedCascade(e.X, e.Y); int clickedCellIndex = GetClickedCellIndex(e.X, e.Y); int clickedFoundationIndex = GetClickedFoundationIndex(e.X, e.Y); if (clickedCascade != null) { if (selectedCellWithCard != null) { // move card bool isMoved = clickedCascade.TryAddCardFromCell(selectedCellWithCard); if (isMoved) { UnselectCellWithCard(true); } else { SelectOrderedCascadeFromCascade(clickedCascade, e.X, e.Y); } } else if (selectedOrderedCascade != null) { // move ordered cascade bool isMoved = clickedCascade.TryMoveOrderedCascade(selectedOrderedCascade, GetMaxNumberOfSuperMoves()); if (isMoved) { UnselectOrderedCascade(); } else { SelectOrderedCascadeFromCascade(clickedCascade, e.X, e.Y); } } else { SelectOrderedCascadeFromCascade(clickedCascade, e.X, e.Y); } } else if (clickedCellIndex != -1) { Card card = cells[clickedCellIndex].Top(); if (card != null) { UnselectCellWithCard(false); UnselectOrderedCascade(); // select new cell with card card.IsSelected = true; selectedCellWithCard = cells[clickedCellIndex]; } else if (selectedOrderedCascade != null) { if (cells[clickedCellIndex].TryMove(selectedOrderedCascade)) { UnselectOrderedCascade(); } } } else if (clickedFoundationIndex != -1) { if (selectedCellWithCard != null) { bool isMoved = foundations[clickedFoundationIndex].TryAddCard(selectedCellWithCard.Top()); if (isMoved) { UnselectCellWithCard(true); } } else if (selectedOrderedCascade != null) { bool isMoved = foundations[clickedFoundationIndex].TryMoveOrderedCascade(selectedOrderedCascade); if (isMoved) { UnselectOrderedCascade(); } } } Invalidate(); if (foundations[0].Count == 13 && foundations[1].Count == 13 && foundations[2].Count == 13 && foundations[3].Count == 13) { MessageBox.Show("Congratulation. You win!!!"); } }