tkinterを使って迷路内を移動しよう
今回は前回作った迷路を使って、キャラクターが移動するプログラムを作ります。
赤い円を操作して緑のゴールを目指します。
移動できる範囲は白い部分のみで、黒い部分は移動できません。
右下の緑色のマスがゴールとなります。
Pythonスクリプト
今回のスクリプトは、以下のようになります。
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 |
### インポート import tkinter ### 定数 WIDTH = 320 # 画面横サイズ HEIGHT = 320 # 画面縦サイズ SIZE = 40 # 辺長 ### 変数 x = 0 # X座標 y = 0 # Y座標 x_pos = 0 # X座標(円) y_pos = 0 # Y座標(円) ### マップ ####### 0 1 2 3 4 5 6 7 ##### MAP = [[1,0,0,0,0,0,0,0], # 0 [1,0,0,1,1,1,1,0], # 1 [1,1,1,1,0,0,1,0], # 2 [0,0,0,0,1,1,1,0], # 3 [0,0,0,0,1,0,0,0], # 4 [0,0,0,0,1,1,1,0], # 5 [0,0,0,0,0,0,1,1], # 6 [0,0,0,0,0,0,0,2]] # 7 ### 入力キー表示関数 def input_key(event): ### グローバル変数宣言 global x_pos global y_pos ### キー名取得 key_name = event.keysym ### 移動可否確認 if key_name == "Left": if x_pos > 0 and MAP[y_pos][x_pos-1] != 0: x_pos -= 1 elif key_name == "Right": if x_pos < len(MAP[y_pos])-1 and MAP[y_pos][x_pos+1] != 0: x_pos += 1 elif key_name == "Up": if y_pos > 0 and MAP[y_pos-1][x_pos] != 0: y_pos -= 1 elif key_name == "Down": if y_pos < len(MAP)-1 and MAP[y_pos+1][x_pos] != 0: y_pos += 1 ### 円表示 canvas.coords(id, x_pos*SIZE, y_pos*SIZE, x_pos*SIZE+SIZE, y_pos*SIZE+SIZE) ### ゴール確認 if MAP[y_pos][x_pos] == 2: canvas.delete("all") canvas.create_text(160, 160, text="GOOL!", font=(None,48), fill="red") ### キャンバス作成 canvas = tkinter.Canvas(width=WIDTH, height=HEIGHT) ### キャンバス表示 canvas.pack() ### 縦座標 for b1 in MAP: ### 横座標 for b2 in b1: if b2 == 0: # 壁描画 canvas.create_rectangle(x*SIZE, y*SIZE, x*SIZE+SIZE, y*SIZE+SIZE, fill="#484848", outline="#484848") elif b2 == 1: # 通路描画 canvas.create_rectangle(x*SIZE, y*SIZE, x*SIZE+SIZE, y*SIZE+SIZE, fill="#E0E0E0", outline="#E0E0E0") elif b2 == 2: # ゴール描画 canvas.create_rectangle(x*SIZE, y*SIZE, x*SIZE+SIZE, y*SIZE+SIZE, fill="#48B060", outline="#48B060") x += 1 ### 座標更新 else: x = 0 y += 1 ### オブジェクトID取得 id = canvas.create_oval(x_pos, y_pos, x_pos+SIZE, y_pos+SIZE, outline="red", fill="red") ### キー入力時のイベント取得 canvas.bind("<KeyPress>", input_key) ### フォーカスセット canvas.focus_set() ### イベントループ canvas.mainloop() |
スクリプト解説
マップの描画など、前回から変更のない箇所については、前回の記事を参照してください。
34行目
押されたキーの種類を取得します。
37~48行目
入力されたキーによって、円の移動先を設定します。
MAPリストの要素が0は、移動できないエリアです。
また、MAPリストの1次リストがY座標、2次リストがX座標になります。
51行目
移動先に円を表示します。
54~56行目
ゴールに到着したかどうかを、現在のMAPリストの要素を見て確認します。
要素が2の場合は、ゴールに到着しています。
86行目
フォーカスセットをすることにより、画面に対してキー入力を有効にします。
89行目
キーが押下された時のイベントを取得して、input_key関数を呼び出します。