ポケモンバトル1

Ruby

こんにちはkazutoです今回は、Rubyの基礎知識を使ってプログラムを実装していきましょう。

ポケモンバトルを実装していこう

今回はポケモンバトルを実装していきます。主な機能としては、

  • 戦うポケモンを選ぶ
  • 技を繰り出す
  • アイテムを使う
  • 逃げる

となります。

今回は少し難しい内容になると思うので、不安がある方はこちらの記事を参照してください。

まずはメソッドを考えよう

まず、初めは、ポケモンバトルのシステムを考えてみましょう。ポケモンバトルは4つの選択肢で成り立っていると思います。

  • 戦う
  • バッグ
  • 逃げる
  • ポケモン

という4つのコマンドがあると思います。

今回は、ポケモンを入れ替えるという作業はしないので、

  • 戦う
  • バッグ
  • 逃げる

という機能を大まかに実装していきます。

上記の3つのコマンドを実現するために下記の6つのメソッドを使います。

  • legendary_pokemonメソッド(実装予定)
    伝説のポケモンを定義します。あなたが戦うポケモン、HPを定義をします。
  • pokemonメソッド
    メニュー欄です。ポケモンを倒す、捕まえる、逃げ切るなど、プログラムが終わる処理が発火しない限り永遠に繰り返します。
  • techniquesメソッド
    技をランダムで繰り出します。
  • attackメソッド
    計算です。 HPから30を引いた値をtechniquesに返します。
  • itemsメソッド
    アイテムを使います。なお、モンスタボールを使うとポケモンを捕まえる事ができます。
  • escape
    一定数の確率で逃げる事ができます。逃げきれなかった場合は、再度、メニュー欄に戻ります。(プログラムを終了する)

※なお、「ポケモンバトル」の実装については3部構成です。今回は、legendary_pokemonメソッドを実装していきます。

[ターミナル]

伝説のポケモンを定義しよう

今回、野生のポケモンとして現れるポケモンは、

  • ルギア
  • ギラティナ
  • アルセウス

 上記の3つのポケモンから一匹を選び、バトルの準備をします。

コードを見てみよう‼️

def legendary_pokemon
    poke=["ルギア","ギラティナ", "アルセウス"]
    life={}
    life[:hp]=100
    return poke ,life
  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

[ターミナル]

それでは、メソッドの説明をしていきます。

def legendary_pokemon
    poke=["ルギア","ギラティナ", "アルセウス"]
    life={}
    life[:hp]=100
    return poke ,life
  end

まずは、こちらのメソッドの動きを見てましょう。

  poke=["ルギア","ギラティナ", "アルセウス"]

配列pokeにポケモン3匹を格納しています。

life={}
 life[:hp]=100

lifeというハッシュを定義しています。その後、lifeの中にhpというキーに対して、100というポケモンのHPをバリューとして格納しています。

続いて、処理部分を解説していきます。legendary_pokemonメソッドで定義した伝説のポケモンの3匹から1匹、戦うポケモンを選びます。

 poke,life=legendary_pokemon()
   puts "どのポケモンと戦う❓"
   poke.each_with_index do |p ,key|
    puts "#{key+1}.#{p}"
   end
   num=gets.to_i
poke,life=legendary_pokemon()

こちらはlegendary_pokemonメソッドの返り値を二つの変数に格納しています。少しわかりづらいと思うので、legendary_pokemonメソッド内の記述を見てみましょう。

def legendary_pokemon
    poke=["ルギア","ギラティナ", "アルセウス"]
    life={}
    life[:hp]=100
    return poke ,life
  end

legendary_pokemonメソッドを見て頂くと、処理の最後に

 return poke ,life

と記述されております。return文は定義したメソッドの中の戻り値を返す情報を表します。

  • 配列の情報が入った変数poke
  • ハッシュの情報が入った変数life

上記2つがlegendary_pokemonメソッドの返り値になります。なお、return文
は、最後の記述が自動でメソッドの返り値として返されるので、return文を省略する事もあります。

今回は変数2つを定義してreturn文を記述していないとエラーが出てしまうのでreturn文を記述しています。

poke.each_with_index do |p ,key|
    puts "#{key+1}.#{p}"
   end
   num=gets.to_i

こちらは、each文という配列の要素分繰り返すメソッドを使用しています。
詳しくはこちらのリファレンスを参照してください。

eachメソッド

[配列].each do |変数|
  puts 変数
end

each_with_indexメソッド

[配列].each_with_index do |バリュー, キー番号|
  p [バリュー, キー番号]
end
num=gets.to_i

getsメソッドにto_iを使い数値変換をしてユーザーが番号を入力できるようにしています。

最後は、if文を用いてユーザーが入力した番号で違う挙動になるように条件分岐をしましょう。実装したい処理内容としては、numの値に応じてpokeという配列から番号に一致したポケモンを取得してくるという処理です。

まずは言語化してみましょう。

  • もし、numの値が1と等しかったらルギアを配列から取り出す
  • もし、numの値が2と等しかったらギラティナを配列から取り出す
  • もし、numの値が3と等しかったらアルセウスを配列から取り出す。

それではコードに書き換えていきましょう。

 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

上記は、それぞれnumに入力した値によって配列から該当するポケモンを取り出しています。配列から値を取得するには、下記のように配列に割り当てられているインデックス番号にアクセスする必要があります。

配列=[0,1,2]
配列[0]
poke=["ルギア","ギラティナ", "アルセウス"]
#ルギアを取得する場合
poke[0]
#ギラティナを取得する場合
poke[1]
#アルセウスを取得する場合
poke[2]

上記のように配列名[インデックス番号]と記述すると配列の要素にアクセスできます。「配列の取得」に関してはよく使うので、わからなければ、何度でも復習をして知識を定着させましょう。

if文に関しては、とてもシンプルな条件分岐になっているため解説は、省かせてもらいます。

最後に

battle_poke=poke[0]
battle_poke=poke[1]
battle_poke=poke[2]

上記の記述は、battle_pokeという変数に、配列の取得結果を格納しています。変数に格納している理由は、pokemonメソッドに配列の取得結果を渡すためです。今回は、システム上、pokemonメソッドを呼び出すのは1回のみなので、変数に格納した方が都合が良いためです。

以上が解説です。

ソースコードは下記の通りになっていれば,現段階ではOKです。

def legendary_pokemon
    poke=["ルギア","ギラティナ", "アルセウス"]
    life={}
    life[:hp]=100
    return poke ,life
  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

最後に簡単な問題を説いてみましょう。

確認問題

poke=["ルギア","ギラティナ", "アルセウス"]

問題1
アルセウスを取得してみよう。
(ヒント:配列[番号])

問題2
配列の要素を繰り返して表示し、順に1~3の番号をつけてみよう。
(ヒント:each文,each_with_index)

解答

今回は、解説はしません

poke=["ルギア","ギラティナ", "アルセウス"]
#問題1
puts poke[1]
#問題2
index=0
poke.each do|po|
index+=1
puts "#{index}:#{po}"
end
poke.each_with_index do|po,index|
puts "#{index},#{po}"
end

ターミナル

まとめ:ポケモンバトル1

今回は、ポケモンバトルの前段階として、伝説のポケモンを配列に格納して、戦うポケモンを1匹選ぶという機能を実装しました。

ポイントは

  • メソッド
  • if文
  • 配列
  • each文

これから、「ポケモンバトル」を実装していく中で、難しいと感じると思いますが、一回で覚えようとせず何度もチャレンジしていきましょう。
以上kazutoでした。