ポケモンバトル3[2.0ver]

Ruby

こんにちはkazutoです。今回は、手持ちのポケモンの情報をメニュー欄に渡してみましょう。

実装内容の確認

まず初めに、実装のアウトラインを把握しましょう。仕様書は下記です。

上記のチャート図が今回、実装していくアウトラインになります。もし実装中で

  • コードの意味がわからない
  • 実装の全体像が掴めない
  • 行き詰まった場合

などの問題を抱えてしまった場合は、再度チャート図を見て、実装のアウトラインを把握しましょう。全体像が掴めないまま実装してしまうと後から大変になります。

まず初めに、手持ちのポケモンを定義をしていきます。なおPokemon_on_handクラスに処理を実装していきます。

Pokemon_on_handクラス

Pokemon_on_handクラスで実装していく手順は、

  • インスタンスを生成、initializeメソッドを用いてインスタンス変数を初期化
  • pokemon_on_handメソッドで、@pokemon_on_handをローカル変数pokemonsに格納
  • pokemon_listメソッドで最初にバトルするポケモンを選択(その後ポケモンを入れ替える処理に変わります。)
  • select_pokemon_that_uses_itemsメソッドでアイテムを使うポケモンを選択(こちらは、今回実装しません)

となります。

※「select_pokemon_that_uses_itemsメソッドでアイテムを使うポケモンを選択」については,Itemクラスが実装に関わってくるので、こちらの記事では、解説しません。Itemクラスを実装する際に絡めて解説していく予定です。

1.インスタンスを生成、initializeメソッドを用いてインスタンス変数を初期化

class Pokemon_on_hand
def initialize
    @pokemon_on_hand=[]
    puts "どのポケモンたちでたたかう"
    puts "[1]エレキブル、バンギラス、ピカチュウ"
    puts "[2]ジュガイン、リザードン、グラエナ"
    puts "[3]ゲッコウガ、リーフィア、ボスコドラ"
    input =gets.to_i
    case input
    when 1
      pokemon=
        {name:"エレキブル",hp:1,techniques:["10万ボルト","あなをほる","かみなりパンチ","からわり"]},
        {name:"バンギラス",hp:100,techniques:["だましうち","かみくだく","わるだくみ","はかいこうせん"]}, 
        {name:"ピカチュウ",hp:100,techniques:["10万ボルト","アイアンテール","でんこうせっか","ボルテッカー"]}
    when 2
      pokemon=
        {name:"ジュガイン",hp:100,techniques:["リーフブレード","ハードプラント","でんこうせっか","じしん"]},
        {name:"リザードン",hp:100,techniques:["かえんほうしゃ","そらをとぶ","ちきゅうなげ","だいもんじ"]}, 
        {name:"カビゴン", hp:100 ,techniques:["はかいこうせん","ばかちから","かいりき","のしかかり"]}
    when 3
      pokemon=
        {name:"ゲッコウガ",hp:100,techniques:["ハイドロポンプ","みずしゅりけん","いあいぎり","つばめ返し"]},
        {name:"リーフィア",hp:100,techniques:["リーフストーム","かみくだく","でんこうせっか","あなをほるー"]}, 
        {name:"ボスコドラ",hp:100,techniques:["はかいこうせん","ばかちから","アイアンテール","いわなだれ"]}
    end
    @pokemon_on_hand<<pokemon
  end
end
# 伝説のポケモン定義
legendary_pokemon=Legendary_pokemon.new
pokemon=legendary_pokemon.select_pokemon
puts"たたかうポケモンは、#{pokemon[:name]}"
#手持ちのポケモンの定義
pokemon_on_hand =Pokemon_on_hand.new

まず初めに、Pokemon_on_handクラスのインスタンスを生成します。今回は、initializeメソッドが作動した際に、ポケモンのパーティを選択する挙動にしました。

具体的な処理の内容としてインスタンス変数@pokemon_on_hand の中に手持ちのポケモンの情報(ハッシュ)が入ったローカル変数pokemonを格納しています。

pokemon_on_hand =Pokemon_on_hand.new

インスタンスを生成後、pokemon_on_handの変数の中に格納しています。

2.pokemon_on_handメソッドで、@pokemon_on_handをローカル変数pokemonsに格納

class Pokemon_on_hand
...省略
 def pokemon_on_hand
   return @pokemon_on_hand
  end
end
#伝説のポケモンの定義
legendary_pokemon=Legendary_pokemon.new
pokemon=legendary_pokemon.select_pokemon
puts"たたかうポケモンは、#{pokemon[:name]}"
#手持ちのポケモンの定義
pokemon_on_hand =Pokemon_on_hand.new
pokemons=pokemon_on_hand.pokemon_on_hand

pokemon_on_handメソッド(ゲッター)をpokemonsの中に格納しています。pokemon_on_handメソッドを変数の中に格納している意図としては、 Attckクラスを実装する際に@pokemon_on_handの配列の状態を条件分岐をするためです
今回の実装においては、特に影響はありませんが、今後Attckクラスを実装するにあたり必要になりますので、趣旨については抑えておいてください。

3.pokemon_listメソッドで最初にバトルするポケモンを選択(その後ポケモンを入れ替える処理に変わります。)

class Pokemon_on_hand
      def pokemon_list(pokemon_on_hand)
        puts " 手持ちのポケモン"
        @pokemon_on_hand.each do |pokemon|
          pokemon.each_with_index do|poke,key|
            puts  poke[:hp]>0 ?  " #{key+1}.HP:#{poke[:hp]}#{poke[:name]}" : "瀕死(#{poke[:name]}は使えません)"
            end
         end
        puts "どのポケモンを出す❓"
        input =gets.to_i
        if @pokemon_on_hand[0][input-1][:hp]>0
          puts@pokemon_on_hand[0][input-1][:name]
          return @pokemon_on_hand[0][input-1]
        else
          puts "#{@pokemon_on_hand[0][input-1][:name]}は瀕死状態なので入れ替える事はできないよ"
          pokemon_on_hand.pokemon_list(pokemon_on_hand)
        end
    end
 end
#伝説のポケモン定義
legendary_pokemon=Legendary_pokemon.new
pokemon=legendary_pokemon.select_pokemon
puts"たたかうポケモンは、#{pokemon[:name]}"
#手持ちのポケモンの定義
pokemon_on_hand =Pokemon_on_hand.new
pokemons=pokemon_on_hand.pokemon_on_hand
battle_pokemon=pokemon_on_hand.pokemon_list(pokemon_on_hand)

 pokemon_listメソッドでは、

  • 最初に出すポケモンを選択する
  • ポケモンを入れ替える
  • 戦っているポケモンが瀕死状態になったらポケモンを入れ替える

という処理を実装していきます。

puts " 手持ちのポケモン"
        @pokemon_on_hand.each do |pokemon|
          pokemon.each_with_index do|poke,key|
            puts  poke[:hp]>0 ?  " #{key+1}.HP:#{poke[:hp]}#{poke[:name]}" : "瀕死(#{poke[:name]}は使えません)"
            end
         end

each_with_indexを用いて、手持ちのポケモンの情報を配列からバラしています。

 puts  poke[:hp]>0 ?  " #{key+1}.HP:#{poke[:hp]}#{poke[:name]}" : "瀕死(#{poke[:name]}は使えません)"

こちらの三項演算子は、ポケモンのHPが0以下の場合、瀕死と出力する様に条件分岐をしています。下記の画像の通り表示されます。

 puts "どのポケモンを出す❓"
        input =gets.to_i
        if @pokemon_on_hand[0][input-1][:hp]>0
          puts@pokemon_on_hand[0][input-1][:name]
          return @pokemon_on_hand[0][input-1]
        else
          puts "#{@pokemon_on_hand[0][input-1][:name]}は瀕死状態なので入れ替える事はできないよ"
          pokemon_on_hand.pokemon_list(pokemon_on_hand)
        end

ユーザーが入力した番号に紐づくインデックス番号を持つポケモンの情報を取り出しています。その中で、瀕死のポケモンを入れ替える事ができない様に条件分岐しています。

  • もし入れ替えるポケモンのHPが0以上な場合
    →該当のポケモンの情報をメニュー欄に渡す
  • それ以外(HPが0以下の場合)
    →もう一度、ポケモンを選び直させる

上記の様にif文を用いて条件分岐をしています。

一度、完成品の挙動を確認してみましょう。

[初めてポケモンを出す場合]

[ポケモンを入れ替える場合]

[ポケモンを入れ替える際に選択したポケモンが瀕死状態な場合]

以上がpokemon_listメソッドの挙動になります。まだ、部品が足りないので挙動の確認をできない部分があるので、先に進めていきます。

メニュー欄を構築しよう

最後にメニュー欄を構築していきます。
前回は、仮置きでしたが、ポケモンを入れ替える機能を実装したので、完成品と同じ様にwhileを用いて、ループ処理を実装していきます。

#伝説のポケモン定義
legendary_pokemon=Legendary_pokemon.new
pokemon=legendary_pokemon.select_pokemon
puts"たたかうポケモンは、#{pokemon[:name]}"
#手持ちのポケモンの定義
pokemon_on_hand =Pokemon_on_hand.new
pokemons=pokemon_on_hand.pokemon_on_hand
battle_pokemon=pokemon_on_hand.pokemon_list(pokemon_on_hand)
#開始の合図
puts "やせい#{pokemon[:name]}が現れた"
puts "ゆけ#{battle_pokemon[:name]}"

while true do
      puts "HP:#{pokemon[:hp]}#{pokemon[:name]}"
      puts "HP:#{battle_pokemon[:hp]}#{battle_pokemon[:name]}"
      puts"[1]たたかう"
      puts"[2]バッグ"
      puts"[3]ポケモン"
      puts"[4]逃げる"
      input=gets.to_i
      case input
        case input
          when 1
        #たたかう処理
       when 2
        #アイテムを使う
          when 3
           battle_pokemon=pokemon_on_hand.pokemon_list(pokemon_on_hand)
          when 4
        exit
   end
 end
battle_pokemon=pokemon_on_hand.pokemon_list(pokemon_on_hand)

ローカル変数battle_pokemonの値が更新できる様に
pokemon_on_hand.pokemon_listメソッドの返り値を受け取りましょう。
こちらの手順を踏んで頂かないと、上手くポケモンを入れ替える事ができないので注意してください。

以上で、今回の実装を終了します。

まとめ:ポケモンバトル3[2.0ver]

今回は、Pokemon_on_handクラスを実装してきました。手持ちのポケモンを操作をする挙動はたくさんあるので、少し複雑な内容になってしまいました。しかし、要点を抑えて頂きながら実装を進めていただければ、理解をしながら進めていけると思います。
まだまだゴール程遠いですが、一緒に「ポケモンバトル」を完成させていきましょう。
以上、kazutoでした。

関連記事

なお、「ポケモンバトル[2.0ver]」は、シリーズになっているので、下記のリンクから参照してください。