マインクラフトのPythonプログラムで、もしコマンドを実行したときにエラーが発生したら、システムが自動的にメッセージを吐き出します。
こんな感じで。
[ERR] File “road2.py”, line 20, in <module>
[ERR] length_number = params[1]
[ERR] IndexError: list index out of range
でもシステムのメッセージは英語や呪文みたいに難しい内容なので、自分で決めたメッセージを吐き出したいですよね。
そんな時の基本的な方法を前回の記事で紹介しました。
今回はこの方法をちゃんと使えるように、道を自動的に建設するプログラムに組み込んでゆきましょう。
以前紹介したPythonプログラムをベースに、改造をしてゆきます。
改造のベースとなるプログラムはこちらですので、あらかじめこちらのプログラムを理解しておくことをオススメします。
さっそく今回のPythonプログラムを見てみましょう。
ご自身の環境で動かしてみたい場合は、以下の場所に保存してください。
ファイルパス(Macの場合)
/Users/ユーザ名/Library/Application Support/minecraft/mcpipy/road3.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# coding: UTF-8 # 上のコードを書くことで、日本語のコメントを有効にします # マインクラフト用のプログラムを読み込みます from mine import * # sysというプログラムを読み込みます import sys # マインクラフト用のプログラムを、すぐに使えるように「mc」として準備します mc = Minecraft() # チャットメッセージを出力します mc.postToChat("road3.py の処理を開始します") # プログラムを実行するときに指定されたパラメータを取得します params = sys.argv # ここから: パラメータが正しいかを調べます try: # パラメータが4個指定されているかを確認します # 1個め、params[0] には実行するプログラムのファイル名が入っています # 2個め、params[1] には道のブロック数が入っています # 3個め、params[2] には道の幅が入っています # 4個め、params[3] には道の種類が入っています if not 4 == len(params): # もしパラメータが3個指定されていなかった場合、エラー処理に移動します raise ValueError ('このコマンドは3個のパラメータが必要です') except ValueError as e: # チャットメッセージを出力します mc.postToChat('エラーが発生しました') mc.postToChat(e) # エラーメッセージの内容を出力します mc.postToChat('プログラムを途中で終了します') # プログラム停止 sys.exit() # ここまで: パラメータが正しいかを調べます # ここまでの処理でエラーが発生しなかった場合に、以下の処理に進みます # チャットメッセージを出力します mc.postToChat('パラメータのエラーはありませんでした') # ここから: 受け取ったパラメータを整理します # 道のブロック数を、プログラム実行時に指定された値に設定します length_number = int(params[1]) # 道の幅を、プログラム実行時に指定された値に設定します road_width = int(params[2]) # ブロックの種類を、プログラム実行時に指定された値に設定します block_number = int(params[3]) # ここまで: 受け取ったパラメータを整理します # チャットメッセージを出力します mc.postToChat(str(length_number) + 'ブロックの道を作ります') mc.postToChat('道の幅は' + str(road_width) + 'です') # ここから: 条件によって、チャットメッセージに出力する内容を変えてゆきます if 1 == block_number: mc.postToChat('ブロックの種類は石です') if 2 == block_number: mc.postToChat('ブロックの種類は草土です') if 3 == block_number: mc.postToChat('ブロックの種類は土です') if 4 == block_number: mc.postToChat('ブロックの種類は玉石です') if 5 == block_number: mc.postToChat('ブロックの種類は木材です') if 6 == block_number: mc.postToChat('ブロックの種類は苗木です') if 7 == block_number: mc.postToChat('ブロックの種類は岩盤です') if 8 >= block_number: mc.postToChat('ブロックの種類は' + str(block_number) + 'です') # ここまで: 条件によって、チャットメッセージに出力する内容を変えてゆきます # 道の幅が1個多く作られてしまうので、ここで調整 road_width = road_width - 1 # 自分の位置情報を取得します # 取得してきた位置情報は、それぞれ変数 x, y, z に保存されます x,y,z = mc.player.getPos() # 繰り返し命令を実行します # 繰り返す回数は length_number で指定した数ぶん for i in range(length_number): # i には何回めの繰り返し回数かが記録されています # ただし i はゼロから開始されるので、チャットメッセージには i+1 の値を出力します mc.postToChat(str(i+1) + "ブロックめの道を作ります") # i ブロックめの道を作ります mc.setBlocks(x+i, y-1, z, x+i, y-1, z+road_width, block_number) # 繰り返し命令はここで終了です # 繰り返し命令から抜け出すと、以下の実行が始まります mc.postToChat("道を" + str(i+1) + "ブロック作りました") mc.postToChat("実行終了です") |
今回はじめて出てくる命令として「if」というものがあります。
これは英語で「もしも」という意味の単語で、
- もしも信号が青色だった場合は進む
- もしも信号が赤色だった場合は止まる
といったように、条件によってプログラムの動きを変えるときに使用する命令です。
上記のPythonプログラムから簡単な例を見る場合は、以下の部分が良いでしょう。
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# ここから: 条件によって、チャットメッセージに出力する内容を変えてゆきます if 1 == block_number: mc.postToChat('ブロックの種類は石です') if 2 == block_number: mc.postToChat('ブロックの種類は草土です') if 3 == block_number: mc.postToChat('ブロックの種類は土です') if 4 == block_number: mc.postToChat('ブロックの種類は玉石です') if 5 == block_number: mc.postToChat('ブロックの種類は木材です') if 6 == block_number: mc.postToChat('ブロックの種類は苗木です') if 7 == block_number: mc.postToChat('ブロックの種類は岩盤です') if 8 >= block_number: mc.postToChat('ブロックの種類は' + str(block_number) + 'です') # ここまで: 条件によって、チャットメッセージに出力する内容を変えてゆきます |
このプログラムを日本語に翻訳すると、
もし「1の数字」と「block_number」に入っている値が同じ場合は、
チャットメッセージに「ブロックの種類は石です」と出力します。
もし「2の数字」と「block_number」に入っている値が同じ場合は、
チャットメッセージに「ブロックの種類は草土です」と出力します。
といったように、「block_number」の中に入っている値によってプログラムの動きを変えて、出力するメッセージを変更しているのです。
もう少し難しい使い方としては、
21 22 23 24 25 26 27 28 |
# パラメータが4個指定されているかを確認します # 1個め、params[0] には実行するプログラムのファイル名が入っています # 2個め、params[1] には道のブロック数が入っています # 3個め、params[2] には道の幅が入っています # 4個め、params[3] には道の種類が入っています if not 4 == len(params): # もしパラメータが3個指定されていなかった場合、エラー処理に移動します raise ValueError ('このコマンドは3個のパラメータが必要です') |
の部分ですね。
「not」は否定を意味していますので、プログラム「len(params)」の値が「4じゃない場合」に限り、エラー処理に移動するという内容です。
「len」というプログラムの意味を詳しく知りたい場合は、Google等で python len などのキーワードで検索すると、沢山の解説ページが見つかると思います。
「if」についても同じくGoogleで python if で検索すると使い方を親切に紹介したページが見つかると思いますので、Pythonプログラムで分からないことがあれば積極的にGoogleで調べてみましょう!
「if」を使ったプログラムは今後たくさん出てきますので、今の段階で理解しておくと良いでしょう。
そして今回もっとも注目すべきプログラムの部分は以下です。
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# ここから: パラメータが正しいかを調べます try: # パラメータが4個指定されているかを確認します # 1個め、params[0] には実行するプログラムのファイル名が入っています # 2個め、params[1] には道のブロック数が入っています # 3個め、params[2] には道の幅が入っています # 4個め、params[3] には道の種類が入っています if not 4 == len(params): # もしパラメータが3個指定されていなかった場合、エラー処理に移動します raise ValueError ('このコマンドは3個のパラメータが必要です') except ValueError as e: # チャットメッセージを出力します mc.postToChat('エラーが発生しました') mc.postToChat(e) # エラーメッセージの内容を出力します mc.postToChat('プログラムを途中で終了します') # プログラム停止 sys.exit() # ここまで: パラメータが正しいかを調べます |
このPythonプログラムでは、前回の記事で紹介した例外処理(エラー処理)がおこなわれていて、以下のような流れになっています。
- 今からプログラムの実行を試します
- もしパラメータの数が4個ではなかった場合
- エラーを発生させて、except に文字「このコマンドは3個のパラメータが必要です」を渡します
- もしエラーが発生した場合は
- エラー発生元から値を「e」という物で受け取って
- チャットメッセージで「e」の値を出力して
- プログラムを停止します
※もしパラメータの数が4個だった場合は、3番以降の例外処理は実行されず、最後までプログラムが実行されます。
例外処理とif文を上手に使うことで、エラー処理や動作の分岐がより便利におこなえるようになります。
繰り返しプログラミングの練習をすることで自然と身についてくると思いますので、今の段階では何となく覚えておくと良いでしょう。
次回はもう少し複雑な、でも親切な設計のエラー処理プログラムを紹介します。