【マインクラフト×Python】2次元リストでハートを描こう!

今回は、Pythonを使って「ハート」をえがくプログラムを作ってみましょう。

ハートの形を表現するために2次元リストを使います。この方法を覚えれば、ほかの形をえがくプログラムにも応用できますよ。

それでは早速さっそく、プログラミングを始めてみましょう!

 

スポンサーリンク

マインクラフトとPythonの連携について

Pythonでマインクラフトを動かすには、特別な準備が必要です。

セットアップ方法は、前の記事でくわしく説明していますので、まだ準備ができていない人はそちらをチェックしてみてください。

 

このプログラムでやること

ハート

今回のプログラムでは、以下手順ハートえがます

  1. ハートの形を定義する
    2次元リストを使ってハートのデザインを作ります。
    リストの中で、1 がブロックを置く場所、0 が空白の場所を表します。
  2. ブロックを配置してハートえが
    リストの情報をもとに、ブロックをならべてハート描画びょうがます

 

完成したソースコード

まずは、完成したプログラムを見てみましょう。

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次元リストを使うと、表のようなデータをコンピューターでかんたんにあつかえます。たとえば、クラスの成績表やゲームのマップなど、いろいろな場面で使われています。

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],
]

このリストの中で、1はブロックを置く場所を表し、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)
  1. 行番号を取得するループ
    外側のループでリストの行(縦方向の位置)を管理します。
    このループにより、どの行を処理するかが決まります。
  2. 列番号を取得するループ
    内側のループで、行の中の列(横方向の位置)を管理します。
    このループにより、どの列にブロックを置くかが決まります。

行番号を取得するループの中に列番号を取得するループを入れることで、リストの要素をひとつひとつ調べ、ハートの描画びょうがます

このように、ループの中にもうひとつループがある構造を二重ループといいます。

 

行番号を取得するループ

行番号を取得するループ

for row in range(len(heart)):

このループは、rowに0から5までの数字を順番に代入し、リストの行しています。

len(heart)でheartの行数(縦の数)を調べ、6を返しています。

len(リスト名):リストの長さ(要素の数)を調べる

 

 

列番号を取得するループ

列番号を取得するループ

for col in range(len(heart[row])):

このループは、col に0から6までの数字を順番に代入し、リストのしています。

len(heart[row])で、その行にふくまれる列の数(横の数)、7を取得します。

列番号を取得するループが終わったら、行番号を取得するループにもどります。

 

リストの1の場所に羊毛を置く

リストの要素にアクセスする準備ができました。

heart[row][col] でrow行目のcol列目の要素をみることができます。

if heart[row][col] == 1:
    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の値が出力されます。

ループの一番最初に print 文を追加

シェルには次のような内容が出力されます。

row: 0         ← print① 外側のループ1回目
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次元のリストを作る方法
  • ループを使ってリストからデータを取り出す方法

これらを理解することで、さまざまな形をえがくプログラムが作れるようになりますよ。

 

次回は、このプログラムを改造してハートをたくさんえがきます。お楽しみに!

タイトルとURLをコピーしました