お知らせ

『プログラミング能力検定(11月検定)』参加者募集中!

詳細はこちら

【13】ブロックの種類を調べる

マイクラ(Python)

前回は if文の条件文としてブロックがあるかないか調べました。今回はさらにつっこんで、ブロックの種類が何なのか調べるプログラムを作ります。

ブロックの種類は「ブロックID」で識別する

agent.inspect( 希望する調査結果のタイプ, 方向 )

これがブロックの種類を調べる命令です。inspectインスペクト というのは「調べる・調査する」という意味の英語です。そして ( ) の中に以下の要素を選んで入れます。

希望する調査結果のタイプ
AgentInspection.BLOCK・・・・・ブロックID
AgentInspection.DATA・・・・・ブロックデータ

方向
FORWARD・・・・・前
BACK・・・・・後ろ
LEFT・・・・・左
RIGHT・・・・・右
UP・・・・・上
DOWN・・・・・下

ブロックID というのは【07】アイテムを持たせる の回で紹介した「PLANKS_OAK 5」や「DIAMOND_ORE 56」といったIDネームID番号のことです。ブロックの識別にはこのブロックIDを使うのがわかりやすので、今回はこれを使います。

方向 はエージェントから見て、調べたいブロックがある位置を指定します。例えば前方ブロックIDを調べたい場合は以下のようなコードになります。

agent.inspect(AgentInspection.BLOCK, FORWARD)

inspect の結果は「True / False」ではない

ここで前回学習した if文の構文をおさらいしてみましょう。

if 条件式 :
    True のときの動作
else:
    False のときの動作

このように if文には TrueFalse の二択で答えられる条件式が必要となります。

前回学習した detect は「ブロックがあるかないか」を調べる命令のため、答えは TrueFalse の二択でした。ところが inspect は「ブロックの種類は何か」を調べる命令のため、答えは TrueFalse の二択では表現できず、このままでは if文の条件式にすることはできません。

そこで「inspect で調査した結果=ダイヤモンド鉱石だった」といった条件文にしてみます。これなら TrueFalse で判定できますよね。

agent.inspect(AgentInspection.BLOCK, FOWARD) == DIAMOND_ORE

多くのプログラミング言語では「AとBはイコールである」という内容を「A == B」と表記します。「A = B」ではないことに注意してください。

これで調べた結果が DIAMOND_ORE(ダイヤモンド鉱石)であれば結果は True、そうでなければ False ということになります。

ブロックIDにはID番号の数値を指定することもできます。
agent.inspect(AgentInspection.BLOCK, FOWARD) == DIAMOND_ORE
agent.inspect(AgentInspection.BLOCK, FOWARD) == 56

では実際に inspect を使った if文のプログラムを作ってみましょう。

ダイヤモンド鉱石があったら壊して進む

inspect課題画像

画像のようにダイヤモンド鉱石が埋まった長さ5ブロックの石の道を作ります。この上を歩きながらダイヤモンド鉱石だけを壊していくプログラムを作りましょう。

まず単純にエージェントを5ブロック進めるプログラムを作ります。

for index in range(5):
    agent.move(FORWARD, 1)

ただ5ブロック進むだけなら agent.move(FORWARD, 5) でもいいのですが、あとで if文もまとめて5回繰り返すことになるので今回は for を使います。

次に下のブロックを壊す命令を加えます。順番は壊してから前に移動です。

for index in range(5):
    agent.destroy(DOWN)
    agent.move(FORWARD, 1)

ただこのままだとすべてのブロックを壊してしまうので、ある条件のときだけ壊すように if文for文の中に挿入します。

for index in range(5):
    if 条件式:
        agent.destroy(DOWN)
    agent.move(FORWARD, 1)

agent.destroy(DOWN) は if文の中に組み込まれたので1段階インデントされます。

最後に今回学習した inspect の条件式を入れれば完成です。

for index in range(5):
    if agent.inspect(AgentInspection.BLOCK, DOWN) == DIAMOND_ORE:
        agent.destroy(DOWN)
    agent.move(FORWARD, 1)

inspect課題実行イメージ