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

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

#全体コード

```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でプログラムを実行してみてください！
テストは何回かしかやっていないので、バグがあれば報告お願いします。

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