ポケモンバトル3

Ruby

こんにちは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になったら、

  1. 戦っているポケモンを出力
  2. 手持ちのポケモンを出力
  3. プログラム終了する

という処理が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

条件分岐をしています。

  1. キズぐすりを使い40回復をする。
  2. すごいキズぐすりを使い200回復する
  3. モンスターボールを投げる
  4. 戻る

※モンスターボールを投げるプログラムを選択した場合、一定数の確率で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でした。

関連記事