とあるサイトを勉強していて、そこに載っていたプログラムを自分なりに解読、改良をしてみました。
完全なる初心者なので、何か間違っているところなどありましたらご指摘お願いします。
全体コード
#多次元配列を使ったゲーム
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
コード自体はかなりシンプルです。 が、自分が読み取るのにはかなり時間がかかりました。
上から順に追っていきます。
多次元配列の作成
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を選択した時の分岐
といった風に作っています。
ここだけじゃ、どういう風に分岐しているのかがわからないので、次に行きます。
分岐の方法
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"
コード自体が少ないので、ざっくり載せます。
最初の
puts "勇者たちの冒険"
sleep 1
scene = 0
は起動したら出てくる文字とsceneという変数の準備です。これに入力した値が入り、対応する場面に変わります(後に出てくる)。そのために作っています。
sleepは指定した秒数だけ待つメソッド。それっぽくするために、1秒間だけ間を空けてます。
while true
scenedate = tbl[scene]
message = scenedate[0]
puts message
主となるwhile文です。
まず、scenedateは二次元目の配列(言い方が正しいかは微妙)を表しています。
もっといえば、各場面を表しています(tbl[1]~tbl[7]のこと)。
そして、三行目と四行目はそのときのメッセージを表示するためだけにあります。これはwhileで回しているので、毎回対応する文字(msg0 ~ msg7のこと)が表示されます。
if (scenedate[1] == nil)
exit
end
各場面で終わらせるようにするために作っています。もちろん場面によっては終わらずに、分岐するものもあります。
ここでは要素の二番目にnilがきたら終わるようにしています(例えばtbl[1][1]とか)。
そうならないように組むこともできますが、分岐が少ないので、今回のプログラムの場合は二番目にnilが来れば終了するようにしています。そうなるように各場面の設定も行っています。
プログラム自体はこれがなければ永遠と続きます。
print "数字を入力してください:"
scene = scenedate[gets.to_i] #正しい値が入るように分岐させる
sleep 0.5
print "\n"
最後に、選択肢の値の入力画面です。ここで入力した値で次の場面に移り変わることができます。
本当は、ここで、入力した値が変なものだったらプログラムを終了するか、入力し直させるかという分岐をさせたかったんですが、めんどくさかったのでカットしました(笑)
最後に
実行画面を載せたかったのですが、あまりにも画像が多くなりそうだったのでやめます。
ぜひ自分のPCでプログラムを実行してみてください!
テストは何回かしかやっていないので、バグがあれば報告お願いします。
時間があれば、入力した値を正しく入力させるようにしたいです。いつか。