0
0

More than 5 years have passed since last update.

多次元配列を使った超簡単な選択肢ゲームをRubyで作って(改良して?)みた

Last updated at Posted at 2016-11-01

とあるサイトを勉強していて、そこに載っていたプログラムを自分なりに解読、改良をしてみました。
完全なる初心者なので、何か間違っているところなどありましたらご指摘お願いします。

全体コード

game.rb
#多次元配列を使ったゲーム
msg0 = "三本の分かれ道だ。どこに進もう…\n" + "1 左\n2 真ん中\n3 右"
msg1 = "あっ!\n足を滑らせて崖から落ちてしまった。\nGAME " + "OVER"
msg2 = "しばらく歩いていると…\nまた分かれ道を見つけた\n" + "1 左\n2 真ん中\n3 右"
msg3 = "奥へ進むと…" + "宝箱を見つけた!\n" + "どうしようか\n" + "1 開ける\n2 開けない\n3 ぶっ壊してみる"
msg4 = "宝箱はミミックだった。\n勇者たちは食べられてしまった。\nGAME " + "OVER"
msg5 = "宝箱を開けずに進むと、入り口に戻ってしまった。\n" + "まだ冒険を続ける?\n" + "1 続ける\n2 やめる"
msg6 = "宝箱はミミックだった。\n壊した衝撃でミミックを倒した!\n" + "宝箱からまばゆい光が溢れ出す!\n" + "勇者たちは財宝を手に入れた!\n" + "congratulation!!"
msg7 = "勇者たちはお家に帰った。\nお疲れ様です。\nGAME " + "OVER"

tbl = [
  [msg0, 1, 2, 3],
  [msg1, nil, nil, nil],
  [msg2, 2, 3, 1], # 道順を変えている
  [msg3, 4, 5, 6],
  [msg4, nil, nil, nil],
  [msg5, 0, 7, nil],
  [msg6, nil, nil, nil],
  [msg7, nil, nil, nil]
]


puts "勇者たちの冒険"
sleep 1
scene = 0
while true
  scenedate = tbl[scene]
  message = scenedate[0]
  puts message

  if (scenedate[1] == nil)
    exit
  end

  print "数字を入力してください:"
  scene = scenedate[gets.to_i]  #正しい値が入るように分岐させる


  sleep 0.5
  print "\n"
end

コード自体はかなりシンプルです。 が、自分が読み取るのにはかなり時間がかかりました。
上から順に追っていきます。

多次元配列の作成

game.rb
msg0 = "三本の分かれ道だ。どこに進もう…\n" + "1 左\n2 真ん中\n3 右"
msg1 = "あっ!\n足を滑らせて崖から落ちてしまった。\nGAME " + "OVER"
msg2 = "しばらく歩いていると…\nまた分かれ道を見つけた\n" + "1 左\n2 真ん中\n3 右"
msg3 = "奥へ進むと…" + "宝箱を見つけた!\n" + "どうしようか\n" + "1 開ける\n2 開けない\n3 ぶっ壊してみる"
msg4 = "宝箱はミミックだった。\n勇者たちは食べられてしまった。\nGAME " + "OVER"
msg5 = "宝箱を開けずに進むと、入り口に戻ってしまった。\n" + "まだ冒険を続ける?\n" + "1 続ける\n2 やめる"
msg6 = "宝箱はミミックだった。\n壊した衝撃でミミックを倒した!\n" + "宝箱からまばゆい光が溢れ出す!\n" + "勇者たちは財宝を手に入れた!\n" + "congratulation!!"
msg7 = "勇者たちはお家に帰った。\nお疲れ様です。\nGAME " + "OVER"

tbl = [
  [msg0, 1, 2, 3],
  [msg1, nil, nil, nil],
  [msg2, 2, 3, 1], # 道順を変えている
  [msg3, 4, 5, 6],
  [msg4, nil, nil, nil],
  [msg5, 0, 7, nil],
  [msg6, nil, nil, nil],
  [msg7, nil, nil, nil]
]

配列の作り方は、まず自分が作りたい選択肢のメッセージを作っていって、それに対応する分岐を作るように配列を作っています。
イメージしやすいように書いていくと

tbl[0]: プログラムの最初の場面。
tbl[1],tbl[2],tbl[3]: 最初の選択肢で選んだ1,2,3に対応する分岐
tbl[4],tbl[5],tbl[6]: tbl[3]で選んだ選択肢1,2,3に対応する分岐
tbl[7]: tbl[5]で2を選択した時の分岐

といった風に作っています。
ここだけじゃ、どういう風に分岐しているのかがわからないので、次に行きます。

分岐の方法

game.rb
puts "勇者たちの冒険"
sleep 1
scene = 0
while true
  scenedate = tbl[scene]
  message = scenedate[0]
  puts message

  if (scenedate[1] == nil)
    exit
  end

  print "数字を入力してください:"
  scene = scenedate[gets.to_i]  #正しい値が入るように分岐させる


  sleep 0.5
  print "\n"

コード自体が少ないので、ざっくり載せます。

最初の

game.rb
puts "勇者たちの冒険"
sleep 1
scene = 0

は起動したら出てくる文字とsceneという変数の準備です。これに入力した値が入り、対応する場面に変わります(後に出てくる)。そのために作っています。
sleepは指定した秒数だけ待つメソッド。それっぽくするために、1秒間だけ間を空けてます。

game.rb
while true
  scenedate = tbl[scene]
  message = scenedate[0]
  puts message

主となるwhile文です。
まず、scenedateは二次元目の配列(言い方が正しいかは微妙)を表しています。
もっといえば、各場面を表しています(tbl[1]~tbl[7]のこと)。

そして、三行目と四行目はそのときのメッセージを表示するためだけにあります。これはwhileで回しているので、毎回対応する文字(msg0 ~ msg7のこと)が表示されます。

game.rb
  if (scenedate[1] == nil)
    exit
  end

各場面で終わらせるようにするために作っています。もちろん場面によっては終わらずに、分岐するものもあります。
ここでは要素の二番目にnilがきたら終わるようにしています(例えばtbl[1][1]とか)。

そうならないように組むこともできますが、分岐が少ないので、今回のプログラムの場合は二番目にnilが来れば終了するようにしています。そうなるように各場面の設定も行っています。
プログラム自体はこれがなければ永遠と続きます。

game.rb
  print "数字を入力してください:"
  scene = scenedate[gets.to_i]  #正しい値が入るように分岐させる


  sleep 0.5
  print "\n"

最後に、選択肢の値の入力画面です。ここで入力した値で次の場面に移り変わることができます。
本当は、ここで、入力した値が変なものだったらプログラムを終了するか、入力し直させるかという分岐をさせたかったんですが、めんどくさかったのでカットしました(笑)

最後に

実行画面を載せたかったのですが、あまりにも画像が多くなりそうだったのでやめます。
ぜひ自分のPCでプログラムを実行してみてください!
テストは何回かしかやっていないので、バグがあれば報告お願いします。

時間があれば、入力した値を正しく入力させるようにしたいです。いつか。

0
0
1

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
0