Trying to implement War card game in Elixir

defmodule War do
def play_game(deck) do
[player1, player2] = deal_cards(deck)
play_rounds(player1, player2)
end

def deal_cards(deck) do
deck |> Enum.chunk_every(26)
end

def play_rounds(player1, player2) do
case {player1, player2} do
{, } →
{:tie, }

  {[], player2_deck} ->
    {:player2, player2_deck}

  {player1_deck, []} ->
    {:player1, player1_deck}

  {[card1 | hand1_without_card], [card2 | hand2_without_card]} ->
    case compare_cards(card1, card2) do
      :win ->
        play_rounds(hand1_without_card ++ [card1, card2], hand2_without_card)

      :lose ->
        play_rounds(hand1_without_card, hand2_without_card ++ [card1, card2])

      :tie ->
        play_war(hand1_without_card, hand2_without_card, [card1, card2])
    end
end

end

We assume both cards are at same rank for a WAR.

def compare_cards(rank1, rank2) when rank1 == rank2, do: :tie
def compare_cards(1, ), do: :win
def compare_cards(
, 1), do: :lose
def compare_cards(rank1, rank2) when rank1 > rank2 or rank1 == 1, do: :win
def compare_cards(rank1, rank2) when rank1 < rank2 or rank2 == 1, do: :lose

When both the players have only one card in their hand in war.

def play_war([a], [b], _) when a == b and is_integer(a), do: {:tie, }
def play_war([a], [b], _) when a > b and is_integer(a), do: :win
def play_war([a], [b], _) when a < b and is_integer(a), do: :lose

When 1 of the player have only one card.

def play_war([a], [b | _], _) when a > b and is_integer(a), do: :win
def play_war([a | _], [b], _) when a < b and is_integer(a), do: :lose

def play_war(, , ), do: {:tie, []}
def play_war(
, , _), do: :win
def play_war(, _, _), do: :lose

def play_war(hand1, hand2, pile) do
[face_down_c1, card1 | rest1] = hand1
[face_down_c2, card2 | rest2] = hand2

face_down_cards = [face_down_c1, face_down_c2]

case compare_cards(card1, card2) do
  :win ->
    play_rounds(rest1 ++ pile ++ face_down_cards ++ [card1, card2], rest2)

  :lose ->
    play_rounds(rest1, rest2 ++ pile ++ [card1, card2] ++ face_down_cards)

  :tie ->
    # Again a war.
    play_war(rest1, rest2, pile)
end

end
end

Hey Waheed, curious about this. In part of your code, you use player2_deck, and player1_deck but haven’t defined player1_deck and player2_deck is essentially not used. What’s supposed to happen with these two?