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 TestEquals() { var m1 = new DrawMove(Player.One, PileName.Discard); var m2 = new DrawMove(Player.Two, PileName.Discard); var m3 = new DrawMove(Player.One, PileName.Discard); var m4 = new DrawMove(Player.One, PileName.Stock); var m5 = new DrawMove(Player.One, PileName.Stock); Assert.True(m1.Equals(m3)); Assert.True(m3.Equals(m1)); Assert.True(m4.Equals(m5)); Assert.True(m1.Equals(m1)); Assert.False(m1.Equals(null)); Assert.False(m1.Equals(m2)); Assert.False(m2.Equals(m1)); Assert.False(m1.Equals(m4)); Assert.False(m5.Equals(m2)); }
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 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)); }