=====1===== def battle(sta,ski) print("スライ厶が現れた!\n") enemyHP = 15 while true print("\nどうする?\n") print("1:攻撃 2:スキル 0:逃げる\n") s = gets.chomp!.to_i if s == 1 printf("%sの攻撃\n",sta["Name"]) attdame = sta["Attack"] + rand(-2..2) enemyHP -= attdame printf("スライムに%dのダメージ\n",attdame) elsif s == 2 print("何を使う?\n\n") for n in 0..ski.size - 1 printf("%d:",n) puts ski[n][0] end whatskill = gets.chomp!.to_i if ski[whatskill] == nil print("スキルがないよ\n") redo end if ski[whatskill][2] > sta["MP"] print("MPが足りないよ\n") redo end printf("%sの%s\n",sta["Name"],ski[whatskill][0]) attdame = ski[whatskill][1] + rand(-2..2) sta["MP"] -= ski[whatskill][2] enemyHP -= attdame printf("スライムに%dのダメージ\n",attdame) elsif s == 0 print("勇者が戦いから逃げるんじゃねぇ!\n") print("天からの攻撃\n") hitdame = 99999 sta["HP"] -= hitdame printf("%sは%dのダメージ\n",sta["Name"],hitdame) end if enemyHP <= 0 print("スライムを倒した!\n") break end print("\nスライムの攻撃\n") hitdame = (10 + rand(-2..2)) - sta["Defence"] sta["HP"] -= hitdame printf("%sは%dのダメージ\n",sta["Name"],hitdame) if sta["HP"] <= 0 printf("%sは力尽きた\n",sta["Name"]) break end end return sta end skills = Hash.new status = Hash.new i = 0 open("skills.txt","r:utf-8") do |skill| i = 0 while line = skill.gets if /(\S+)\s+(\d+)\s+(\d+)/ =~ line skills[i] = [$1,$2.to_i,$3.to_i] i += 1 end end end print("~勇者の冒険~\n") print("名前を決めよう!\n") name = gets.chomp! status = {"Name" => name, "Level" => 1, "HP" => 100, "MAXHP" => 100, "MP" => 50, "MAXMP" => 50, "Attack" => 10, "Defence" => 5} print("\n高野を探険しよう!\n") while true print("\nどうする?\n") print("1:進む 2:見渡す 3:ステータス確認 0:休む\n") s = gets.chomp!.to_i if s == 1 print("先に進もう!\n") r = rand(9) if r >= 3 status = battle(status,skills) elsif r >= 8 print("トコトコトコ\n") else print("空箱を見つけた!\n") print("しかし中には何もなかった...\n") end elsif s == 2 print("何もなかった\n") elsif s == 3 puts status elsif s == 0 print("すっきりした\n") else end if status["HP"] <= 0 print("おお勇者よ、死んでしまうとは情けない") break end end =====2===== ~勇者の冒険~ 名前を決めよう! 1 高野を探険しよう! どうする? 1:進む 2:見渡す 3:ステータス確認 0:休む 1 先に進もう! 空箱を見つけた! しかし中には何もなかった... どうする? 1:進む 2:見渡す 3:ステータス確認 0:休む 1 先に進もう! スライ厶が現れた! どうする? 1:攻撃 2:スキル 0:逃げる 2 何を使う? 0:ファイアーボール 1:アイスアロー 2:MPダケ10ツカーウ 0 1のファイアーボール スライムに11のダメージ スライムの攻撃 1は6のダメージ どうする? 1:攻撃 2:スキル 0:逃げる 1 1の攻撃 スライムに12のダメージ スライムを倒した! どうする? 1:進む 2:見渡す 3:ステータス確認 0:休む 3 {"Name"=>"1", "Level"=>1, "HP"=>94, "MAXHP"=>100, "MP"=>45, "MAXMP"=>50, "Attack"=>10, "Defence"=>5} どうする? 1:進む 2:見渡す 3:ステータス確認 0:休む 1 先に進もう! 空箱を見つけた! しかし中には何もなかった... どうする? 1:進む 2:見渡す 3:ステータス確認 0:休む 1 先に進もう! スライ厶が現れた! どうする? 1:攻撃 2:スキル 0:逃げる 0 勇者が戦いから逃げるんじゃねぇ! 天からの攻撃 1は99999のダメージ スライムの攻撃 1は3のダメージ 1は力尽きた おお勇者よ、死んでしまうとは情けない =====3===== 1~68行目がスライムとバトルを行うメソッド 70~121行目が冒険を行うプログラム 70~72で使う変数、配列を設定。 74~82でskills.txtから設定したスキルの名前、威力、消費MPを取得。 84~88で名前を入力し、ステータスを配列に設定する。 90~121で探索の流れをif文で分岐させている。 101でbattleメソッドを呼び出し、戦闘後のステータスに更新している。 1でstatus配列とskill配列をメソッド内で使えるようにsta配列とski配列に設定した。 3,4でスライム出現を表示する。 6~64でどちらかが倒れるまでwhile-trueで戦闘を続ける.。 7~9で選択肢を表示し、選んでもらう。 11~15は通常攻撃を行いスライムのHPを削る。 17~40はスキルを表示し選んでもらい、威力に合わせたダメージをスライムに与える。 42~48は逃げると大ダメージを受けるようにした。 50~53でスライムのHPが0以下の場合、戦闘を終わるようにした。 55~58でスライムが攻撃し、キャラクターのHPを削るようにした。 60~63でキャラクターのHPが0以下の場合、戦闘を終わるようにした。 66で戦闘後のステータスを返すようにした。 =====4===== 流れをつくっただけなので、ゲーム性が追加できていなく、つまらないものになってしまった。 遅延や要素を追加すれば面白くなりそうだと思った。 =====5===== [skills.txt] ファイアーボール 10 5 アイスアロー 8 3 MPダケ10ツカーウ 0 10