今回は、Pythonを使って「ハート」を描くプログラムを作ってみましょう。
ハートの形を表現するために2次元リストを使います。この方法を覚えれば、他の形を描くプログラムにも応用できますよ。
それでは早速、プログラミングを始めてみましょう!
マインクラフトとPythonの連携について
Pythonでマインクラフトを動かすには、特別な準備が必要です。
セットアップ方法は、前の記事でくわしく説明していますので、まだ準備ができていない人はそちらをチェックしてみてください。
このプログラムでやること
今回のプログラムでは、以下の手順でハートを描きます:
- ハートの形を定義する
2次元リストを使ってハートのデザインを作ります。
リストの中で、1 がブロックを置く場所、0 が空白の場所を表します。 - ブロックを配置してハートを描く
リストの情報をもとに、ブロックをならべてハートを描画します。
完成したソースコード
まずは、完成したプログラムを見てみましょう。
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:
mc.setBlock(x + col, y, z + row, 35, 14)
プログラムの説明
2次元のリストでハートの形を定義する
プログラムの最初の部分では、ハートの形を2次元リストで定義しています。
2次元リストは「リストの中にリストが入っているもの」です。方眼紙のマス目のように、横の「行」と縦の「列」でデータを整理できます。
2次元リストを使うと、表のようなデータをコンピューターでかんたんに扱えます。たとえば、クラスの成績表やゲームのマップなど、いろいろな場面で使われています。
[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],
]
このリストの中で、1はブロックを置く場所を表し、0は空白の場所を表します。
ハートを描く
次に、このリストを使って実際にハートを描きます。
for col in range(len(heart[row])): ← 内側のループ(列番号を取得)
if heart[row][col] == 1:
mc.setBlock(x + col, y, z + row, 35, 14)
- 行番号を取得するループ
外側のループでリストの行(縦方向の位置)を管理します。
このループにより、どの行を処理するかが決まります。 - 列番号を取得するループ
内側のループで、行の中の列(横方向の位置)を管理します。
このループにより、どの列にブロックを置くかが決まります。
行番号を取得するループの中に列番号を取得するループを入れることで、リストの要素をひとつひとつ調べ、ハートの形を描画します。
このように、ループの中にもうひとつループがある構造を二重ループといいます。
行番号を取得するループ
このループは、rowに0から5までの数字を順番に代入し、リストの行の添え字にしています。
len(heart)でheartの行数(縦の数)を調べ、6を返しています。
列番号を取得するループ
このループは、col に0から6までの数字を順番に代入し、リストの列の添え字にしています。
len(heart[row])で、その行にふくまれる列の数(横の数)、7を取得します。
列番号を取得するループが終わったら、行番号を取得するループにもどります。
リストの1の場所に羊毛を置く
リストの要素にアクセスする準備ができました。
heart[row][col] でrow行目のcol列目の要素をみることができます。
mc.setBlock(x + col, y, z + row, 35, 14)
このコードでは、リスト内のrow行目のcol列目の値が 1 である場合にブロックを置きます。
また、x + col と z + row を使うことで、リスト内の位置をマインクラフト内の座標に変換します。
実行してみよう!
プログラムが完成したら「heart_shape.py」という名前でファイルを保存し、実行してみましょう。
プレイヤーの近くにハートができているはずです。
row と col の値の動きをみてみよう
二重ループがどのように動いているのかを確認するため、外側のループと内側のループの一番最初に print 文を追加して動かしてみましょう。
for row in range(len(heart)):
print(f”row: {row}”)
time.sleep(0.5)
for col in range(len(heart[row])):
print(f”row: {row}, col: {col}”)
if heart[row][col] == 1:
mc.setBlock(x + col, y, z + row, 35, 14)
time.sleep(0.5)
これを実行すると、シェルにrowとcolの値が出力されます。
シェルには次のような内容が出力されます。
row: 0, col: 0 ← print② 内側のループ1回目
row: 0, col: 1 ← print② 内側のループ2回目
row: 0, col: 2 ← print② 内側のループ3回目
row: 0, col: 3 ← print② 内側のループ4回目
row: 0, col: 4 ← print② 内側のループ5回目
row: 0, col: 5 ← print② 内側のループ6回目
row: 0, col: 6 ← print② 内側のループ7回目
row: 1 ← print① 外側のループ2回目
row: 1, col: 0
row: 1, col: 1
row: 1, col: 2
row: 1, col: 3
row: 1, col: 4
row: 1, col: 5
row: 1, col: 6
row: 2 ← print① 外側のループ3回目
row: 2, col: 0
row: 2, col: 1
row: 2, col: 2
row: 2, col: 3
row: 2, col: 4
row: 2, col: 5
row: 2, col: 6
row: 3 ← print① 外側のループ4回目
row: 3, col: 0
row: 3, col: 1
row: 3, col: 2
row: 3, col: 3
row: 3, col: 4
row: 3, col: 5
row: 3, col: 6
row: 4 ← print① 外側のループ5回目
row: 4, col: 0
row: 4, col: 1
row: 4, col: 2
row: 4, col: 3
row: 4, col: 4
row: 4, col: 5
row: 4, col: 6
row: 5 ← print① 外側のループ6回目
row: 5, col: 0
row: 5, col: 1
row: 5, col: 2
row: 5, col: 3
row: 5, col: 4
row: 5, col: 5
row: 5, col: 6
このように、内側のループがすべて回り終わると外側のループにもどり、次の値で再び内側のループを回ることが分かります。
二重ループは、外側のループが1回回る間に、内側のループがすべて回る仕組みです。
前回の小麦畑を作るプログラムでも二重ループを使っていました。
まとめ
今回のプログラムでは、Pythonの2次元リストを使ってハートを描く方法を学びました。
- 2次元のリストを作る方法
- ループを使ってリストからデータを取り出す方法
これらを理解することで、さまざまな形を描くプログラムが作れるようになりますよ。
次回は、このプログラムを改造してハートをたくさん描きます。お楽しみに!