こんにちは、ロブスタのハルです!
前回の講座ではループ処理とテーブルを組み合わせた場合の機能について解説しました。
今回はネストと2次元テーブルについて解説します。
前回の講座を見ていない方はこちらからご覧ください。
ネスト
――ある日の会話――
先生、ループ処理について調べていると『ネスト』というものが出てきました。
これはなんですか?
ネストとは『ある処理の中でさらにある処理をすること』です。
入れ子と呼ばれることもありますね。
わかるような、わからないような…
マトリョシカをイメージしてみてください。
人形の中に人形が入っているあのおもちゃです。
イメージはわかりました。
具体的にどうやって書くんですか?
具体的な書き方を説明しますね。
解説
if文のネスト
if文のネストは以下のようになります。
local x = 10
local y = 5
if x > 8 then
if y < 10 then
print("OK!")
end
end
プログラムは上から順に動くので、まずはx > 8が評価されます。評価結果はtrueなので5行目に進んで、今度はy < 10が評価されます。これもtrueとなるので6行目に進み、OK!と表示されます。
もしもx > 8がfalseだったらその時点で8行目に進み、処理が終わります。
実は上のプログラムはand演算子を使って1つのif文で書き換えることができます。
local x = 10
local y = 5
if x > 8 and y < 10 then
print("OK!")
end
ほとんどのプログラムは短いほど読みやすくなります。
そのため、if文のネストはできる限り論理演算子を使ってまとめてしまった方がいいです。
if文のネストは外側から内側に入っていくと覚えておきましょう!
for文のネスト
for文やwhile文などの繰り返し処理のネストは少し特殊です。
for i = 1, 3 do
print("外側のループ, i = " .. i)
for j = 1, 5 do
print(" 内側のループ, j = " .. j)
end
end
上の例ではまず外側のfor文でi = 1として処理が始まります。このとき、”外側のループ, i = 1″と出力されます。続いて内側のfor文でj = 1として処理が始まります。ここでは”内側のループ, j = 1″と出力されます。その次が重要で、今度は内側のfor文でj = 2となります。よって、”内側ループ, J = 2″と出力されます。
このようにして表にまとめると、
内側のループが終わってから外側のループに移るという処理になっていることが分かります。
for文のネストは内側が終わってから外側に入っていくと覚えておきましょう!
while文のネスト
local x = 1
while x < 4 do
print("外側のwhileループ, x = " .. x)
local y = 1
while y < 6 do
print(" 内側のwhileループ, y = " .. y)
y = y + 1
end
x = x + 1
end
上の例はwhile文のネストです。あまり使われることはないですが、こういった書き方ももちろんできます。
for文の時と同じく表を考えると以下のようになります。
2次元テーブル
――ある日の会話――
ネストについてなんとなく理解できました。
if文だと論理演算子andのように『○○かつ○○かつ…』といった条件を表せるんですね。また、for文やwhile文だと何重かのループを作ることができて『内から外に向けて動作』することがわかりました。
ばっちりです!
ネストは意外といろんなところで使うので実際にプログラムを書きながら覚えていきましょうね。
はい!
ところでネストとセットで多次元テーブルというものがあると知ったんですがこれは何なんですか?
それはまた説明が難しいんですが、一番想像しやすいのは2次元テーブルです。
これは表とか数学で出てくる行列といったものを表すことができるんですよ。
表を表すってどういうことなんだろう?
解説
多次元テーブルとはネストされたテーブルのことです。
Robloxでゲーム開発をするときには2次元テーブルを使うことが多いです。
2次元テーブル(表・行列)
2次元テーブルは表や行列といった概念をプログラム上で表すために利用されることがあります。
例えば、以下のような表を出力したいとします。
このとき、プログラムとしては次のようになります。
-- 表(行列)の定義
local matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
}
-- 2次元テーブルの表示
for i = 1, #matrix do
for j = 1, #matrix[i] do
print("matrix[" .. i .. "][" .. j .. "] = " .. matrix[i][j])
end
end
まず、2~6行目で表示したい表の定義をしています。
名前をtableとしたいところですが予約語となっているため、今回は行列を意味するmatrixとしました。
matrixの中を見るとネストされていることがわかると思います。
まず大枠となる{}を作っておき、その中で各行を表す{1, 2, 3}を書いていることになります。
続いて9~13行目でmatrixの中身を表示しています。
ここでは先ほどでてきたfor文のネストを使っています。外側のループはi = 1からmatrixの要素数(9)まで、内側のループはj = 1からmatrix[i]の要素数(3)までという条件になっています。
ここで、2次元テーブルの要素の取り方について説明します。
local matrix = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{2, 4, 6, 8, 10},
{1, 3, 5, 7, 9}
}
上のような行列があるとします。このとき、各数値はmatrix[i][j]と表すことができます。
例えば、matrix[1][4]は1行目かつ4列目の成分である4を表しています。
このように考えると少しはわかりやすくなるかと思います。
例えば、matrix[3][3]は3行目かつ3列目の成分である6を表しています。
補足(行列について)
行列は数学で使われる概念のひとつで、わかりやすく言えば表のように縦方向と横方向に数字を並べたものです。
\begin{bmatrix}
a & b \\
c & d \\
\end{bmatrix}
\begin{bmatrix}
a_{11} & \cdots & a_{1j} & \cdots & a_{1m}\\
\vdots & \ddots & & & \vdots \\
a_{i1} & \cdots & a_{ij} & \cdots & a_{im}\\
\vdots & & & \ddots & \vdots \\
a_{n1} & \cdots & a_{nj} & \cdots & a_{nm}\\
\end{bmatrix}
横方向を行、縦方向を列と言います。
nが何行あるか、mが何列あるか、iがその行の数値、jがその列の数値を表しています。
for文でのインデックスがiとj、条件式の終了値がnとmに対応しています。
気になった人はいろいろなわかりやすいサイトがあるので調べてみてください。
最後に
――ある日の会話――
2次元テーブルは表を表しているのがわかりました。
横方向を行、縦方向を列と呼ぶんですね。
その通りです。
実は3次元以上のテーブルもあるんですがRobloxでゲーム開発をするときにはほとんど使うことがないので、2次元テーブルまでを理解しておけば大丈夫です。
わかりました!
まとめ
- if文のネストは外側から内側へ処理が進む
- for文のネストは内側が終わってから外側へ処理が進む
- while文のネストは内側が終わってから外側へ処理が進む
- 2次元テーブルは表や行列を表すことができる
- 2次元テーブルではfor文のネストを使って値を取得できる
お疲れ様です。今回はネストと2次元テーブルについて解説しました。これらはセットで使うことが多いので今回の内容を理解しておきましょう。
今回まででRobloxでゲーム開発をする際に必要なLua言語の基礎知識は一通り学んだことになります。ただ、実際にどうやって使うのかはわからないと思うので今後は実践編として簡単なゲームを作りながら勉強していきましょう!
※Lua言語講座はもう少しだけ続きますが、ここから先はテクニックとか考え方的な話になるので余裕がある人だけ見ていただけたらと思います。
コメント