ポケモンバトル2
こんにちはkazutoです今回は、「 ポケモンバトル1」の続編です。まだ「ポケモンバトル1」を見ていない方は、下記のリンクから参照してください。
メソッドを確認しよう
実装に入る前にポケモンバトルに必要なメソッドの確認をしましょう。
- legendary_pokemonメソッド(実装済)
伝説のポケモンを定義します。あなたが戦うポケモン、HPを定義をします。 - pokemonメソッド(実装予定)
メニュー欄です。ポケモンを倒す、捕まえる、逃げ切るなど、プログラムが終わる処理が発火しない限り永遠に繰り返します。 - techniquesメソッド
技をランダムで繰り出します。 - attackメソッド
計算です。 HPから30を引いた値をtechniquesに返します。 - itemsメソッド
アイテムを使います。なお、モンスタボールを使うとポケモンを捕まえる事ができます。 - escape(実装予定)
一定数の確率で逃げる事ができます。逃げきれなかった場合は、再度、メニュー欄に戻ります。(プログラムを終了する)
前回は、legendary_pokemonメソッドを実装しました。ユーザーが戦う伝説のポケモンを定義し、戦うポケモンを3匹の中から1匹、選択をする機能
です。
今回は、legendary_pokemonの情報をpokemonメソッドに引継ぎ、メニュー欄を構築していきます。その後、一定数の確率で逃げ切って、プログラムを終わらせる、escapeメソッドも実装していきます。
メニュー欄を実装しよう
ポケモンバトルは
- どちらかのポケモンが倒れる
- ポケモンを捕まえる
- 逃げ切る
上記の3つのイベントが発生しない限り、永遠にバトルが続く
と思います。プログラムで永遠にバトルが続く挙動
を再現するには、繰り返し処理を行う必要があります。
繰り返し処理の説明をする前に,全体のソースコードを見てみましょう。
コードをみてみよう‼️
def legendary_pokemon
poke=["ルギア","ギラティナ", "アルセウス"]
life={}
life[:hp]=100
return poke ,life
end
def techniques
end
def attack
end
def items
end
#今回実装
def escape
puts "・・・"
gets
if Random.rand(0..1) == 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)
プログラムは、上から順にコードが読み込まれていきます。しかし、メソッドに関しては無視されます。メソッドが作動するタイミングとしては、メソッドを呼び出す処理
が行われてからです。
なので
poke,life=legendary_pokemon()
上記の記述から、プログラムが始まります。ソースコード読む際は
- メソッド
- 処理側
と判別してから読解していきましょう。
それでは、メニュー欄を実装していきましょう。
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
def pokemon(name,*technique,life,battle_poke)
まずは、pokemonメソッドの引数の情報を整理してみましょう。
- name
ユーザーの手持ちのポケモンの名前 - *technique
手持ちのポケモンが持っている技 - life
戦うポケモンのHP - battle_poke
伝説のポケモンの3匹のうち1匹が格納
となります。少し引数が多いですが、本引数と仮引数の比較しながら実装をしていきましょう。
pokemonメソッドは、「ポケモンバトル」のプログラムの中で、基盤になる部分
になるため、必然と引数の情報が多くなってしまいます。 今後、実装を進める中で、処理の流れが理解できなくなった場合は、pokemonメソッドを機転
に考えてみましょう.
while文を使ってみよう
今回
- どちらかのポケモンが倒れる
- ポケモンを捕まえる
- 逃げ切る
というイベントが発生しない限り、永遠にポケモンバトル
が続きます。永遠に処理をループさせる挙動を再現にするには、繰り返し処理を行う必要があります。
その中で今回は、while文を使って繰り返し処理を再現しています。
まずは、while文の構文を確認してみましょう
while 式 do
処理
end
意味が理解できなかったら一度、リファレンスをみてましょう。
while文の構文が理解できたら所で、一度、下記のソースコードをみてましょう。
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
while true do
省略・・・
end
while trueとはwhileがtureなかぎりdo~endまでの処理を繰り返す
という意味になります。なので,whileがfalseでないかぎりり永遠に処理を繰り返します
。
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
上記は、inputに格納されている値によって処理を条件分岐をしています。
- 技を繰り出すメソッドを呼び出す
- アイテムを使うメソッドを呼び出す。
- 一定数で逃げるメソッドを呼び出す
という流れです。
pokemonメソッドは、while文がtrueなかぎり永遠にループします。なので、最後にescapeメソッドを使い、処理を終了させてみましょう。
逃げる機能を実装しよう
def escape
puts "・・・"
gets
if Random.rand(0..2) == 0
puts"上手く逃げ切れた"
exit
else
puts "逃げられなかった"
end
end
上記がescaseメソッドの中身になります。
処理内容を解説すると。0~2までの数字がランダムに生成され、もし生成された数字が0だった場合のみ、プログラムを終了する
という流れです。
Random.rand(0..2)
こちらの記述で数字をランダムに生成しております。イメージが湧かないと思うので一度、putsを使って返り値を確認をしてみましょう。
num= Random.rand(0..2)
puts "#{num}です"
0~2までの数字がランダムに出力されているのが分かりますね。escaseメソッドはランダムに出力される数字が0が出た場合にプログラムを終了
させるという、挙動です。
※リファレンス
exit
こちらのexitメソッドはプログラムを終了させる時に使用するメソッド
です。exitメソッドが実行されることによってwhile文の繰り返し処理を終わらせる事が可能です。
※リファレンス
以上が解説になります。
最後に現在のコードを確認をしてみましょう。
def legendary_pokemon
poke=["ルギア","ギラティナ", "アルセウス"]
life={}
life[:hp]=100
return poke ,life
end
def techniques
end
def attack
end
def items
end
#今回実装
def escape
puts "・・・"
gets
if Random.rand(0..1) == 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)
上記の通り、実装ができていればOKです。
それでは今回学んだ知識が身についているか、確認テストをしましょう。
確認テスト
while文を使って繰り返し処理を実装してみよう。
問題1.1〜10までの処理を実装してみよう
num=0
while 式 do
puts #numに1を再代入する」
end
問題2.while文の無限ループを止めよう
while true do
puts "[1]挨拶をする"
puts "[2]プログラムを終了させる"
puts"どうする"
input =gets.to_i
puts input==2? #プログラム終了するメソッド : "こんにちは"
end
解答
解説はしません。
#問題1
while num<10 do
puts num+=1
end
#問題2
while true do
puts "[1]挨拶をする"
puts "[2]プログラムを終了させる"
puts"どうする"
input =gets.to_i
puts input==2? exit : "こんにちは"
end
まとめ:ポケモンバトル2
今回は、
上記の5つのメソッドや、構文を用いて実装を行いました。メソッド、構文に関しては、暗記をしなくとも大丈夫です。使い方がわからなかった場合は、リファレンスなどを参照しながら、実装する度に調べましょう。
以上、kazutoでした。