Example #1
0
        public void DealDrawPile()
        {
            int priorScore = this.Score;

            Score--;
            NumMoves++;

            List <CardAction> actions  = new List <CardAction>();
            List <Card>       drawPile = DrawPiles.Last();

            for (int cardIndex = PlayPiles.Length - 1; cardIndex >= 0; cardIndex--)
            {
                // NOTE: Zero is the lowest card in the draw pile
                Card card      = drawPile[cardIndex];
                int  pileIndex = PlayPiles.Length - cardIndex - 1;

                card.FaceUp = true;
                PlayPiles[pileIndex].Add(card);
                actions.Add(new CardAction(
                                card, CardActionType.Move, card.Location,
                                card.Location = new CardLocation(PileType.Play, pileIndex, PlayPiles[pileIndex].Count - 1)));
            }

            DrawPiles.RemoveAt(DrawPiles.Count - 1);

            // Check for discards and subsequence card flips in each of the play piles
            DiscardSideEffects[] sideEffects = null;

            for (int i = 0; i < GameBoard.NumPlayPiles; i++)
            {
                bool flippedCard;

                if (TryAndDiscardCards(i, actions, out flippedCard))
                {
                    if (sideEffects == null)
                    {
                        sideEffects = new DiscardSideEffects[NumPlayPiles];
                    }

                    sideEffects[i] = DiscardSideEffects.DiscardedAfterDraw | (flippedCard ? DiscardSideEffects.FlipAfterDiscard : 0);
                }
            }

            Move move = new DrawMove(priorScore, sideEffects);

            this.SavedMoves.Push(move);

            if (GameBoardEvents != null)
            {
                GameBoardEvents.DrawMoveComplete(new ReadOnlyCollection <CardAction>(actions));
            }
        }
Example #2
0
        private void UndoDrawMove(DrawMove move)
        {
            List <CardAction> actions = new List <CardAction>();

            if (move.SideEffects != null)
            {
                for (int i = 0; i < move.SideEffects.Count; i++)
                {
                    if ((move.SideEffects[i] & DiscardSideEffects.DiscardedAfterDraw) != 0)
                    {
                        if ((move.SideEffects[i] & DiscardSideEffects.FlipAfterDiscard) != 0)
                        {
                            FlipBottomCardFaceDown(i, actions);
                        }

                        ReturnCards(i, actions);
                    }
                }
            }

            List <Card> drawPile = new List <Card>(GameBoard.NumPlayPiles);

            DrawPiles.Add(drawPile);

            for (int pileIndex = PlayPiles.Length - 1; pileIndex >= 0; pileIndex--)
            {
                List <Card> fromPile  = PlayPiles[pileIndex];
                Card        card      = fromPile.Last();
                int         cardIndex = PlayPiles.Length - 1 - pileIndex;

                drawPile.Add(card);
                fromPile.RemoveAt(fromPile.Count - 1);

                actions.Add(
                    new CardAction(card, CardActionType.Move, card.Location,
                                   card.Location = new CardLocation(PileType.Draw, DrawPiles.Count - 1, cardIndex)));
            }

            this.Score = move.PriorScore;
            this.NumMoves++;

            if (GameBoardEvents != null)
            {
                GameBoardEvents.UndoDrawMoveComplete(new ReadOnlyCollection <CardAction>(actions));
            }
        }
Example #3
0
        public void ShuffleAndCreateTableau()
        {
            // This is separate for testing - assert that we haven't created the tableau yet
            Debug.Assert(Deck.CardsRemaining != 0);

            List <CardAction> actions = new List <CardAction>(Deck.DeckSize * 2);
            Card card;

            Random random = new Random((int)DateTime.Now.Ticks);

            for (int i = 0; i < Deck.DeckSize - 1; i++)
            {
                Deck.SwapCards(i, random.Next(Deck.DeckSize - i) + i);
            }

            for (int i = 0; i < Deck.Cards.Count; i++)
            {
                card = Deck.Cards[i];
                actions.Add(new CardAction(card, CardActionType.Create, card.Location, card.Location = new CardLocation(PileType.Deck)));
            }

            Score = StartScore;

            for (int cardIndex = 0; cardIndex < 6; cardIndex++)
            {
                for (int playPileIndex = 0; playPileIndex < GameBoard.NumPlayPiles; playPileIndex++)
                {
                    int numCardsInPlayPile = playPileIndex < 4 ? 6 : 5;

                    if (cardIndex > numCardsInPlayPile - 1)
                    {
                        break;
                    }

                    if (cardIndex == numCardsInPlayPile - 1)
                    {
                        card = Deck.DealFaceUpCard();
                        PlayPiles[playPileIndex].Add(card);
                    }
                    else
                    {
                        card = Deck.DealFaceDownCard();
                        PlayPiles[playPileIndex].Add(card);
                    }

                    actions.Add(new CardAction(
                                    card, CardActionType.Move, card.Location, card.Location = new CardLocation(PileType.Play, playPileIndex, cardIndex)));
                }
            }

            for (int drawPileIndex = 0; drawPileIndex < GameBoard.NumDrawPiles; drawPileIndex++)
            {
                List <Card> drawPile = new List <Card>(GameBoard.NumPlayPiles);

                DrawPiles.Insert(drawPileIndex, drawPile);

                for (int j = 0; j < GameBoard.NumPlayPiles; j++)
                {
                    card = Deck.DealFaceDownCard();
                    drawPile.Add(card);
                    actions.Add(new CardAction(
                                    card, CardActionType.Move, card.Location, card.Location = new CardLocation(PileType.Draw, drawPileIndex, j)));
                }
            }

            Debug.Assert(Deck.CardsRemaining == 0, "Not all cards were delt");

            if (GameBoardEvents != null)
            {
                GameBoardEvents.TableauCreated(this, new ReadOnlyCollection <CardAction>(actions));
            }
        }