static GameState defended(GameState state, Card defenseCard, CardPair toDefeat) { var newDefender = state.defender.withCards(_ => _.Remove(defenseCard)); var newOnTable = state.onTable.Replace( toDefeat, new CardPair(toDefeat.placed, new Option <Card>(defenseCard)) ); return(state.withDefender(newDefender).withOnTable(newOnTable)); }
public static Option <Card> pickForDefense( Player defender, CardPair toDefeatPair, Suit trumpSuit, IComparer <Card> trumpComparer ) { var sameSuitePicks = defender.cards .Where(card => card.suit == toDefeatPair.placed.suit && card.CompareTo(toDefeatPair.placed) > 0) .OrderBy(_ => _, trumpComparer); var trumpCards = defender.cards .Where(card => card.suit == trumpSuit && ( toDefeatPair.placed.suit != trumpSuit || card.CompareTo(toDefeatPair.placed) > 0 ) ) .OrderBy(_ => _, trumpComparer); var possiblePicks = sameSuitePicks.Concat(trumpCards); return(possiblePicks.head()); }