以前作ったアプリを色々仕様追加や改修をしました。
仕様変更
・全てのカードが重複しないようにする。
→「ジョーカーの追加」を設定したら53枚になり、「なし」にすると52枚になる。
・山札からカードを引く。
→カードを引く枚数を指定できる。
・手札の上限枚数までカードを引けるようにする。
・手札を捨てることができる。
→捨てる枚数を指定できる。
・山札を使い切る、もしくはカードを引くことやめると終了する。
→捨て札から山札に戻すことができる。
・三項演算子などを用いて行数を短くする。
・何度か行う処理ならメソッド定義化にする。
・for文が流行っていないそうなので、each文を使ってみたりする
実際のコード
playing_card.rb
# カード判定メソッド
def card_judge(i)
# 記号判定
mark_no = (i % 13 == 0) ? (i / 13) - 1 : i / 13
# マーク番号:0スペード/1ハート/2ダイア/3クラブ
card_mark = case mark_no
when 0 then "♠️" #SPADE
when 1 then "♥️" #HEART
when 2 then "♦️" #DIAMOND
when 3 then "♣️" #CRAB
when 4 then "JOKER" #JOKER
end
# 数字判定
card_no = i - ( 13 * mark_no )
# 表示判定
disp_list = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]
if card_mark == 4
disp_num = nil
else
disp_num = disp_list[(card_no - 1)]
end
# 戻り値:カードナンバー/カードのマーク/表示される文字
return card_no, card_mark, disp_num
end
# ドロー処理
def card_draw
# デッキから手札に移す
draw_card = DECK.shift(1)
# ドローしたカードの表示設定を行う
disp_joker(draw_card[0])
# カードナンバーを返す
return draw_card[0]
end
# ジョーカー表示処理
def disp_joker(n)
if card_judge(n)[1] == "JOKER"
puts "JOKER"
else
puts "#{card_judge(n)[1]} #{card_judge(n)[2]}"
end
end
# 手札の表示
def disp_hand
# 手札の表示させる
puts "\n手札一覧(#{HAND.length}枚):"
HAND.each{|i|
disp_joker(i)
}
end
# 捨て札の表示
def disp_trash
# 捨て札の表示させる
puts "\n捨て札(#{TRASH.length}枚):"
TRASH.each{|i|
disp_joker(i)
}
end
# 手札を捨てる処理
def hand_trash(i)
i.times do |n|
TRASH.push(HAND[0])
HAND.delete_at(0)
end
end
# デッキのシャッフル
def deck_shuffle
DECK.shuffle!
end
# 捨て札をデッキに戻す処理
def deck_rebuild
TRASH.length.times do |m|
DECK.push(TRASH[0])
TRASH.delete_at(0)
end
deck_shuffle
puts "デッキの残り枚数は、#{DECK.length}枚\n"
end
# 初期設定
HAND = [] #手札のセットアップ
TRASH = [] #捨て札のセットアップ
hand_limit = 7 #手札上限枚数
card_max = 52 #トランプのセットアップ(52=デフォルト)
joker_use = 1 #ジョーカーの利用(0=利用しない)
# デッキのセットアップ
DECK = [*(1..(card_max + joker_use))]
# デッキをシャッフルする
puts "デッキをシャッフルします\n"
deck_shuffle
# ドローのループ
loop {
# 手札の表示させる
disp_hand
# 捨て札の表示させる
disp_trash
if DECK.length == 0
# デッキを使い切ったときの挙動
puts "デッキを使い切りました\n捨て札をデッキに戻しますか?(Nで終了)[Y/N]"
case gets
when /^[yY]/
deck_rebuild
when /^[nN]/ then break
end
elsif HAND.length >= hand_limit
# 手札上限チェック
puts "上限を超えているのでドローできません\n手札を古い順から何枚捨てますか?(0で終了)[1~#{HAND.length}]"
trush_cnt = gets.to_i
case trush_cnt
when 1..HAND.length
hand_trash(trush_cnt)
when 0 then break
end
else
# カードをドローして手札に加える
hand_possible = hand_limit - HAND.length
# ドロー最大数の設定
if DECK.length <= hand_possible
hand_possible = DECK.length
end
# 何枚ドローするか指定して、デッキからドローする
puts "デッキからカードを何枚ドローしますか?(0で終了)[〜#{hand_possible}/0]"
draw_num = gets.to_i
case draw_num
when 1..hand_possible
draw_num.times{
HAND.push(card_draw)
}
when 0 then break
end
puts "デッキの残り枚数は、#{DECK.length}枚\n"
end
}
exit
ソースコードで使用したもの
後でまとめます