ポケモンバトル6[2.0ver]
こんにちは、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でした。
関連記事