改良版 Python プログラミングでマインクラフトの家を作る

Pocket

はじめに

 みなさま、こんにちは。前回、python プログラムから、マインクラフトの家を作る記事を書いたのですが、どうも出来がイマイチで反省点が多かったため、作りを見直してみることにしました。同じ家ですが、プログラムの作り方を変えて、今一度挑戦してみようと思います。

前回製作時の反省点

 前回のプログラムの反省点をまずは書いていきます。最初の記事ではそもそも記述が少し間違っていたのもあり、ご迷惑をおかけしたと反省しておりますが、それに加えて、座標の扱いが場当たり的で、可読性が悪いところが、問題点だと考えています。要するに、パッと関数を見たときに、どの地点の処理をしているのかがわかりにくいため、書いていくとわからなくなってしまいやすい、ということです。

今回の改良点

 そこで、今回の制作では次の改良を加えることにします。

  • ポイントをクラスとして定義。ポイントをひとつの値として扱うことで、どの地点の処理をしているかを明確化します。
  • ポイントのネーミングルールを準備。ポイントは、3次元で扱っていくと多くの点が存在することになるため、数がたくさん必要になってくることから、どのあたりのポイントかが名前から類推できるようにします。

クラスとは?

 先ほどの改良点のところで、「クラスを定義」とさらっと書きましたが、クラスとは、ある物事や事象を抽象化した型のことです。プログラミング言語では、あらかじめ用意された型があります。例えば、整数や小数といった数値を表す型や、文字列を表す型などがあります。これらの型はあらかじめ用意されているので、特に定義なしに使用できますが、今回の場合のように、建物を建てる地点(ポイント)を表現する型は存在しません。そのため、それを定義してあげることで、プログラムの中で値として使うことができるようにします。

ポイントのクラス

 ポイントのクラスを準備することにします。ポイントで重要なのは、x, y, z の3つの座標をひとまとめに扱うことです。そのため、クラスの定義では、ポイントのx, y, z の座標を表すための変数を入れることにします。そして、初期化時の処理として、座標の初期値を与えることにします。最初にある、def __init__ という関数が初期化時の関数です。Python プログラミングにおいては、クラスを定義する場合に、必ず __init__ 関数を用意する必要があります。クラスを実際使えるように変数として宣言する場合に、この関数で変数を作る処理を規定します。今回の例では、座標の値を書き込んでいます。それに加えて、基本演算である、= (__eq__ : 等しいかどうかを調べる関数)、!= (__ne__ :等しくおないかどうかを調べる関数)を定義します。これで、例えば、p1というポイントと、p2というポイントがあったときに、p1 とp2が等しいことを調べるためには、次のような形で記述することができます。

さらに、地点p と同じ座標を持つ変数を作るための関数 create、地点を移動させるための関数 move を用意します。実際のコードは次の通りになります。

ポイントを指定してブロックを置くための関数

 次に、ポイントを指定して、ブロックを置くための関数を用意します。ライブラリに元々用意されている関数の場合、ポイントではなく、3点の座標を指定する方法でした。今回は、可読性を上げるためにポイントを指定することでブロックを置くことができる関数を用意します。1ブロックだけ置く場合と、2地点を指定し、その地点で囲まれた中を埋める関数を用意します。

ポイントの名前付けルール

 それでは、実際にポイントの名前付けルールを考えます。図に示すように、それぞれのポイントに名前をつけます。柱を置くポイントそれぞれに、p1からp6までの名前をつけています。ただ、この名前のつけ方の場合、1階、2階、屋根と高さが違うポイントでその都度名前を変えないといけないことから、名前のルールとしては次のようにします。

  1. xとz座標が同じポイントは、下記の図にあるように最初の2文字はpの後に数字で表す。
  2. 続いてy軸方向の階数をつける。1階ならば1、2階ならば2、屋根ならばr とする。
  3. 最後にyが小さい順に数字をつける

point

このルールによって完全に場所がわかるわけではないですが、名前を見るとおおよその位置が想像できるようになるはずです。今回は、この方針で進めていきます。

1階部分の記述

 では、1階部分の記述からスタートします。前回の記事の内容を見ていただければ分かりますが、次のような流れで準備していきました。

  1.  最初に基礎部分のブロックを作る 
  2. 柱、梁を作る
  3.  壁を作る

最初の基礎ブロックを作る部分は、それぞれのポイント間にブロックを置くために、下記のような記述をしていました。

それを、ポイントを使ってブロックを置くコードに置き換えます。

ぱっと見でどのポイント間でのブロックの配置かがよくわかるようになったと思います。次に柱と梁です。柱と梁も先ほどの基礎のブロックと考え方は同じです。2地点をそれぞれ定義して、2地点感を木のブロックで埋めることでできます。

エントランスに関しても、同じようにポイントを指定する形に修正をしました。ドアとゲートの位置をそれぞれ、p5, p6 の位置から作成して、ドアとゲートを作成しています。

次に壁です。壁は、2本の柱の位置の間を指定された高さの分だけ全て埋める関数を追加します。指定した2地点がp1, p2 とした場合に、p1とp2を結ぶ線がx 軸方向か、z軸方向かで壁を立てる向きが変わるので、最初にp1, p2のx、zの値をそれぞれ比べて、どちらの方向かを見極めます。そして、柱の間に壁が来るようにsetBlocksを使ってブロックを埋めます。

そして、天井を入れます。2点を指定して、その間を埋める形になります。また、1階部分には以前は床を張っていなかったのですが、床をはるコードを追加しました。基本的には、天井と同じです。

2階のコードに関しては、1階部分と基本的に同じです。また、屋根の部分は、複雑な形状のため、ポイントを指定する場合とそうでない場合で差が出ないので、基本的にはそのままとしました。

最後に、部屋の中の明かりを追加します。これは、それぞれの柱があるポイントにて、高さを2ブロック床から上げたところに、設置していきます。例では、1階と2階の部分に置くようにしました。明かりを入れたため、夜でも明るくなりました。

夜でも中が明るく

改良版の家のコードは以下のようになります。

まとめ

 いかがでしたでしょうか。少しは見た目がすっきりしたかと思います。前回の記事がエラーが多い内容でしたので、改めて書きなおしてみました。ご意見いただければ幸いです。


東京都文京区小石川で小学生、中学生、高校生を対象としたプログラミング&ロボット教室を開校しています。コース概要のページで説明しております。創造性や協調性などこれからの時代に必要となる素養を育てるコースです。ご興味ありましたらぜひお問い合わせください。

お問い合わせはこちら!

問い合わせをする

Pocket

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL