#!/usr/koeki/bin/ruby # coding: utf-8 def createCardsHashArray() card = Array.new # 空の配列を作る for suit in ["ハート", "スペード", "ダイヤ", "クラブ"] card << {"suit" => suit, "n" => "A"} # ここで代入しているのがハッシュ 2.upto(10) do |n| card << {"suit" => suit, "n" => n.to_s} end for n in ["J", "Q", "K"] card << {"suit" => suit, "n" => n} end end card # 最後に card配列 を呼び主に返す end def shuffle(a) srand 0.upto(a.length-1) do |i| j = rand(a.length) # 交換相手をランダムに選ぶ w = a[i] a[i] = a[j] a[j] = w end a end def dispCard(card) printf("%s の %s\n", card["suit"], card["n"]) end def point(arr) ace = 0 # "A"の枚数 sum = 0 # 合計点 for card in arr # arr配列全ての要素に対して繰り返す n = card["n"] # 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=shuffle(createCardsHashArray) # カードを数える変数。-1で初期化 cardNo=-1 # コンピュータの持ちカードを格納する配列 com=[] com << cards[cardNo+=1] com << cards[cardNo+=1] # プレイヤーの持ちカードを格納する配列 player=[] player << cards[cardNo+=1] player << cards[cardNo+=1] # 最初の手持ちを表示する 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[cardNo+=1] puts "もう一枚引きます。引いたカードはこれです。" dispCard(player[-1]) else break # while true を抜ける end end # コンピュータが16以下なら引き続ける while point(com) <= 16 puts "わたしはもう一枚引きます" com << cards[cardNo+=1] 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