ホーム

配列

「配列」「ハッシュ」の違い

「配列」と「ハッシュ」は、見た感じでは非常に似通っています。
しかし、「配列」は
ary = []
ary[0] = 100; ary[1] = "aaa"
#(または ary = [100, "aaa"])

p ary[0] #=> 100
p ary[1] #=> "aaa"
と、0から始まる数値で格納された値を参照するのに対し、「ハッシュ」は
hs = {}
hs["アルシェス"] = "あるしぇす"
hs["バジル"] = "ばじる"
#(または hs = {"アルシェス"=>"あるしぇす", "バジル"=>"ばじる"})
と、数値以外で参照することができるという特徴があります。

ここでは「配列」のみを扱います。

配列の便利な使い方

基本的な使い方は大体ヘルプに載っているので、便利な使い方だけ。

アクター全員に同じ処理を行う

アクターは$game_actorsという配列に入っているので、簡単に全員を操作することができます。
$data_actorsのサイズは全アクター数 - 1と等しいので、これを利用します。
# ** 全員のレベルを上げる **
# 1 から $data_actors.size までのすべての整数を一つずつ
# i に代入しながらループを回す
for i in 1...$data_actors.size
  # ID:i のアクターを取得
  actor = $game_actors[i]
  # レベルを 1 上げる
  actor.level += 1
end

特定の要素のインデックスを拾う

Array#indexを使用すると、特定の要素が配列のどこにあるのかを取得することができます。
例えば「アルシェス(ID:1)がパーティの何番目にいるのか」を取得する場合は、
x = $game_party.actors.index($game_actors[1])
とすれば、xにアルシェスの位置が返ります。
(パーティ内にいない場合はnilが返る)

これが真価を発揮するのは「属性指定」です。
データベースで指定した属性は$data_system.elementsに属性名の配列として格納されています。
そのため、先ほどと同じ方法で「属性名から属性IDを取得する」という操作が可能になるわけです。
例えば両手持ちという属性のIDを取得したい場合は
e_id = $data_system.elements.index("両手持ち")
とすれば、e_id両手持ちのIDが格納される、という具合です。
これで、データベースのIDを気にせずに属性を使用できるため、作業効率のアップにもつながります。

Array#indexを使用しなくても、
for i in 1...$data_system.elements.size
  if $data_system.elements[i] == "両手持ち"
    e_id = i
    break
  end
end
とでもすれば取得できますが、やはり1行で済ませる方がスマートです。

特定の要素が含まれているか判定する

配列内に要素が含まれているかどうかはArray#include?を使用することで判定できます。
例えば「アルシェス(ID:1)がパーティに入っているか」を判定する場合は、
if $game_party.actors.include?($game_actors[1])
  # 入っている場合の処理
else
  # 入っていない場合の処理
end
このようにします。
先ほどの、Array#indexを使って「nilが返ってきたら入っていない」という判別方法もありますが、こちらの方が何をしているか分かりやすいと思います。

ここでArray#indexArray#include?の2つを使用した例を示します。
本サイト内のスクリプトでも多用されている「武器やスキルの属性判定」です。

これは、次のような手順で行っています。

  1. Array#indexを使用し、判別する属性のIDを取得
  2. 武器(スキル)の属性配列element_setに対してArray#include?を使用
それでは、先ほどの例を使って、武器に両手持ち属性が含まれているかを判定してみます。
判定対象の武器は「アルシェス(ID:1)が装備している武器」です。
# アルシェスが武器を装備している場合(武器IDが0ではない)
if $game_actors[1].weapon_id > 0
  # [両手持ち]の属性IDを取得
  e_id = $data_system.elements.index("両手持ち")
  # アルシェスが装備している武器を取得
  weapon = $data_weapons[$game_actors[1].weapon_id]
  # アルシェスの武器に[両手持ち]が含まれているか判定
  if weapon.element_set.include?(e_id)
    p "[両手持ち]あり"
  else
    p "[両手持ち]なし"
  end
end
一見して面倒臭そうに思われる属性判定も、意味が分かれば簡単に作ることができます。

防御属性も似たような方法が通用しますが、A〜Fの耐性も判定する必要があるため、ここでは割愛します。
(知りたい方は≪モンスター図鑑≫≪隊列概念≫あたりをチェックしてみてください)