Exemple #1
0
        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);
        }
Exemple #2
0
 private void InitGameFromState(GameData state)
 {
     tableau                = state.Tableau;
     foundations            = state.Foundations;
     cells                  = state.Cells;
     selectedCellWithCard   = state.SelectedCellWithCard;
     selectedOrderedCascade = state.SelectedOrderedCascade;
 }
Exemple #3
0
 private void UnselectCellWithCard(bool removeCard)
 {
     if (selectedCellWithCard != null)
     {
         selectedCellWithCard.Top().IsSelected = false;
         if (removeCard)
         {
             selectedCellWithCard.Pop();
         }
         selectedCellWithCard = null;
     }
 }
Exemple #4
0
        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());
            }
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
            }
        }
Exemple #7
0
        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!!!");
            }
        }