Last active
December 28, 2024 17:48
-
-
Save obelisk68/42a9b8ee1bb67284dfcb965e3895ad5e to your computer and use it in GitHub Desktop.
ブラックジャックのOOP版
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
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