Skip to content

Instantly share code, notes, and snippets.

@shiracamus
Created October 30, 2021 01:15
Show Gist options
  • Save shiracamus/8f160728a5f48ed6cbd4980e21ea39b7 to your computer and use it in GitHub Desktop.
Save shiracamus/8f160728a5f48ed6cbd4980e21ea39b7 to your computer and use it in GitHub Desktop.
class Blackjack
def play
puts <<~END
=======================
Welcome to Blackjack!!!
=======================
END
user = User.new "あなた"
dealer = Dealer.new "ディーラー"
dealer.deal user
judge(user, dealer)
end
def judge(user, dealer)
user.show_hand
dealer.show_hand
user_score = user.score
dealer_score = dealer.score
if user_score == dealer_score
puts "同点なので引き分けです。"
elsif user_score == 21
puts "ブラックジャック!! あなたの勝ちです!"
elsif user_score > 21
puts "バースト!! 合計点数が21を超えたのであなたの負けです。"
elsif dealer_score > 21
puts "ディーラーがバーストしました。あなたの勝ちです!"
elsif user_score < dealer_score
puts "ディーラーの勝ちです!"
else
puts "あなたの勝ちです!"
end
end
end
class Deck
@@SUITS = ["ハート", "クローバー", "ダイヤ", "スペード"]
@@INDEXES = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
def initialize
@cards = []
refill
end
def refill
@@SUITS.each do |suit|
@@INDEXES.each do |number|
@cards << Card.new(suit, number)
end
end
@cards.shuffle!
end
def draw
if @cards.empty?
refill
end
@cards.pop
end
end
class Card
attr_reader :suit, :number
def initialize(suit, number)
@suit = suit
@number = number
end
def info
"#{@suit}の#{@number}"
end
def score
if @number == "J" || @number == "Q" || @number == "K"
10
elsif @number == "A"
1
else
@number.to_i
end
end
end
class Player
def initialize(name)
@name = name
@hand = []
end
def hold(card)
@hand << card
end
def score
total = @hand.map{|card| card.score}.sum
total + (total <= 11 && @hand.any?{|card| card.number == "A"} ? 10 : 0)
end
def show_hand
puts ""
puts "====#{@name}の手札===="
@hand.each.with_index(1) do |card, i|
puts "#{i}枚目 : #{card.info}"
end
puts "#{@name}の合計点数は#{score}です"
puts "========================"
puts ""
end
end
class User < Player
def hit?
show_hand
if score > 21
false
else
puts <<~END
どうしますか?
1.Hit(カードを引く)
2.Stand(今の手札で勝負)
END
gets.to_i == 1
end
end
end
class Dealer < Player
def initialize(name)
super(name)
@deck = Deck.new
end
def deal(user)
user.hold @deck.draw # 最初にユーザと自分にカードを2枚ずつ配る
user.hold @deck.draw
hold @deck.draw
hold @deck.draw
show_hand_first
while user.hit? # ユーザがカードを求める間
user.hold @deck.draw # ユーザにカードを配る
end
while hit? # 自分がカードを求める間
hold @deck.draw # 自分にカードを配る
end
end
def hit?
show_hand
score < 17
end
def show_hand_first
puts <<~END
====#{@name}ーの手札====
1枚目:#{@hand.first.info}
2枚目:伏せられている
========================
END
end
end
Blackjack.new.play
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment