#!/usr/koeki/bin/ruby # coding: utf-8 # ブラックジャック進行部 # Cardクラス定義ファイルを読み込む require 'card.rb' # これでCardクラスが使えるようになる # ブラックジャックに必要なメソッドの定義 # カードのスートや数を調べるときは、Cardクラスのメソッド # Card.suit() と Card.n() を利用している。 def dispCard(card) printf("%s の %s\n", Card.suit(card), Card.n(card)) end def point(arr) ace = 0 # "A"の枚数 sum = 0 # 合計点 for card in arr # arr配列全ての要素に対して繰り返す n = Card.n(card) # card["n"]で数が入る case n # nの値によって場合分け when "A" # "A"ならば… ace += 1 # 枚数カウンタを1増やしておく sum += 11 # まずは11点として加算 when "10", "J", "Q", "K" sum += 10 # 絵札と10は10点 else # それ以外(つまり2〜9)はそのものを整数にして足す sum += n.to_i end # when終わり end # for終わり while sum > 21 && ace > 0 # 21より大きく、かつ、aceが1以上なら sum -= 10 # 10を引く ace -= 1 # aceを1つ使ったので減らす end sum end # ここからゲームスタート # カードを作ってシャッフルしたものを cards配列に格納 cards=Card.new # コンピュータの持ちカードを格納する配列 com=[] com << cards.next com << cards.next # プレイヤーの持ちカードを格納する配列 player=[] player << cards.next player << cards.next # 最初の手持ちを表示する puts "わたしの手:" # コンピュータの1枚目を表示 puts " [ ??? ]" # コンピュータの2枚目を表示 dispCard(com[1]) # 2枚目は com[1] に入っている # プレイヤー側 puts "あなたの手:" dispCard(player[0]) dispCard(player[1]) # プレイヤーが満足するまで引かせる while true STDERR.print "もう一枚引きますか?(yかnで) " answer = gets if /^y/i =~ answer player << cards.next puts "もう一枚引きます。引いたカードはこれです。" dispCard(player[-1]) else break # while true を抜ける end end # コンピュータが16以下なら引き続ける while point(com) <= 16 puts "わたしはもう一枚引きます" com << cards.next end # いよいよ勝負 puts "勝負!" puts "わたしの手:" for c in com # コンピュータの手持ちカード全て繰り返す dispCard(c) end puts "あなたの手:" player.each do |c| # プレイヤーの手持ちカード全て繰り返す dispCard(c) end # 得点を比べる cp, pp = point(com), point(player) printf("わたし %d : %d あなた\n", cp, pp) if cp >= 22 # 22以上なら0点ということにしてしまう cp = 0 # (コンピュータ) end if pp >= 22 # 22以上なら0点ということにしてしまう pp = 0 # (プレイヤー) end if pp > cp # コンピュータより点が高ければ puts "あなたの勝ちです。参りました!" else # そうでなければ(引き分け含む) puts "わたしの勝ちです。べろべろばあ〜" end