redoとは
繰り返し処理をやり直す方法。
これを使用し、ローラ姫救出の際のイベントを再現してみる。
追記(2019/2/14)
標準入力バージョンを追加しました。
Ruby version
ruby 2.4.1
ローラ姫救出イベントとは
ドラゴンクエスト1にて、囚われの女王ローラ姫を救出する際に聞かれる選択イベント。周知の通りいいえ
が通用しない。
実装
sampleメソッドを使用し、選択肢をランダム化。
はい
が出ない限り、無限ループ。
rola.rb
prince = ['ローラ']
prince.each do |prince|
print "#{prince}:わたしを おしろまで つれてかえってくれますね? =>"
answer = ['はい','いいえ'].sample
puts answer
if answer == 'いいえ'
puts "#{prince}:そんな、ひどい…"
end
redo unless answer == 'はい'
puts "#{prince}:うれしゅうございます。ぽっ"
end
# 出力は以下の通り
mbp:ruby mac$ ruby rola.rb
ローラ:わたしを おしろまで つれてかえってくれますね? =>いいえ
ローラ:そんな、ひどい…
ローラ:わたしを おしろまで つれてかえってくれますね? =>いいえ
ローラ:そんな、ひどい…
ローラ:わたしを おしろまで つれてかえってくれますね? =>はい
ローラ:うれしゅうございます。ぽっ
もし断ることが可能だとしたら、、、
一定回数いいえ
をした場合、別イベントを起こす設定をしてみる。
今回はいいえ
を2回したら、王様からクレームがくるようにしてみる。
rola.rb
prince = ['ローラ']
count = 0
prince.each do |prince|
print "#{prince}:わたしを おしろまで つれてかえってくれますね? =>"
answer = ['はい','いいえ'].sample
puts answer
count += 1
if answer == 'いいえ'
puts "#{prince}:そんな、ひどい…"
end
redo if answer != 'はい' && count < 2
count = 0
if answer == 'はい'
puts "#{prince}:うれしゅうございます。ぽっ"
else
puts "王様:おお、ゆうしゃよ。ことわるとはなにごとだ。"
end
end
# 出力は以下の通り
mbp:ruby mac$ ruby rola.rb
ローラ:わたしを おしろまで つれてかえってくれますね? =>いいえ
ローラ:そんな、ひどい…
ローラ:わたしを おしろまで つれてかえってくれますね? =>いいえ
ローラ:そんな、ひどい…
王様:おお、ゆうしゃよ。ことわるとはなにごとだ。
標準入力を追加し、自分で選択したい
answer = gets.chomp
を追加し、対応。
.chomp
をつけ忘れると、戻り値が/n
の改行スペース有りで返されるためうまくいきません。
rola.rb
prince = ['ローラ']
prince.each do |prince|
puts "#{prince}:わたしを おしろまで つれてかえってくれますね?"
puts "はい or いいえ"
answer = gets.chomp
if answer == 'いいえ'
puts "#{prince}:そんな、ひどい…"
end
redo unless answer == 'はい'
puts "#{prince}:うれしゅうございます。ぽっ"
end