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

Ruby

こんにちは、kazutoです。今回は、完成版のソースコードをまとめていきます。

仕様内容の確認

今回、作成をした仕様書は下記です。

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

続いて各クラス事、完成版のソースコードを貼り付けていきます。

Pokemon_on_handクラス

Pokemon_on_handクラスは、主に手持ちのポケモンについての処理でしたね。

  • 手持ちのポケモンの初期化
  • ポケモンを入れ替える
  • 回復するポケモンを選択をする
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:100,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

  def pokemon_on_hand
   return @pokemon_on_hand
  end

  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
    
    

    def select_pokemon_that_uses_items(poke_hand)
      puts @Pokemon_on_hand
      @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]}は使えません)"
          poke[:dying]="瀕死"  if poke[:hp]<=0 
        end
      end
      puts "どのポケモンを回復させる❓"
      input = gets.to_i
      return @pokemon_on_hand[0][input-1] if @pokemon_on_hand[0][input-1][:hp]==100
      if @pokemon_on_hand[0][input-1][:dying]=="瀕死"
        puts "瀕死のポケモンは回復する事はできないよ"
        return @pokemon_on_hand[0][input-1]
      end
        puts "#{@pokemon_on_hand[0][input-1][:name]}"
        return @pokemon_on_hand[0][input-1]
    end
end

手持ちのポケモンもご自身の好きなポケモンにカスタマイズするのも、独自性があって良いかもしれないですね。好きなポケモンを追加をして伝説のポケモンと戦おう‼️

Legendary_pokemonクラス

Legendary_pokemonクラスは、伝説のポケモンについての処理が実装されていましたね。

  • 伝説のポケモンの初期化
  • たたかう伝説のポケモンの選択
class Legendary_pokemon

  def initialize
    @battle_pokemon=[]
    legendary_pokemon=
      {name:"ルギア",hp:350,techniques:["ハイドロポンプ","サイコキネシス","はかいこうせん","つばめ返し"]},
      {name:"ギラティナ",hp:300,techniques:["だましうち","かみくだく","わるだくみ","シャドーダイブ"]}, 
      {name:"アルセウス",hp:400,techniques:["はかいこうせん","ばかちから","はかいこうせん","めいそう"]}
    @battle_pokemon<<legendary_pokemon
  end
  
  def select_pokemon
    puts "どのポケモンとたたかう❓"
    @battle_pokemon.each{|pokemon|
        pokemon.each_with_index{
        |poke,key|puts"#{key+1}#{poke[:name]}"
      }
    }
    input =gets.to_i-1
    @battle_pokemon.select{|pokemon| return pokemon[input]}
  end

end

Pokemon_on_handクラスと同様、バトルしたい伝説のポケモンを追加をするのもありだと思います。(伝説のポケモンでもなくともOKです)

Attackクラス

Attackクラスは、主に攻撃の処理を実装をしました。また、

  • 手持ちのポケモン
  • 伝説のポケモン

によってバトルスタイルを変えているのが特徴的でしたね。

  • 手持ちのポケモン
    →コマンド操作
  • 伝説のポケモン
    →ランダムで技を繰り出す
class Attack
  
  def initialize(battle_pokemon,pokemon,pokemon_lists,pokemon_on_hand)
    @pokemon=battle_pokemon
    @legendary_pokemon=pokemon
    @pokemon_lists=pokemon_on_hand
    @select= pokemon_lists
     
  end
   def pokemon_attack(attack_pokemon,pokemon,pokemon_on_hand)
    if attack_pokemon[:name]==@legendary_pokemon[:name]
      puts "#{attack_pokemon[:name]}が#{attack_pokemon[:techniques].sample}を繰り出した"
      puts  Random.rand(0..2) == 0 ?  "#{life(pokemon,pokemon_on_hand)}": "#{pokemon[:name]}に攻撃が当たらなかった"
    elsif attack_pokemon[:name]==  @pokemon_lists[0][0][:name] || @pokemon_lists[0][1][:name] ||@pokemon_lists[0][2][:name]
        puts"どの技を使う❓"
        attack_pokemon[:techniques].each_with_index {|technique,keys|puts "#{keys+1}:#{technique}"}
        input =gets.to_i-1
        puts "#{attack_pokemon[:name]}が#{attack_pokemon[:techniques][input]}を繰り出した"
        puts  Random.rand(0..2) == 0 ?  "#{life(pokemon,pokemon_on_hand)}": "#{pokemon[:name]}に攻撃が当たらなかった"
    end
   end

    def life(pokemon,pokemon_on_hand)
      damages= [30,50,20,10]
      pokemon[:hp]-=damages.sample
      puts "#{pokemon[:name]}はダメージを受けた"
      if pokemon[:hp]<0&&pokemon[:name]==@pokemon[:name]
        puts"#{ pokemon[:name]}が倒れた" 
      elsif pokemon[:hp]<0 && pokemon[:name]==@legendary_pokemon[:name]
          puts"#{ pokemon[:name]}が倒れたあなたの勝ちですです"
          exit
      elsif (@pokemon_lists[0][0][:hp]<=0) && (@pokemon_lists[0][1][:hp]<=0 ) && (@pokemon_lists[0][2][:hp]<=0)
          puts "あなたの手持ちのポケモンは全て力付きました"
          puts "あなたの負けです。"
          exit
      end
    end
end

時間があれば、クリティカル機能を作成をしても面白いですね。

Itemクラス

Itemクラスは、アイテムについての処理を実装をしました。

  • 手持ちのポケモンを回復をする
  • 伝説のポケモンを捕まえる
class Item
    def initialize(kizugusuri,mantan,monster_bole,haiper_bole,legendary_pokemon_name)
      @kizugusuri=kizugusuri
      @mantan=mantan
      @monster_bole=monster_bole
      @haiper_bole=haiper_bole
      @legendary_pokemon_name=legendary_pokemon_name
    end

    def items_select(battle_pokemon,poke_hand)
        puts  "[1]きずぐすり✖︎#{@kizugusuri}"        
        puts  "[2]まんたんなくすり✖︎#{@mantan}"       
        puts  "[3]モンスターボール✖︎#{@monster_bole}" 
        puts  "[4]ハイパーボール✖︎#{@haiper_bole}"    
        puts  "[5]戻る"
        input =gets.to_i
      case input
          when 1 
              return puts "きずぐすりは無くなった" if @kizugusuri==0
              battle_pokemon = pokemon_selecter(poke_hand,battle_pokemon)
              puts battle_pokemon
              return  if battle_pokemon[:dying]== "瀕死"
              return puts"HPはまんたんだからアイテムを使う必要がないよ"  if battle_pokemon[:hp]==100
              @kizugusuri = consume_item(@kizugusuri)
              recovery(battle_pokemon,@kizugusuri)
          when 2
              return puts "まんたんのくすりは無くなった" if @mantan==0
              battle_pokemon = pokemon_selecter(poke_hand,battle_pokemon)
              puts battle_pokemon
              return if battle_pokemon[:dying]== "瀕死"
              return puts"HPはまんたんだからアイテムを使う必要がないよ"  if battle_pokemon[:hp]==100
              @mantan = consume_item(@mantan)
              recovery(battle_pokemon,@mantan)
          when 3
              return puts "モンスターボールは無くなった" if @monster_ball==0
              @monster_bole= consume_item(@monster_bole)
              puts"モンスターボールを投げた"
              catch_pokemon(@monster_ball,@legendary_pokemon_name)
          when 4
              return puts "ハイパーボールは無くなった" if @haiper_bole==0
              @haiper_bole= consume_item(@haiper_bole)
              puts"ハイパーボールを投げた"
              catch_pokemon(@haiper_bole,@legendary_pokemon_name)
          else 
            puts "戻る"
      end
    end

    def pokemon_selecter(poke_hand,battle_pokemon)
      poke_hand=poke_hand.select_pokemon_that_uses_items(poke_hand)
      return poke_hand
    end

    def consume_item(item)
      item-=1
    end
    
    def recovery(poke_hand,item)
      poke_hand[:hp]+=40  if item==@kizugusuri
      poke_hand[:hp]=100  if item==@mantan
      if poke_hand[:hp] >= 100
         poke_hand[:hp] = 100
        puts"HPが満タンになった"
      end
    end

    def catch_pokemon(monster_ball,legendary_pokemon_name) 
      puts "・・・"
      gets
      if Random.rand(0..2) == 0 
        puts"やった〜#{legendary_pokemon_name}を捕まえたぞ"
        exit
      elsif  Random.rand(0..2) == 1
        puts "だめだ捕まらない"
      elsif  Random.rand(0..2) == 2
        puts "あ〜もう少しだったなのに〜"
      end
    end
  end

新たに瀕死状態から復活できる

  • げんきのかけら
  • げんきのかたまり

を追加をしても面白いかもしれないですね。

execution.rb(実行ファイル)

execution.rbファイルは、実行ファイルです。各クラスのインスタンスを生成をして変数を管理をしたりと、色々と複雑な処理が多かったと思います。

require './legendary_pokemon'
require './pokemon_on_hand'
require './attack'
require './item'

# 伝説のポケモン定義
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)

# たたかう
attack= Attack.new(battle_pokemon,pokemon, pokemon_on_hand,pokemons)

# アイテム
item=Item.new(5,3,10,6,pokemon[:name])

# コマンド
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
        when 1
            attack.pokemon_attack(battle_pokemon,pokemon,pokemon_on_hand)
            attack.pokemon_attack(pokemon,battle_pokemon,pokemon_on_hand)
            battle_pokemon =  pokemon_on_hand.pokemon_list(pokemon_on_hand)  if battle_pokemon[:hp] <=0
        when 2
           item.items_select(battle_pokemon,pokemon_on_hand)
           attack.pokemon_attack(pokemon,battle_pokemon,pokemon_on_hand)
           battle_pokemon  =  pokemon_on_hand.pokemon_list(pokemon_on_hand)  if battle_pokemon[:hp] <=0
        when 3 
          battle_pokemon =pokemon_on_hand.pokemon_list(pokemon_on_hand)
          puts "ゆけ#{battle_pokemon[:name]}"
          attack.pokemon_attack(pokemon,battle_pokemon,pokemon_on_hand)
          battle_pokemon = pokemon_on_hand.pokemon_list(pokemon_on_hand)  if battle_pokemon[:hp] <=0
        when 4
            puts "・・・"
            gets
          if Random.rand(0..2) == 0
            puts"上手く逃げ切れた"
            exit
          else
            puts "逃げられなかった"
          end
           attack.pokemon_attack(pokemon,battle_pokemon,pokemon_on_hand)
           battle_pokemon = pokemon_on_hand.pokemon_list(pokemon_on_hand)  if battle_pokemon[:hp] <=0
        end
      end

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

以上で、ポケモンバトル2.0verは、完結をしました。しかし、まだまだ機能を追加できる部分はあると思います。時間があれば、ご自身で考えて機能を追加をして「自分だけのポケモンバトル」を作成してみましょう。
また,実際に完成した「ポケモンバトル2.0ver]で遊んでみてください。

以上、kazutoでした。

関連記事