はじめてのRmakeスクリプト / 第04回 配列変数をマスターしよう

投稿者:Cdv30200 aoi icon mini aoihikawa 投稿日:2012/06/11 05:33

はじめてのRmakeスクリプト

 第04回 配列変数をマスターしよう


こんにちは 簸川 葵(ひかわ あおい)と申します

こんにちは 剣 芽優(つるぎ めゆ)です

この連載ではスクリプトの基礎を、じっくりとお話していきます

分からないところがあったら、過去の記事をチェックですよ



04-01 変数と配列


前回では変数とフラグについてお話しました

今回は、『配列』についてお話します

『配列』って何ですか?

「変数」は、中身が変わる「箱」のようなものでしたね

この「箱」に名前の他に「番号」をつけることで

同じ名前の変数を複数使えるようにしたものを『配列』といいます

同じ名前で増やす意味があるの?

例えばRPGのキャラクターのステータスは、

味方の数が増えても攻撃力とか防御力といった名前は同じですね

そっか 味方の数だけ番号を増やしてあげれば、変数を増やさなくてもよくなるのね

RmakeではcreateArray関数を使うことで、変数に配列のベースを用意することができます

#「x」という名前の変数に、配列を用意する
x = createArray()

#「x」という名前の配列変数の0番目に、数値「3」を入れる
x[0] = 3

#「x」という名前の配列変数の1番目に、数値「4」を入れる
x[1] = 4

#「x」という名前の配列変数の2番目に、数値「5」を入れる
x[2] = 5

#「x」という名前の配列変数の1番目を表示する
speak(x[1])

変数「x」の後に「[番号]」がつくようになるのね

これが配列の番号です 番号は0以上の、整数のみ使用できます

なお、番号は必ず「[ ]」で囲む必要があります

変数を配列にした後、0番目と2番目だけに値をいれたら1番目はどうなるの?

1番目には値が存在しないという意味の「NULL」が入ります

空っていう内容にも、名前がついているのね



04-02 変数と二次元配列


配列の中にさらに配列をつくることもでき、これを『二次元配列』といいます

配列の中に配列?

実際にスクリプトをみてみましょう

#「x」という名前の変数に、配列を用意する
x = createArray()

#「x」という名前の配列変数の0番目に、配列を用意する
x[0] = createArray()

#「x」という名前の配列変数の1番目に、配列を用意する
x[1] = createArray()


#「x」という名前の配列変数の0番目の0番目に、数値「3」を入れる
x[0][0] = 3

#「x」という名前の配列変数の0番目の1番目に、数値「6」を入れる
x[0][1] = 6

#「x」という名前の配列変数の0番目の2番目に、数値「9」を入れる
x[0][2] = 9


#「x」という名前の配列変数の1番目の0番目に、数値「4」を入れる
x[1][0] = 4

#「x」という名前の配列変数の1番目の1番目に、数値「7」を入れる
x[1][1] = 7

#「x」という名前の配列変数の1番目の2番目に、数値「10」を入れる
x[1][2] = 10


#「x」という名前の配列変数の0番目の1番目を表示する
speak(x[0][1])

配列にした変数「x」のそれぞれの番号の中身を、さらに配列にしているのね

後は配列にした数だけ「[番号]」が続くようになります

そういえば、二次元って平面という意味よね・・・

そうですね 配列を横方向へ増やした列として考えると

二次元配列はその配列をさらに縦方向へ増やした列と考えられ

横と縦、つまり平面のように広げた配列になるからです

ということは、どんどん配列をつくっていけば

「三次元配列」とか、「四次元配列」とかになったり?

そのようになりますが、大抵の場合

「二次元配列」以降は『多次元配列』と呼ぶようになります



04-03 配列とループ処理


配列は確かに便利だけど、たくさん増えてくると使うのも大変ね・・・

そういった場合、ループ処理が役に立ちます

ループ処理・・・ while文だったっけ

そうですね 配列の番号は変数を使うこともできます

配列に使う変数をループ処理と組み合わせることで

配列を番号順に指定する仕組みにするわけです

#「x」という名前の変数に、配列を用意する
x = createArray()

#「i」という名前の変数に、数値「0」を入れる
i = 0

#変数「i」の内容を元に分岐する
while i < 5
  #変数「i」が「5」より小さい場合
  
  #配列変数「x」の変数「i」番目に、配列を用意する
  x[i] = createArray()
  
  
  #配列変数「x」の変数「i」番目の0番目に、数値「0」を入れる
  x[i][0] = 0
  
  #配列変数「x」の変数「i」番目の1番目に、数値「1」を入れる
  x[i][1] = 1
  
  #配列変数「x」の変数「i」番目の2番目に、数値「2」を入れる
  x[i][2] = 2
  
  
  #変数「i」に、変数「i」と数値「1」を足した結果を上書きする
  i = i + 1
end

#配列変数「x」の2番目の1番目を表示する
speak(x[2][1])

まずwhile文の始めでは変数「i」は「0」だから・・・

配列変数「x」の0番目に一通りの処理が実行されます

そしてendの手前で変数「i」が1増えた後、while文の始めに戻ります

なるほど 変数「i」が5より小さい間、二次元配列がつくられていくわけね

このような二次元配列の準備だけでなく、

配列の内容を全て参照したい場合にも、ループ処理が役に立ちます

配列とループ処理って、仲が良いのね



04-04 第04回 まとめ問題集


それでは、今回のまとめ問題です

よーっし がんばるよ

なお、回答は記載しておりません

スクリプトをコピーして、実際に動作させることでチェックしてください


問題01
 次のスクリプトに変数「x」を使用して実行結果が「3」と表示されるよう、1行を追加してください

x = createArray()

x[0] = 1
x[1] = 2
x[2] = 3

#ここに追加する

speak(y)


問題02
 次のスクリプトに変数「x」を使用して実行結果が「5」と表示されるよう、2行を追加してください
x = createArray()

#ここに追加する

speak(x[0][0])


問題03
 次のスクリプトに変数「x」を使用して実行結果が「6」と表示されるよう、2行を追加してください
x = createArray()

i = 0
while i < 3
  #ここに追加する
  
  i = i + 1
end

speak(x[2][1])

できた! でも慣れるまで、ちょっとかかりそうかな

なお、理解したかどうかの確認なので、コメントに回答を書かないでください




 <連載一覧>

第01回 変数と数値をマスターしよう

第02回 変数と文字列をマスターしよう

第03回 変数とフラグをマスターしよう

第04回 配列変数をマスターしよう

第05回 通常変数をマスターしよう

第06回 数値の応用をマスターしよう

第07回 時間の動作をマスターしよう

第08回 ユーザ定義関数をマスターしよう

第09回 スクリプト用語のまとめ

コメントする

コメントするには、ログインする必要があります。

コメント一覧

       256 mini 池ちゃん(翡翠ヶ池)(投稿日:2012/06/12 18:50, 履歴)
これで僕も配列が使える^^
User icon mini 退会したユーザー(投稿日:2012/06/12 18:38, 履歴)
だーめだぁー
やっぱり配列になると何がなんだかワカランくなる。。。
Zararu128x128 mini dycoon(投稿日:2012/06/11 23:05, 履歴)
有意義な解説記事をありがとうございます。

ちょっと
「変数を配列にすることができます 」
というあたり気になりましたので
説明させていただきたいと思います。

createArrayは変数を配列にする処理ではなく、
配列を作ってその実体の参照を返す関数です。
変数は実体への参照を保存します。

たとえば次のようなコードは
a = createArray()
b = a
b[0] = 3
a[0] = 2
speak("a[0] = ", a[0])
speak("b[0] = ", b[0])


以下のような出力をします。
a[0] = 2
b[0] = 2


よろしくお願いします。
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/06/11 23:22, 履歴)
ご指摘ありがとうございます。

「参照を返す」仕組みなので
こういったコードになるのですね。

該当箇所の記述を修正いたしました。
Material 71926 1 mini なとおとき(投稿日:2012/06/11 19:31, 履歴)
ぎりぎりSafe
User icon mini 退会したユーザー(投稿日:2012/06/11 18:19, 履歴)
前回から24時間経ってない(w

この辺りから混乱する人は多いですよね。
Logo1 mini fmy(投稿日:2012/06/11 07:07, 履歴)
お疲れ様でっす!お早いですねー
ちゃんと寝て下さい!?
アレですねーもうRmake入門本とか出版シテシマエー