LoginSignup
1
0

paiza.ioでelixir その249

Posted at

概要

paiza.ioでelixirやってみた。
ブラックジャックをやってみた。

参考にしたページ。

サンプルコード


defmodule Deck do
  @suits ["♠", "♥", "♦", "♣"]
  @values ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]
  def create_deck do
    for v <- @values, s <- @suits, do: { v, s }
  end
  def shuffle(deck) do
    Enum.shuffle(deck)
  end
  def deal([card | deck]) do
    [card, deck]
  end
  def deal_two(deck) do
    [card1, deck] = deal(deck)
    [card2, deck] = deal(deck)
    [[card1, card2], deck]
  end
end

defmodule Hand do
  def is_face_card({value, _}), do: String.contains?("JQK", value)
  def sum_value([], acc) do
    acc
  end
  def sum_value([head | tail], acc) do
    face_card = Hand.is_face_card(head)
    case head do
      {"A", _ } when acc > 10 ->
        sum_value(tail, 1 + acc)
      {"A", _ } when acc <= 10 ->
        sum_value(tail, 11 + acc)
      _ when face_card ->
        sum_value(tail, 10 + acc)
      _ ->
        sum_value(tail, String.to_integer(elem(head, 0)) + acc)
    end
  end
end

defmodule Blackjack do
  def sit_at_table do
    chip_count = 50
    IO.puts "Why hello there, I see that you have #{chip_count} chips. Would you like to play a game of Blackjack?"
    game_start_response = IO.gets "Yes or No "
    response = String.rstrip(game_start_response) |> String.capitalize
    case response do
      _ when response === "Yes" or response === "Y" ->
        deck = Deck.create_deck |> Deck.shuffle
        game(deck, chip_count)
      _ when response === "No" or response === "N" ->
        IO.puts "\nGoodbye"
      _ ->
        IO.puts "\nLets try this again..."
        Blackjack.sit_at_table
    end
  end
  def game(deck, chip_count) do
    response = IO.gets "\nWhat would you like to bet on this game? "
    bet = String.rstrip(response) |> String.to_integer
    case bet do
      is_integer when bet > chip_count and bet > 0 ->
        IO.puts "\nYour total chip count is #{chip_count}, please make a bet equal or less to that value"
        Blackjack.game(deck, chip_count)
      is_integer when bet > 0 ->
        [player_hand, deck] = Deck.deal_two(deck)
        [house_hand, deck] = Deck.deal_two(deck)
        Blackjack.dealer_prompt(deck, player_hand, house_hand, bet, chip_count)
      _ ->
        IO.puts "\nPlease enter a number greater than zero"
        Blackjack.game(deck, chip_count)
    end
  end
  def dealer_prompt(deck, player_hand, house_hand, bet, chip_count) do
    IO.puts "\nYour hand is:"
    for card <- player_hand do
      IO.puts "#{elem(card,0)}#{elem(card,1)}"
    end
    if Hand.sum_value(player_hand, 0) > 21 do
      IO.puts "\nPlayer busts with #{Hand.sum_value(player_hand, 0)}, YOU LOSE!!"
      chip_count = chip_count - bet
      Blackjack.play_again(deck, chip_count)
    else
      IO.puts "\nYour hand total is: #{Hand.sum_value(player_hand, 0)}"
      Blackjack.hit_or_stand(deck, player_hand, house_hand, bet, chip_count)
    end
  end
  def hit_or_stand(deck, player_hand, house_hand, bet, chip_count) do
    decision = IO.gets "\nWould you like to hit or stand? "
    decision = String.rstrip(decision) |> String.capitalize
    case decision do
      "Hit" ->
        Blackjack.player_hit(deck, player_hand, house_hand, bet, chip_count)
      "Stand" ->
        Blackjack.stand(deck, player_hand, house_hand, bet, chip_count)
      _ ->
        IO.puts "\nPlease enter hit or stand"
        Blackjack.hit_or_stand(deck, player_hand, house_hand, bet, chip_count)
    end
  end
  def player_hit(deck, player_hand, house_hand, bet, chip_count) do
    [new_card, deck] = Deck.deal(deck)
    player_hand = player_hand ++ [new_card]
    Blackjack.dealer_prompt(deck, player_hand, house_hand, bet, chip_count)
  end
  def house_hit(deck, player_hand, house_hand, bet, chip_count) do
    [new_card, deck] = Deck.deal(deck)
    house_hand = house_hand ++ [new_card]
    Blackjack.stand(deck, player_hand, house_hand, bet, chip_count)
  end
  def stand(deck, player_hand, house_hand, bet, chip_count) do
    IO.puts "\nThe Dealer's hand is:"
    for card <- house_hand do
      IO.puts "#{elem(card,0)}#{elem(card,1)}"
    end
    IO.puts "Totalling #{Hand.sum_value(house_hand, 0)}"
    house_hand_sum = Hand.sum_value(house_hand, 0)
    player_hand_sum = Hand.sum_value(player_hand, 0)
    case house_hand_sum do
      house_hand_sum when house_hand_sum > 21 ->
        IO.puts "\nHouse busts, you win!"
        chip_count = chip_count + bet
        Blackjack.play_again(deck, chip_count)
      house_hand_sum when house_hand_sum > player_hand_sum and house_hand_sum > 16 or house_hand_sum == player_hand_sum and house_hand_sum > 16->
        IO.puts "\nHouse Wins!"
        chip_count = chip_count - bet
        Blackjack.play_again(deck, chip_count)
      house_hand_sum when house_hand_sum < player_hand_sum and house_hand_sum > 16 ->
        IO.puts "\nPlayer Wins!"
        chip_count = chip_count + bet
        Blackjack.play_again(deck, chip_count)
      _ ->
        IO.gets "\nHit enter to see the next house card"
        Blackjack.house_hit(deck, player_hand, house_hand, bet, chip_count)
    end
  end
  def play_again(deck, chip_count) do
    IO.puts "\nYou now have #{chip_count} chips"
    if chip_count > 0 do
      IO.puts "Would you like to play again?"
      game_start_response = IO.gets "Yes or No "
      if String.rstrip(game_start_response) |> String.capitalize == "Yes" do
        Blackjack.game(deck, chip_count)
      else
        IO.puts "\nThanks for playing, you left the table with #{chip_count} chips!"
      end
    else
      "You're out of chips! Come back with more to play again."
    end
  end
end

Blackjack.sit_at_table()



実行結果

Why hello there, I see that you have 50 chips. Would you like to play a game of Blackjack?
Yes or No 
What would you like to bet on this game? 
Your hand is:
Q♥
10♠

Your hand total is: 20

Would you like to hit or stand? 
The Dealer's hand is:
3♥
K♣
Totalling 13

Hit enter to see the next house card
The Dealer's hand is:
3♥
K♣
J♥
Totalling 23

House busts, you win!

You now have 60 chips
Would you like to play again?
Yes or No 
Thanks for playing, you left the table with 60 chips!

成果物

以上。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0