private void NewGame() { cells = new OpenCell[4]; for (int i = 0; i < 4; i++) { int xc = Width / 2 - Width / 8 * (i + 1); cells[i] = new OpenCell(); cells[i].X = xc; cells[i].Y = 0; } foundations = new Foundation[4]; for (int i = 0; i < 4; ++i) { foundations[i] = new Foundation(i, Width / 2 + Width / 8 * i, 0); } //deck = new deck(); tableau = new Tableau(new deck(), 0, Card.CardHeight + 20, Width); gameData = new Stack <GameData>(); selectedOrderedCascade = null; selectedCellWithCard = null; // save initial game state, to be able to restart the game initialGameState = new GameData(tableau, foundations, cells, selectedOrderedCascade, selectedCellWithCard); }
private void InitGameFromState(GameData state) { tableau = state.Tableau; foundations = state.Foundations; cells = state.Cells; selectedCellWithCard = state.SelectedCellWithCard; selectedOrderedCascade = state.SelectedOrderedCascade; }
private void UnselectCellWithCard(bool removeCard) { if (selectedCellWithCard != null) { selectedCellWithCard.Top().IsSelected = false; if (removeCard) { selectedCellWithCard.Pop(); } selectedCellWithCard = null; } }
public void DrawOpenCell(Graphics g, OpenCell cell) { Rectangle destRect = new Rectangle(cell.X, cell.Y, Card.CardWidth, Card.CardHeight); if (cell.Count == 0) { g.DrawImage(regCards, destRect, cardWidth * 2, CardHeight * 4, cardWidth, CardHeight, GraphicsUnit.Pixel); } else { DrawCard(g, cell.Top()); } }
public bool TryAddCardFromCell(OpenCell cell) { Card card = cell.Top(); if (card != null) { if (cards.Count == 0 || IsOrderedCards(cards.Last.Value, card)) { card.X = x; card.Y = y + cards.Count * DeltaCardY; cards.AddLast(card); return(true); } } return(false); }
public GameData(Tableau tableau, Foundation[] foundations, OpenCell[] cells, OrderedCascade selectedOrderedCascade, OpenCell selectedCell) { Cells = new OpenCell[cells.Length]; for (int i = 0; i < 4; i++) { Cells[i] = new OpenCell(); Cells[i].X = cells[i].X; Cells[i].Y = cells[i].Y; Card card = cells[i].Top(); if (card != null) { Cells[i].Push(card.GetCopy()); if (selectedCell != null && card.IsEqual(selectedCell.Top())) { SelectedCellWithCard = Cells[i]; } } } Foundations = new Foundation[4]; for (int i = 0; i < 4; ++i) { Foundations[i] = new Foundation(foundations[i].Suit, foundations[i].X, foundations[i].Y); Card card = foundations[i].Top(); if (card != null) { Foundations[i].Push(card.GetCopy()); } } Tableau = tableau.GetCopy(); if (selectedOrderedCascade != null) { SelectedOrderedCascade = Tableau.FindOrderedCascadeByCard(selectedOrderedCascade.Cards.First.Value); } }
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!!!"); } }