# CardSim
Playing card game simulation library for Elixir.
> **This library is in development. More playable games should available soon.**
```elixir
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
- Spades => `0`
- Clubs => `1`
- Diamonds => `2`
- Hearts => `3`
#### Card Values
- Values `2` - `10` are the card values themselves.
- Values `11` - `14` are Jack (11), Queen (12), King (13), and Ace (14) respectively.
- Jokers are `{8, 99}` (black), `{9, 99}` (red).
#### Card Examples
- `{0, 2}` => 2 of Spades
- `{1, 13}` => King of Clubs
- `{3, 10}` => 10 of Hearts
- `{8, 99}` => Black Joker
### Code Examples
```elixir
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
- War
### Game Examples
#### War
*Can be found in `scripts/simple_war_sim.exs`*
```elixir
#
# 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**
```elixir
[nanoseconds: 0, winner: :player1, hands: 282]
```