ポケモンバトル3
こんにちはkazutoです。今回は、「ポケモンバトル1~2」の続編です
メソッドを確認しよう
実装に入る前にポケモンバトルに必要なメソッドの確認をしましょう。
- legendary_pokemonメソッド(実装済)
伝説のポケモンを定義します。あなたが戦うポケモン、HPを定義をします。 - pokemonメソッド(実装済)
メニュー欄です。ポケモンを倒す、捕まえる、逃げ切るなど、プログラムが終わる処理が発火しない限り永遠に繰り返します。 - techniquesメソッド
技をランダムで繰り出します。 - attackメソッド
計算です。 HPから30を引いた値をtechniquesに返します。 - itemsメソッド
アイテムを使います。なお、モンスタボールを使うとポケモンを捕まえる事ができます。 - escape(実装済)
一定数の確率で逃げる事ができます。逃げきれなかった場合は、再度、メニュー欄に戻ります。(プログラムを終了する)
前回は、pokemonメソッドと、escapeメソッドを実装しました。メニュー欄を構築し、逃げる機能を実装しました
今回は
- techniquesメソッド
- attackメソッド
- itemsメソッド
を実装していきます。まず初めに、手持ちのポケモンの技を繰り出してみましょう。
技を繰り出そう
技を繰り出すには、techniquesメソッド内で出力する必要があります。「ポケモンバトル」の仕様としては、技をランダムに繰り出す
となっていますので、pokemonメソッドから引き継いだ、引数techniqueの値をランダムで取り出すという作業が必要
になってきます。
techniquesメソッドを実装する前に完成した全体のコードを見てみましょう。
コードを見てみよう
def legendary_pokemon
poke=["ルギア","ギラティナ", "アルセウス"]
life={}
life[:hp]=100
return poke ,life
end
def techniques(name,technique,life,battle_poke)
puts "#{technique.sample}を繰り出した"
life=attack(life)
if life<=0
puts "#{battle_poke}が倒れた"
puts "#{name}は200経験値を得た"
exit
end
end
def attack(life)
life[:hp]-=30
end
def items(name,battle_poke)
puts "[1]キズぐすり"
puts "[2]凄いキズぐすり"
puts "[3]モンスターボール"
puts "[4]戻る"
puts "#{name}何のアイテムを使う❓"
input = gets.to_i
if input==1
puts"#{name}にキズぐすりを使った"
puts"#{name}のHPが40回復した"
elsif input==2
puts"#{name}に凄いキズぐすりを使った"
puts"#{name}のHPが200回復した"
elsif input==3
puts"モンスターボールを投げた"
puts "・・・"
gets
if Random.rand(0..2) == 0
puts"やった〜#{battle_poke}を捕まえたぞ"
exit
elsif Random.rand(0..2) == 1
puts "だめだ捕まらない"
elsif Random.rand(0..2) == 2
puts "あ〜もう少しだったなのに〜"
end
else
return puts "戻る"
end
end
def escape
puts "・・・"
gets
if Random.rand(0..2) == 0
puts"上手く逃げ切れた"
exit
else
puts "逃げられなかった"
end
end
def pokemon(name,*technique,life,battle_poke)
puts "野生の#{battle_poke}が現れた"
puts "いけ#{name}"
while true do
puts"#{battle_poke}のHP:#{life[:hp]}"
puts "[1]技を出す"
puts "[2]アイテムを使う"
puts "[3]逃げる"
puts "#{name}どうする"
input = gets.to_i
if input==1
techniques(name,technique,life,battle_poke)
elsif input==2
items(name,battle_poke)
elsif input==3
escape
else
puts "無効な値です"
end
end
end
poke,life=legendary_pokemon()
puts "どのポケモンと戦う❓"
poke.each_with_index do |p ,key|
puts "#{key+1}.#{p}"
end
num=gets.to_i
if num==1
battle_poke=poke[0]
puts"#{battle_poke}と戦う"
elsif num==2
battle_poke=poke[1]
puts"#{battle_poke}と戦う"
elsif num==3
battle_poke=poke[2]
puts"#{battle_poke}と戦う"
else
puts "不正なデータです"
exit
end
pokemon("ジュガイン","リーフブレード","リーフストーム","はかいこうせん","ハードプラント",life,battle_poke)
※すこし記述量が多いので、解説する際は、一部省略します。
def techniques(name,technique,life,battle_poke)
puts "#{technique.sample}を繰り出した"
life=attack(life)
if life<=0
puts "#{battle_poke}が倒れた"
puts "#{name}は200経験値を得た"
exit
end
end
def attack(life)
life[:hp]-=30
end
上記は、技を繰り出すtechniquesメソッド、HPを減らすattackメソッドのソースコードです。実装のポイントは、techniquesメソッドの中でattackメソッドを呼び出している点
です。
def techniques(name,technique,life,battle_poke)
省略・・・
life=attack(life)
end
def attack(life)
life[:hp]-=30
end
techniquesメソッドの中に life=attack(life)
という記述があると思います。簡単に解説するとtechniquesメソッドの中で、attackメソッドを呼び出し、戻り値を変数lifeに再代入している
となります。
メソッド内で他のメソッドの呼び出すという作業は、今までのポケモンバトルシリーズでは扱っていませんでした。しかし、プログラムを書く際によく使うので覚えておきましょう。
def attack(life)
life[:hp]-=30
end
attackメソッドでは、techniquesメソッドから引き継いだ、ハッシュlifeの中から、hpキーを取り出し30を引いた数をvalueとして再代入をしているという流れです。
if life<=0
puts "#{battle_poke}が倒れた"
puts "#{name}は200経験値を得た"
exit
end
こちらの条件分岐は、lifeの値(:hp)が0になったら、
- 戦っているポケモンを出力
- 手持ちのポケモンを出力
- プログラム終了する
という処理がpokemonメソッド内で作動します。
以上が「技を繰り出す機能」の解説でした。最後にitemメソッドで、アイテムメニュー欄を実装してみましょう。
アイテムメニュー欄を実装しよう
アイテムメニュー欄は、今まで積み上げきた知識があれば、簡単です。まずはコードをみてみましょう。
def items(name,battle_poke)
puts "[1]キズぐすり"
puts "[2]凄いキズぐすり"
puts "[3]モンスターボール"
puts "[4]戻る"
puts "#{name}何のアイテムを使う❓"
input = gets.to_i
if input==1
puts"#{name}にキズぐすりを使った"
puts"#{name}のHPが40回復した"
elsif input==2
puts"#{name}に凄いキズぐすりを使った"
puts"#{name}のHPが200回復した"
elsif input==3
puts"モンスターボールを投げた"
puts "・・・"
gets
if Random.rand(0..2) == 0
puts"やった〜#{battle_poke}を捕まえたぞ"
exit
elsif Random.rand(0..2) == 1
puts "だめだ捕まらない"
elsif Random.rand(0..2) == 2
puts "あ〜もう少しだったなのに〜"
end
else
return puts "戻る"
end
end
上記のコードをご覧を頂くと、新しい知識や複雑な条件分岐が無いため、全体のコードの流れだけ、説明していきます。
puts "[1]キズぐすり"
puts "[2]凄いキズぐすり"
puts "[3]モンスターボール"
puts "[4]戻る"
puts "#{name}何のアイテムを使う❓"
input = gets.to_i
メニュー欄です。inputの中にユーザーが選んだ数字を格納しています。今回は、繰り返し表示をさせる必要が無いのでwhile文はしようしていません。
if input==1
puts"#{name}にキズぐすりを使った"
puts"#{name}のHPが40回復した"
elsif input==2
puts"#{name}に凄いキズぐすりを使った"
puts"#{name}のHPが200回復した"
elsif input==3
puts"モンスターボールを投げた"
puts "・・・"
gets
if Random.rand(0..2) == 0
puts"やった〜#{battle_poke}を捕まえたぞ"
exit
elsif Random.rand(0..2) == 1
puts "だめだ捕まらない"
elsif Random.rand(0..2) == 2
puts "あ〜もう少しだったなのに〜"
end
else
return puts "戻る"
end
条件分岐をしています。
- キズぐすりを使い40回復をする。
- すごいキズぐすりを使い200回復する
- モンスターボールを投げる
- 戻る
※モンスターボールを投げるプログラムを選択した場合、一定数の確率でexitメソッドが作動してプログラムが終了します。
以上がアイテムメニュー欄の実装でした。
完成品を見てみよう‼️
今回でポケモンバトルシリーズは、終わりです。下記のコードを見てご自身のソースコードと比較をして見てください。また、ターミナルで挙動を確認して見てください。
def legendary_pokemon
poke=["ルギア","ギラティナ", "アルセウス"]
life={}
life[:hp]=100
return poke ,life
end
def techniques(name,technique,life,battle_poke)
puts "#{technique.sample}を繰り出した"
life=attack(life)
if life<=0
puts "#{battle_poke}が倒れた"
puts "#{name}は200経験値を得た"
exit
end
end
def attack(life)
life[:hp]-=30
end
def items(name,battle_poke)
puts "[1]キズぐすり"
puts "[2]凄いキズぐすり"
puts "[3]モンスターボール"
puts "[4]戻る"
puts "#{name}何のアイテムを使う❓"
input = gets.to_i
if input==1
puts"#{name}にキズぐすりを使った"
puts"#{name}のHPが40回復した"
elsif input==2
puts"#{name}に凄いキズぐすりを使った"
puts"#{name}のHPが200回復した"
elsif input==3
puts"モンスターボールを投げた"
puts "・・・"
gets
if Random.rand(0..2) == 0
puts"やった〜#{battle_poke}を捕まえたぞ"
exit
elsif Random.rand(0..2) == 1
puts "だめだ捕まらない"
elsif Random.rand(0..2) == 2
puts "あ〜もう少しだったなのに〜"
end
else
return puts "戻る"
end
end
def escape
puts "・・・"
gets
if Random.rand(0..2) == 0
puts"上手く逃げ切れた"
exit
else
puts "逃げられなかった"
end
end
def pokemon(name,*technique,life,battle_poke)
puts "野生の#{battle_poke}が現れた"
puts "いけ#{name}"
while true do
puts"#{battle_poke}のHP:#{life[:hp]}"
puts "[1]技を出す"
puts "[2]アイテムを使う"
puts "[3]逃げる"
puts "#{name}どうする"
input = gets.to_i
if input==1
techniques(name,technique,life,battle_poke)
elsif input==2
items(name,battle_poke)
elsif input==3
escape
else
puts "無効な値です"
end
end
end
poke,life=legendary_pokemon()
puts "どのポケモンと戦う❓"
poke.each_with_index do |p ,key|
puts "#{key+1}.#{p}"
end
num=gets.to_i
if num==1
battle_poke=poke[0]
puts"#{battle_poke}と戦う"
elsif num==2
battle_poke=poke[1]
puts"#{battle_poke}と戦う"
elsif num==3
battle_poke=poke[2]
puts"#{battle_poke}と戦う"
else
puts "不正なデータです"
exit
end
pokemon("ジュガイン","リーフブレード","リーフストーム","はかいこうせん","ハードプラント",life,battle_poke)
[ターミナル]
ポケモンバトルシリーズで実装をする中で、一通りのRubyの基礎は学べたかなと思います。今度は、自分で考えてプログラムを組んでみましょう。
最後に確認問題です。メソッドの中で、メソッドを呼び出してみましょう。
確認問題
問題1
自己紹介をしましょう。その中で現在の年齢と、5年後の年齢を出力をしてみましょう。なお5年後の年齢を求める式は、自己紹介をするメソッドとは、違うメソッドを作成してください。
def introduction(name,age)
puts "私の名前は#{名前}です"
puts "現在の年齢は#{年齢}歳です"
puts "5年後には#{メソッドを呼び出す}歳になります"
end
def future_age(age)
#現在の年齢+5
end
解答
※解説はしません
def introduction(name,age)
puts "私の名前は#{kazuto}です"
puts "現在の年齢は#{age}歳です"
puts "5年後には#{future_age(age)}歳になります"
end
def future_age(age)
age+=5
end
introduction("kazuto",21)
まとめ:ポケモンバトル3
今回で、ポケモンバトルシリーズは終わりです。実際にプログラムを組んでいく中で、プログラミングの印象が変わった方も、いらっしゃったと思います。最低限度の基礎知識は、ポケモンバトルシリーズを実装中に触れました。なのでこれからは、ご自身の身の回りの物をプログラム化してみましょう。
例
- 自動販売機の売買
- 本のレビュープログラム
- 自動車の登録プログラム
などです。
実際に、自分でプログラムを組んでみると、「なるほど」となる事が多いので、とても良い学習方法だと、個人的には思います。
以上kazutoでした。
関連記事