君は何を食べるんだ?
Minetestでは様々なModがあり、自分の好みで追加していく感じになっていますが、そのModはLuaでかかれています。私は今までLuaを使ったことがないのですが、ゲーム開発においては結構使われている言語だそうで、もともとC言語に組み込まれることを目的として設計されているとか。
そのようなLuaですが、今回意外な形でコードを読むことになりました。
現在私は自分の仕事やら親の介護やらで、なかなかのんびり過ごすことができませんが、ちょっとした休憩や就寝前の30分などにMinetestでスローライフを楽しんでおります。そのMinetestで動物を共に過ごしたいと思ったわけですが、彼らが懐いてくれる餌が分からなかったのです。しばらくはその辺に生えている草をあげていたのですが、どうも懐きが悪い。「はは〜ん、好き嫌いがあるんだな」とおじさんは気づきました。
何が好みか?裏ではどのように設定されているのか?おそらく何かしらの条件が設定されているのであろう、ということで、ソースコードもあることですから読んでみました。
そのソースコードがLuaで書かれていたのです。どうやらMinetestのModはすべてLuaで書かれているようです。本体はC++だったかな?
動物のModはmods_animalというのを導入しております。その中に各種動物たちのファイルがあります。ちなみに最初はベッド作成のために3匹の羊を殺めてしまいましたが、それ以降は一匹も殺めておりません。
sheep.lua
というファイルが羊くんの詳細のファイルで、その中に羊くんの諸々の設定がされておりました。その中で連想配列のキーfollow
がどうやら餌に関する値が書かれていました。
follow = {"farming:wheat", "default:grass_1"}
default:grass_1
はおそらくあの名もなき「そこら辺の雑草」だろう。もう一つのfarming:wheat
。どうやらこれが好みらしい。wheat?小麦を食うのか。Luaにちょっと入門
連想配列が出てきたので、ここから入門してみました。Luaにおいて連想配列は以下のような感じになっています。
x = {a="1", b="2"}
print(x["a"])
print(x["b"])
======
結果
======
1
2
ざっくり特徴的なものを書いてみました。
-- 一行コメント
--[[
複数行コメント
]]
-- `..`は文字列をつなぐ
print("Hello," ..
"world!!")
-- `!=`と同じ
1 ~= 2
--[[
`repeat~until`という文がある。
以下の場合、`i`が10になるまで処理を繰り返す。
]]
repeat
print(i)
i = i + 1
until (i >= 10)
--[[
書き方は違うが、同じ意味のコード
]]
s = "abcdef"
len1 = string.len(s)
len2 = s:len()
print(len1 == len2) --true
ほぼPythonもしくはシェルスクリプト。何となく理解しやすそうな印象を受けました。CやC++などへの組み込みなどはまだまだ先の話ですが、ひょっとしたら覚えやすい言語かもしれません。ご挨拶プログラム(greeting.lua)
function greeting (name)
return string.format("Hello, %s!!", name)
end
print(greeting("Tom"))
======
結果
======
Hello, Tom!!
Luaでの関数定義はfunction....end
とするようです。しかし、上記のプログラムではすこし問題があります。引数nameに何も与えなかった場合、結果はHello, nil!!となります。そこで、引数を与えられなかった場合のためにデフォルト引数を設定したいと考えます。そのコードは以下のようなものになりました。
function greeting (name)
local name = name or "world"
return string.format("Hello, %s!!", name)
end
print(greeting())
print(greeting("Tom"))
======
結果
======
Hello, world!!
Hello, Tom!!
これでどちらの場合でも問題なく出力できました。or
を使うというのは新鮮でした。
文字列の連結は以下のようにするようなのですが、どうも馴染めないので使いませんでした。
"Hello, " .. "world" .. "!!"
次にFizzBuzzプログラムをやってみようと思います。
function fizzbuzz (n)
if n % 15 == 0 then
print("Fizzbuzz")
elseif n % 5 == 0 then
print("Buzz")
elseif n % 3 == 0 then
print("Fizz")
else
print(n)
end
end
for i = 0, 30 do
fizzbuzz(i)
end
上記のコードは最も単純に書いた場合です。引数に数値が与えられること、計算が必ずうまくいくという条件の下でうまくいくプログラムです。と言いますのは、ここしばらく型のある言語ばかり触っていて、どうも型が気になる人になってしまったからです。それはさておき、Luaのfor文はちょっと変わってました。いつものくせでfor .. in ..
としてしまいそうでした。