Nicholas A. Yager

To Hell And Back

06 Jan 2020

This summer I learned a new card game called "To Hell and Back". Similar to "Oh Hell" and "Rats!", "To Hell and Back" is a trick-taking card game where you bid the number of tricks you intend to take, and you must take exactly that number of tricks per hand in order to win. Bid correctly, and you earn your bid and 10 extra points. Lose your bid and you get zilch. Unlike its other variations, "To Hell and Back" starts with all players being dealt one card, and each hand the number of cards dealt per hand increases until we hit our maximum for all players. In the case of one-card hands, the differences between success and failure are luck of the draw and careful bidding.


Figure 1: Total non-sequitur, but I learned how to shuffle cards while playing "To Hell and Back". I've only become decent at shuffling cards this last year after a considerable amount of practice. Now I can bridge in addition to a ruffle shuffle!

I've become fascinated with this one-card case. To better understand the odds of winning this specific scenario, I've constructed a hand simulator, wherein a group of players are dealt one card, and the winner is determined. Using this simulation, we can understand just how likely each card and position is to win a hand.

Simulating The Game

Let's begin by constructing a vector for the deck of cards. A deck in this case is just a data frame consisting of suits and values.

deck <- c()
for (suit in c('H','D','C','S')) {
  for (value in seq(1,13)) {
    deck <- rbind(deck, c(suit=suit, value=value))
deck <- data.frame(deck)
deck$value <- as.numeric(deck$value)

Now that we have a deck, let's deal out the cards. Along the way we'll reveal the trump suit.

# Deal out cards
dealt_cards <- deck[sample(1:nrow(deck), 6, replace=F),]

# identify trump
trump_suit <- dealt_cards$suit[1]

Now that we've dealt some cards and identified trump, let's identify the leading suit and score up the hands. For each trick, the card with the highest score wins, with preference being given to cards of the trump suit over the leading suit.

# Identify leading suit
leading_suit <- dealt_cards$suit[2]

# Score each player. If your suit is not the leading suit or trump, than you
# get 0 points. If it's trump, then we will bias in your favor.
# (dealt_cards$value + ifelse(dealt_cards$suit == trump_suit, 20, 0))

dealt_cards <- dealt_cards %>%
    mutate(scored = ifelse(dealt_cards$suit == leading_suit, 1, 0) +
                    ifelse(dealt_cards$suit == trump_suit, 1, 0)) %>%
    mutate(score = ifelse(scored > 0, dealt_cards$value +
                   ifelse(dealt_cards$suit == trump_suit, 20, 0) , 0))

# Identify the winner
winning_player <- which.max(dealt_cards$score[2:6]) + 1
winning_hand <- dealt_cards[winning_player,]

We can then store the winning card, whether it was trump, and the position of the winner among players.

Using this basic hand simulation, I ran 10,000 simulations of "To Hell and Back" to quantify the probability of winning given any hand. With this in (ahem) hand, I investigated what the probability of a win was with respect to having a trump card, the value of a non-trump card, and based on your position in the order of players.

Trump vs Non-Trump

First, let's see how having a trump card affects the likelihood of winning the hand. Based on the 10,000 simulations performed, in about 75% of winners had a trump card, and of players with a trump card about 65% win the hand. Based on an odds ratio, in a 5-player game any given player is 10x more likely to win a one-card hand if they have a trump card than those who do not.

results %>%
  group_by(is_trump, winner) %>%
  summarise(count = n()) %>%

Figure 2: The win/loss count for trump and non-trump cards. In over 10,000, trump cards won 64.6% of hands, whereas non-trump cards typically won 6.3% of hands. It is important to recall that in this scenario there are 5 players, so for every one winner there are 6 losers.

Trump Win Scenarios

Since having a trump card is such a strong indicator of winning a one-card hand, let's examine how player position and card value affect the probability of winning. Unsurprisingly, higher-valued trump cards are associated with a larger proportion of winning hands. Starting from a base proportion of 33% of hands being won by a player with a two of trump, the probability of winning increases to a 100% win rate for aces.

Of particular note, as shown in the figure below, is that there is not a strong relationship between player position and winning if the player has a trump card. This is likely a result of there being too few cards in play for multiple players to both have trump cards. Futhermore, since trump cards are so much more likely to win than non-trump cards, the trump card is more likely to beat a non-trump leading card.

scores_by_player <- results %>%
  group_by(score, is_trump, player, winner) %>%
  summarise(count = n()) %>%
  mutate(freq=count/sum(count)) %>%
  select(score, is_trump, player, winner, freq) %>%
  filter(winner == 1, is_trump == 1) %>%
  cast(score ~ player)

Figure 3: The probability of winning increases linearly for trump hands as card value increases, but there isn't an interaction with player position. As should be expected, the probability of a player winning a hand increases linearly as the value of the hand increases. It was unexpected, however, for player position to have no effect on winning.

Non-Trump Win Scenarios

Next, let's see how the same hands play out for non-trump scenarios. Much like the trump card scenarios, there is a strong positive relationship between card value and the probability of winning (Metric), starting from a probability of 0.07 increasing up to a probability of 0.31 for the first player in the hand. Unlike the trump card scenarios, however, player position has a strong affect on the player's chance of winning. as shown in the figure below, the first player is 3-5 times more likely to win a hand than all other positions regardless of card value.

scores_by_player <- results %>%
  group_by(score, is_trump, player, winner) %>%
  summarise(count = n()) %>%
  mutate(freq=count/sum(count)) %>%
  select(score, is_trump, player, winner, freq) %>%
  filter(winner == 1, is_trump == 0) %>%
  cast(score ~ player)

Figure 4: The probability of winning is consistently much greater if you're the first player. The first player in the hand is much more likely to win than the other players since they set the leading suit. As such, they start with a 7% chance of winning the hand, and can have up to a 31% chance of winning if they lead with an ace.


Using these simulations as guideposts for bidding behavior, I present the following heuristic.

some digraph title digraph "some digraph title" { start[shape="box", style=rounded]; is_trump[shape="diamond", style="", label="Is your card\ntrump?"]; is_first[shape="diamond", style="", label="Are you the\nfirst player?"]; is_greater_than_10[shape="diamond", style="", label="Is your card\n10 or greater?"] bet_1[shape="box", style=rounded label="You have at least a\n30% shot. Bet one"]; bet_12[shape="box", style=rounded label="You have at least a\n20% shot. Bet one"]; bet_0[shape="box", style=rounded label="Don't sweat\nit. Bet zero"]; start -> is_trump is_trump -> bet_1[label="Yes"] is_trump -> is_first[label="No"] is_first -> is_greater_than_10[label="Yes"] is_first -> bet_0[label="No"] is_greater_than_10 -> bet_12[label="Yes"] is_greater_than_10 -> bet_0[label="No"] } some digraph title start start is_trump Is your card trump? start->is_trump is_first Are you the first player? is_trump->is_first No bet_1 You have at least a 30% shot. Bet one is_trump->bet_1 Yes is_greater_than_10 Is your card 10 or greater? is_first->is_greater_than_10 Yes bet_0 Don't sweat it. Bet zero is_first->bet_0 No bet_12 You have at least a 20% shot. Bet one is_greater_than_10->bet_12 Yes is_greater_than_10->bet_0 No

Is this perfect? Not even close! It should be said, however, that this will make your decisions rather easy in the first round. In any case, "To Hell and Back" is just a means to have fun, and what's more fun than clawing victory from the jaws of defeat?

Return to home...