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)); } }
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)); } }
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)); } }