前回の記事では、道を建設するプログラムを実行する際に数字を与えて、道の長さを指定する方法を紹介しました。
プログラムに与える値のことを「パラメータ」と呼びましたよね。
今回はプログラムに対して複数のパラメータを与えて実行する方法を紹介します。
プログラムに複数の値を与える方法
前回は1個のパラメータを与える際に、実行するファイル名の後ろに数字を付与していました。
この方法を応用し、今回は3個の値を与えてコマンドを実行してみましょう。
このコマンドの意味は、
- プログラムファイル road2.py に対して、
- 1個めのパラメータに「10」を与え、
- 2個めのパラメータに「3」を与え、
- 3個めのパラメータに「80」を与える
という意味を持ちます。
この3個のパラメータをPythonプログラムで受け取る場合は、以下のようなプログラムが必要になってきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 指定された値を受け取るために、sysというプログラムを読み込みます import sys # プログラムを実行するときに指定された値を取得し、params に入れておきます params = sys.argv # 道のブロック数を、プログラム実行時に指定された値に設定します length_number = params[1] # 道の幅を、プログラム実行時に指定された値に設定します road_width = params[2] # ブロックの種類を、プログラム実行時に指定された値に設定します block_number = params[3] |
プログラムで値を受け取る方法
前回の記事でも説明しましたが、コマンド実行時に与えられたパラメータをプログラムで受け取るには、以下の手続きが必要になります。
- パラメータを受け取る準備をする
- パラメータを受け取る
- 受け取ったパラメータを開いて整理する
パラメータを受け取る準備
1 2 |
# 指定された値を受け取るために、sysというプログラムを読み込みます import sys |
パラメータを受け取るコード
4 5 |
# プログラムを実行するときに指定された値を取得し、params に入れておきます params = sys.argv |
受け取ったパラメータを開いて整理するコード
7 8 9 10 11 12 13 14 |
# 道のブロック数を、プログラム実行時に指定された値に設定します length_number = params[1] # 道の幅を、プログラム実行時に指定された値に設定します road_width = params[2] # ブロックの種類を、プログラム実行時に指定された値に設定します block_number = params[3] |
という事になりますね。
今回は3個のパラメータをコマンド実行時に与えていますので、
params[1]
params[2]
params[3]
の、3個の値がそれぞれ受け取られていることが分かります。
以下に今回実行するプログラムを記載しますので、一緒に見てゆきましょう。
ご自身の環境で動かしてみたい場合は、以下の場所に保存してください。
ファイルパス(Macの場合)
/Users/ユーザ名/Library/Application Support/minecraft/mcpipy/road2.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 |
# coding: UTF-8 # 上のコードを書くことで、日本語のコメントを有効にします # マインクラフト用のプログラムを読み込みます from mine import * # 指定された値を受け取るために、sysというプログラムを読み込みます import sys # マインクラフト用のプログラムを、すぐに使えるように「mc」として準備します mc = Minecraft() # チャットメッセージを出力します mc.postToChat("road2.py の処理を開始します") # プログラムを実行するときに指定された値を取得し、params に入れておきます params = sys.argv # 道のブロック数を、プログラム実行時に指定された値に設定します length_number = params[1] # 道の幅を、プログラム実行時に指定された値に設定します road_width = params[2] # ブロックの種類を、プログラム実行時に指定された値に設定します block_number = params[3] # 指定された値は文字データとして認識されてしまうので、int()という命令を使って数字データに変換します length_number = int(length_number) # 道のブロック数を数字データに変換 road_width = int(road_width) # 道の幅を数字データに変換 block_number = int(block_number) # ブロック番号を数字データに変換 # チャットメッセージを出力します mc.postToChat(str(length_number) + 'ブロックの道を作ります') mc.postToChat('道の幅は' + str(road_width) + 'です') 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("実行終了です”) |
そして上記プログラムを実行するコマンドは、先にも紹介したこちらです。
実行した結果、
- 10ブロックぶんの道が
- 3ブロックぶんの幅で
- 80番のブロックで建設される
という内容になっています。
パラメータの数値を好きなものに変えて、どのように結果が変わってくるか試してみましょう!
エラーを確認する
もし3個のパラメータを指定せずに実行すると、コマンド実行時にPythonエラーが表示されます。
わざとエラーが発生するように動かしてみるのもプログラム設計には必要な事ですので、それぞれのコマンドを実行してエラー内容を確認してみましょう。
エラーが発生するコマンド
など。
チャットエリアに[ERR]と表示され、Pythonプログラム上でどのような不都合が発生したのかがメッセージ出力されます。
今回発生したエラーの内容は、
[ERR] File “road2.py”, line 20, in <module>
[ERR] length_number = params[1]
[ERR] IndexError: list index out of range
このエラーメッセージの意味を何となく日本語に翻訳してみると、
[エラー] ファイル “road2.py” の 20行め
[エラー] length_number = params[1] とプログラムされている部分
[エラー] エラーの種類は「IndexError」で、上のコードで使っているparams[1] という値は範囲外で見つかりません
大体こんな内容です。
プログラム実行時にパラメータの1個めが指定されていないので「params[1]」が範囲外で見つかりませんよーという内容です。
このエラーメッセージをGoogle等で検索すると解決方法が見つかる場合があるので、今後もしエラーで困った場合は検索エンジンの活用も検討してください。