前回、Pythonを使って「ハート」を描くプログラムを作りました。
でも、同じハートをちがう場所にたくさん描きたいとき、どうしますか?
座標だけちがうプログラムを何度も書くのは、コードが分かりにくくなりますし、修正も大変です。
そこで今回は、関数を使って効率的にハートをたくさん描くプログラムを作ってみましょう!
前回のプログラムのおさらい
前回は、ハートを1つ描くプログラムを作りました。
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
# プレイヤーの座標を取得
x, y, z = mc.player.getPos()
# ハートを描くスタート地点を設定
z += 5
# ハートの形を定義(2次元リスト)
# 1がブロックを置く場所、0は何も置かない
heart = [
[0, 1, 1, 0, 1, 1, 0],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 1, 0, 0, 0],
]
# ハートを描画
for row in range(len(heart)):
for col in range(len(heart[row])):
if heart[row][col] == 1: # 1の場所にブロックを置く
mc.setBlock(x + col, y, z + row, 35, 14) # 赤い羊毛
このプログラムは、ハートの形を2次元のリストで作り、その形に合わせてブロックを置いています。
今回は、このプログラムを改造してハートを3つ描くプログラムを作ります。
その前に、関数の仕組みを確認してみましょう。
関数は命令をひとまとめにして名前をつけたもの
関数とは、命令をひとまとめにして、何度でも使えるようにする仕組みです。同じような処理をくり返し使う場合に、関数としてまとめておくと便利です。
関数を使ってみよう
例として、下のかんたんなプログラムを見てみましょう。
def tashizan(num1, num2):
print(num1, " + ", num2)
num3 = num1 + num2
return num3
kotae = tashizan(3, 9)
print("答えは", kotae)
このプログラムでは、2つの数字を足し算して答えを表示しています。
実行すると、以下のように表示されます。
答えは 12
関数を定義する
関数を使うには、まず「関数を定義する」必要があります。これは、命令をひとまとめにして準備する作業です。Scratchの「ブロック定義」と同じイメージです。
下のコードは、足し算をする関数を定義しています。
print(num1, ” + “, num2)
num3 = num1 + num2
return num3
関数の書き方は次のようになります。
命令文
…
return 戻り値
def の後に関数名を書きます。defはdefinition(定義)の略です。関数名の後にカッコをつけ、その中に必要なデータ(引数)を記述します。
関数の中の命令文の前には、半角スペース4つ(インデント)を入れてください。
関数を呼び出す
定義した関数を使うには、「関数を呼び出す」必要があります。
この例では、tashizan(3, 9)が関数の呼び出し部分です。
関数の呼び出しは、次のように書きます。
引数は関数に渡す「材料」
引数(ひきすう)とは、関数に渡す値です。この値を使って関数が処理を行います。引数は、関数名の後ろのカッコの中に記述します。
引数とは、関数を呼び出したときに引きわたされる値のことで、関数が処理するための材料です。関数名の後ろのカッコに引数を書きます。
この場合、num1とnum2が引数です。関数を呼び出すときに渡した値が、これらの引数に格納されます。
このコードでは、3がnum1に、9がnum2に渡されます。ちなみに引数で使う変数(例:num1やnum2)は、関数の中だけで使えるローカル変数です。関数の外では使えません。
関数が処理した結果として返す「答え」
戻り値(もどりち)とは、関数が処理の結果として返す値です。
このコードでは、num3の値が戻り値として返されています。returnを使うと、その時点で関数の処理は終了し、呼び出し元に戻ります。
戻り値を受け取るには、次のように書きます。
この場合、tashizan(3, 9)の戻り値(計算結果)がkotaeに代入されます。
プログラムの改造:関数を使ってハートを3つ描く
前回のプログラムを改造してみましょう。完成したプログラムは以下の通りです。
import mcpi.minecraft as minecraft
def draw_heart(mc, x, y, z):
"""
ハートを描画する関数
:param mc: Minecraftオブジェクト
:param x: 描画開始のx座標
:param y: 描画開始のy座標
:param z: 描画開始のz座標
"""
# ハートの形を定義(2次元リスト)
heart = [
[0, 1, 1, 0, 1, 1, 0],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 1, 0, 0, 0],
]
# ハートを描画
for row in range(len(heart)):
for col in range(len(heart[row])):
if heart[row][col] == 1: # 1の場所にブロックを置く
mc.setBlock(x + col, y, z + row, 35, 14) # 赤い羊毛
# メイン処理
if __name__ == "__main__":
mc = minecraft.Minecraft.create()
# プレイヤーの座標を取得
x, y, z = mc.player.getPos()
# ハートを描画する開始地点を設定
z += 5
for _ in range(3):
# ハートを描画
draw_heart(mc, x, y, z)
# 次のハートの位置をずらす
x += 8
改造ポイントの解説
関数を使って「ハートを描く処理」を整理
ハートを描く処理を、draw_heartという関数にまとめます。
ハートを描く処理を、draw_heartという関数にまとめます。
関数の中ではハートの形を2次元のリストで作り、その形に合わせてブロックを置く処理を実行します。
メイン処理
if __name__ == “__main__”: は、Pythonプログラムがどのように実行されているかを判定する条件式です。
このファイルが直接実行されたときだけ中の処理が動き、他のプログラムからインポートされた場合は実行されません。
プレイヤーの座標を取得
プレイヤーの位置を基準にして、ハートを描き始めます。
ループでハートを3つ描く
draw_heart(mc, x, y, z)
x += 8
ループを使って、draw_heart関数を3回呼び出します。x座標をずらして、ハートが横に並ぶようにしています。
実行してみよう!
このプログラムを「heart_shape2.py」という名前で保存します。
実行すると、プレイヤーの位置から少し離れた場所にハートが横に3つ並んで描かれます!
まとめ
今回のプログラムでは、関数を使ってハートを3つ描くプログラムプログラムを作りました。
関数とは、命令をひとまとめにして、何度でも使えるようにする仕組みです。
関数の定義
命令文
…
return 戻り値
関数の呼び出し
- 引 数:関数に渡す値
- 戻り値:関数が処理の結果として返す値
ぜひこのプログラムを改造してみましょう!たとえば、ハートの色を引数で指定できるようにすると、赤以外の色も簡単に描けるようになります。
好きな色を指定して、カラフルなハートをたくさん描いてみてください!