Created
October 30, 2021 01:15
-
-
Save shiracamus/8f160728a5f48ed6cbd4980e21ea39b7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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