Skip to content

Instantly share code, notes, and snippets.

@obelisk68
Last active December 28, 2024 17:48
Show Gist options
  • Save obelisk68/42a9b8ee1bb67284dfcb965e3895ad5e to your computer and use it in GitHub Desktop.
Save obelisk68/42a9b8ee1bb67284dfcb965e3895ad5e to your computer and use it in GitHub Desktop.
ブラックジャックのOOP版
module BlackJack
class Person
def initialize(deck) = @cards = deck.hand_out(2)
def [](i) = @cards[i]
def natural21?
if calc_point == 21
puts "#{self.name}はナチュラル21です"
true
else
false
end
end
def calc_point
result = 0
cards = @cards.map(&:number)
n = cards.count(1)
cards -= [1]
cards.each { |c| result += (c > 10) ? 10 : c }
return result if n.zero?
result1 = result + n
result2 = result + n + 10
(result2 <= 21) ? result2 : result1
end
def get_card(deck, persons)
if deck.empty?
puts "(カードがなくなりました)"
deck.init
deck.delete(persons)
end
card = deck.hand_out(1).first
puts "#{self.name}の引いたカードは #{card.show_card} です"
@cards << card
end
end
class Player < Person
def name = "プレイヤー"
end
class Dealer < Person
def name = "ディーラー"
end
class Deck
def initialize
init
end
def init
@deck = 4.times.flat_map {|i|
(1..13).map { Card.new(i * 100 + _1) }
}.shuffle
end
def hand_out(n) = @deck.shift(n)
def empty? = @deck.empty?
def check
init if @deck.size < 26
end
def delete(*persons)
@deck = @deck - [persons[0]] - [persons[1]]
end
end
class Card
def initialize(num) = @card = num
def show_card
suit = %W(♠ ♣ ♥ ♦)
efuda = %W(J Q K)
n = @card % 100
i =
case
when n == 1 then "A"
when n > 10 then efuda[n - 11]
else n.to_s
end
suit[@card / 100] + i
end
def number = @card % 100
end
class Coin
def initialize
@coin = 10000
@bet = 0
end
def calc(result)
case
when result.zero?
puts "引き分けです"
@coin += @bet
when result > 0
puts "プレイヤーの勝ちです"
@coin += (@bet * result).to_i
else
puts "ディーラーの勝ちです"
end
print "** コインは #{@coin} 点です\n\n"
end
def input_bet
print "コイン: #{@coin} 点 "
loop do
print "ベットは?(enter = 1000):"
str = gets
if str == "\n" && @coin >= 1000
puts " ベットは 1000 点です"
@bet = 1000
@coin -= @bet
return
end
@bet = str.to_i
if @bet < 0
puts "\nプレイヤーの点数が #{@coin} 点で終了します"
exit
end
if 0 < @bet && @bet <= @coin
@coin -= @bet
return
end
end
end
def zero? = @coin <= 0
end
module_function
def input_hit_or_stand
loop do
print "Hit or Stand? (H or S): "
str = gets.chomp.downcase
return str if %W(h s).include?(str)
end
end
def one_play(deck)
deck.check
puts "=== カードを配ります ===="
dealer = Dealer.new(deck)
puts "ディーラーの一枚は #{dealer[0].show_card} です"
player = Player.new(deck)
puts "プレイヤーの二枚は #{player[0].show_card} と #{player[1].show_card} です"
persons = [player, dealer]
#ナチュラル21の判定
p0 = player.natural21?
p1 = dealer.natural21?
puts "ディーラーのもう一枚は #{dealer[1].show_card} です" if p1
case
when p0 && p1 then return 0
when p0 then return 2.5
when p1 then return -1
end
#プレイヤーの選択とディーラーの処理
select_by_player = proc {
loop do
str = input_hit_or_stand
if str == "h"
puts " Hitしました"
player.get_card(deck, persons)
if player.calc_point > 21
puts "プレイヤーはバーストです"
return -1
end
else
break
end
end
}
select_by_player.()
puts "勝負です:"
puts "ディーラーのもう一枚は #{dealer[1].show_card} です"
point_of_player = player.calc_point
point_of_dealer = dealer.calc_point
while point_of_dealer < 17
puts " ディーラーはもう一枚引きます"
sleep(2)
dealer.get_card(deck, persons)
point_of_dealer = dealer.calc_point
end
#勝ち負けの判定(正ならばプレイヤーの勝ち、負ならばディーラーの勝ち、0で引き分け)
puts "ディーラーの合計は #{point_of_dealer}、プレイヤーの合計は #{point_of_player} です"
case
when point_of_dealer > 21 then 2
when point_of_dealer == point_of_player then 0
when point_of_player > point_of_dealer then 2
else -1
end
end
def game(coin, deck)
coin.input_bet
result = one_play(deck)
coin.calc(result)
end
def play
coin = Coin.new
deck = Deck.new
game(coin, deck) until coin.zero?
puts "コインがなくなりました"
end
end
BlackJack.play
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment