CardSim

Playing card game simulation library for Elixir.

This library is in development. More playable games should available soon.

defp deps do
  [
    {:dep_from_git, git: "https://github.com/jimurrito/CardSim.git", tag: "0.1.0"}
  ]
end

Quick Start

Cards are represented by a tuple of 2 integers. A deck is represented by a list of these card tuples.

{card_suit, card_value}

Card Suits

Card Values

Card Examples

Code Examples


alias CardSim.Deck

# Ordered deck
deck = CardSim.generate_deck()

# Shuffled deck
deck = CardSim.generate_deck() |> Deck.shuffle()

# Split deck (for games like WAR)
deck = CardSim.generate_deck() |> Deck.shuffle() |> Deck.half_deck()

Playable games

Game Examples

War

Can be found in scripts/simple_war_sim.exs

#
# Simple War Simulation

alias CardSim.Deck
alias Games.War

# generate 2 decks
{d1, d2} = CardSim.generate_deck() |> Deck.shuffle() |> Deck.half_deck()

d1 = War.make_war_deck(d1)
d2 = War.make_war_deck(d2)

loop =
  fn decks, acc, self ->
    War.play_hand(decks)
    |> case do
      {:win, result} -> {result, acc}
      decks -> self.(decks, acc + 1, self)
    end
  end

  
{time, {winner, hands}} = :timer.tc(fn -> loop.({d1, d2}, 1, loop) end)

IO.inspect(nanoseconds: div(time,1_000), winner: winner, hands: hands)
Output
[nanoseconds: 0, winner: :player1, hands: 282]