# 同じ像を色々な場所に作ろう
# 同じ操作をまとめる関数(かんすう)をつくる
前章までの内容をマスターしていれば、工夫次第で様々なものをつくることができるようになっていると思います。今回勉強する「 関数(かんすう) 」は、皆さんのプログラミングの役に立つ、Pythonの大事な機能です。関数をマスターすると、プログラムにもっともっと強くなることができますので、じっくり学んでいきましょう。

上の画像では、ダイヤモンドブロックで、全く同じ像を3つ作っています。この像1つは、mc.setBlocks()メソッドを3回使い、x方向・y方向・z方向のそれぞれに縦長のブロックを置くことで作っています。例えばこの画像のように、3つそのまま作るとすれば、メソッドを9回使うことになります。ただ使うだけでも面倒ですが、一つ一つの座標をしっかり考えてあげないといけないのも辛いところです。
「同じ操作をくり返すならfor文があるじゃないか」と思うかもしれませんが、for文には、ある程度の規則性、たとえば、同じ数だけ座標がずれていく、といった性質がないといけません。そこでこの例のように、「好きな所に同じ像を作る」ために便利なのが、関数です。
# 関数とその使い方
いくつかの操作をひとまとまりにしたものを、関数と言います。関数は、自分で作って、実行することができます。これだけではイマイチ分かりづらいので、試しに下のコードを見てみましょう。
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
def hello():
mc.postToChat('Hello!')
hello()
これを実行すると、下のようになります。

このプログラムでは、「マインクラフトのチャット画面に'Hello!'と表示する」という役割を持った「hello関数」を作り、それを実行する、ということを行っています。
defから始まる2行が、関数を作っているコードです。関数を作ることを、「関数を 定義(ていぎ) する」といいます。defは、「今から関数を定義する」ことをコンピュータに伝えるための文です。その後に続くhello()が、定義する関数の名前になります。変数と同じで、名前は自由につけることができるのですが、最後に()と:が必要です。
def hello():の下の、インデントが下がっている部分が、hello関数の中身になります。hello関数が実行されると、この部分のプログラムが実行されることになります。ここでは、チャットウィンドウに'Hello!'と表示するだけです。これで、この関数の定義は終わりです。
英単語
「定義」は英語で「definition」と言います。関数を定義する時に使うdefは、この略です。
最後のhello()の部分で、定義したhello関数を実行しています。これを、「関数を 呼び出す 」と言います。定義した関数は、呼び出さないと使えません。もしhello()と書いていなければ、先ほどのプログラムは、実行しても画面に何も表示されません。
一度定義した関数は、何度でも呼び出すことができます。
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
def hello():
mc.postToChat('Hello!')
hello()
hello()
hello()
こうすると、定義したhello関数を3回呼び出すことになります。

また、関数の中身には、もっと多くの操作を書くことができます。
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
def hello():
a = 'Hello '
b = 'everyone!'
mc.postToChat(a + b)
hello()
hello関数の中で、aとbの2つの変数を作り、それぞれに文字列を代入してチャットに表示しています。

このように、関数を使えばいくつかの操作を一つにまとめることができます。
# 引数をつかう
関数には、メソッドと同じように 引数 を使うことができます。mc.setBlock()メソッドが、引数によって異なる場所に異なる種類のブロックを置くことができるように、関数も引数によって、異なる結果を得ることができます。
試しに、2つの引数をとって、それを足した結果をチャットに表示するadd関数を作ってみましょう。
英単語
「add」は英語で「加える、足し算する」という意味です。
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
def add(a, b):
mc.postToChat(a + b)
add(2, 3)
add(100, -20)
add('Hello ', 'Python!')
作ったadd関数を3回、それぞれ異なる引数で呼び出してみると、結果は下のようになります。

それぞれ、引数によって結果が変わっているのがわかるでしょうか。
def add(a, b):
mc.postToChat(a + b)
ここでadd関数を定義していますが、()のなかにaとbという文字を入れています。これは、この関数が呼び出されるときの2つの引数を、それぞれa, bという変数に代入して、この関数の中で使うことを示しています。この関数の仕事は、与えられた2つの引数をa、bの変数に代入して受け取り、それらを足した結果をチャットに表示することです。
例えばadd(2, 3)という形でこの関数を呼び出しすと、
2を変数a、3を変数bに代入する。a + bの結果(この場合は2 + 3の結果)をチャットに表示する。
ということを行います。
これで、同じ関数を使って、3つの異なる結果をチャットに表示させることができました。
# 同じ像をいくつかの場所に、同時に作る
ここで勉強した関数を使えば、冒頭の3つのダイヤモンド像を作るプログラムを、スッキリと書く事ができます。
何をするのかというと、「ある座標を引数に受け取って、それを中心部分(3本のバーが交わる点)として、像を作る関数」を作ります。これをstatue関数と名付けて、下のようにプログラムを組んでみましょう。
英単語
「statue」は英語で「像」という意味です。
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
a, b, c = mc.player.getPos()
def statue(x, y, z):
mc.setBlocks(x - 2, y, z, x + 2, y, z, 57)
mc.setBlocks(x, y - 2, z, x, y + 2, z, 57)
mc.setBlocks(x, y, z - 2, x, y, z + 2, 57)
statue(a, b + 5, c)
statue(a + 3, b + 2, c - 1)
statue(a - 2, b + 4, c - 5)
紛らわしくなるので、今回はプレイヤーの座標を、変数x、y、zではなく、変数a、b、cに代入していますが、使い方は変わりません。
statue関数は、像の中心の座標を、引数x、y、zで受け取って、それを中心に3本のバーを作ります。
最後の3行で、定義したstatue関数を3回、異なる引数を指定して呼び出しています。
例えばstatue(a, b + 5, c)では、statue関数は次のようなことを行います。
- 変数
xにa、yにb + 5、zにcを代入する mc.setBlocks(a - 2, b + 5, c, a + 2, b + 5, c, 57)を実行するmc.setBlocks(a, b + 3, c, a, b + 7, c, 57)を実行するmc.setBlocks(a, b + 5, c - 2, a, b + 5, c + 2, 57)を実行する
このように、statue関数の引数に適当な(x, y, z)の組を入れてあげるだけで、勝手にダイヤモンド像を作ってくれる関数ができました。一つ一つmc.setBlocks()メソッドに、計算して座標を入れる手間が少なくなりますね。

関数を使えば、色々なパターンの操作が、グッと楽になります。慣れるまで難しいかもしれませんが、自分で好きな関数を定義して呼び出すことができるようになりましょう。
# おわりに
Prosenseではマインクラフトを使ったプログラミングの個別指導もおこなっております。
マンツーマンでレッスンを受けながらマインクラフトでプログラミングを学びたい方はいますぐProsenseのLINE公式アカウントに登録ください。