0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rubyでトランプの山札からカードを引くアプリを作った(2)

Posted at

以前作ったアプリを色々仕様追加や改修をしました。

仕様変更

・全てのカードが重複しないようにする。
 →「ジョーカーの追加」を設定したら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

ソースコードで使用したもの

後でまとめます

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?