ポケモンバトル2

Ruby

こんにちは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文の構文が理解できたら所で、一度、下記のソースコードをみてましょう。

 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に格納されている値によって処理を条件分岐をしています。

  1. 技を繰り出すメソッドを呼び出す
  2. アイテムを使うメソッドを呼び出す。
  3. 一定数で逃げるメソッドを呼び出す

という流れです。

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文の繰り返し処理を終わらせる事が可能です。

※リファレンス

exitメソッド

以上が解説になります。

最後に現在のコードを確認をしてみましょう。

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でした。