public void AcceptCard(IFrenchSuitedCard card) { if (IsOpeningMove() && !IsOpeningMoveCard(card)) { throw new InvalidMoveException($"Can not play '{card.Name}' as opening move"); } if (IsStartingMoveOnSuit(card)) { if (IsNotValidOpeningCard(card)) { throw new InvalidMoveException($"Opening move for a suit must be a {OpeningMoveRank}"); } } else { if (HasCardBeenPlayedAlready(card)) { throw new InvalidMoveException($"Card '{card.Name}' has already been played"); } if (IsCardNotAdjacentToExistingCard(card)) { throw new InvalidMoveException($"Card '{card.Name}' is not adjacent to a previously played card"); } } AddCardToPlayed(card); OnCardAccepted(this, new CardPlayedAcceptedEventArgs(card)); }
private bool IsCardNotAdjacentToExistingCard(IFrenchSuitedCard card) { var playedSuit = _playedCards[card.Suit]; var isAdjacent = playedSuit.Any(x => Math.Abs(x.Rank - card.Rank) == 1); return(!isAdjacent); }
public int CompareTo(IFrenchSuitedCard other) { if (ReferenceEquals(this, other)) { return(0); } if (ReferenceEquals(null, other)) { return(1); } return(Number.CompareTo(other.Number)); }
private int CountOfFutureCards(IFrenchSuitedCard card) { if (card.Rank > Rank.Seven) { return(_playersHand.CountOfHigherCards(card)); } if (card.Rank < Rank.Seven) { return(_playersHand.CountOfLowerCards(card)); } return(0); }
public void DisplayCard(IFrenchSuitedCard card) { if (card.Suit == Suit.Clubs) { _clubsStackPresenter.ShowCard(card); } if (card.Suit == Suit.Hearts) { _heartsStackPresenter.ShowCard(card); } if (card.Suit == Suit.Diamonds) { _diamondsStackPresenter.ShowCard(card); } if (card.Suit == Suit.Spades) { _spadesStackPresenter.ShowCard(card); } }
private void MakeMove(IPlayer player, IFrenchSuitedCard card) { try { _gameService.AcceptCard(card); player.Hand.RemoveCard(card); DisplayHands(); this.richTextBox1.AppendText($"{player.Name} played: {card.Name}\n", player.Colour); if (IsWinningMove(player)) { EndGame(player); return; } _players.Enqueue(_activePlayer); _activePlayer = _players.Dequeue(); if (_activePlayer.GamePlayStrategy == null) { _player1HandPresenter.Enabled = true; } else { var c = _activePlayer.GamePlayStrategy.GetMove(_gameService.PlayedCards, _activePlayer.Hand.Cards); MakeMove(_activePlayer, c); } } catch (KnockException) { PlayKnock(); this.richTextBox1.AppendText($"{_activePlayer.Name} Knocked\n", _activePlayer.Colour); NextPlayer(); } }
private void AddCardToPlayed(IFrenchSuitedCard card) { _playedCards[card.Suit].Add(card); }
private bool HasCardBeenPlayedAlready(IFrenchSuitedCard card) { var b = _playedCards[card.Suit].Any(x => x.Rank == card.Rank); return(b); }
private bool IsNotValidOpeningCard(IFrenchSuitedCard card) { return(card.Rank != OpeningMoveRank); }
private bool IsStartingMoveOnSuit(IFrenchSuitedCard card) { return(_playedCards[card.Suit].Count == 0); }
public ScoreCard(IFrenchSuitedCard card) { Card = card; Score = 0; }
private bool IsCardsAdjacent(IFrenchSuitedCard cardA, IFrenchSuitedCard cardB) { return((Math.Abs(cardA.Rank - cardB.Rank) == 1) && cardA.Suit == cardB.Suit); }
public int CountOfLowerCards(IFrenchSuitedCard card) { return(Cards.Count(x => card.Suit == x.Suit && card.Rank < Rank.Seven && card.Rank > x.Rank)); }
public void RemoveCard(IFrenchSuitedCard card) { Cards.Remove(card); }
public CardPlayedEventArgs(IPlayer player, IFrenchSuitedCard card) { Player = player; Card = card; }
public CardPlayedAcceptedEventArgs(IFrenchSuitedCard card) { Card = card; }
public void PlayCard(IFrenchSuitedCard card) { var handler = CardPlayed; handler?.Invoke(this, new CardPlayedEventArgs(this, card)); }
private bool IsOpeningMoveCard(IFrenchSuitedCard card) { return(card.Suit == GameRules.OpeningSuit && card.Rank == GameRules.FirstRank); }