Pygameを使って迷路を表示してみよう
今回はPygameを使って、2次元リストを元に迷路を描画するプログラムを作ります。
黒は壁で通れない場所、灰色は通れる場所、緑色はゴールをイメージしています。
このマップは、以下の記事で使ったものを流用しています。
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 |
### インポート import sys import pygame from pygame.locals import QUIT ### 定数 WIDTH = 320 # 画面横サイズ HEIGHT = 320 # 画面縦サイズ B_SIZE = 40 # 辺長 W_TIME = 20 # 待ち時間 ### マップ ####### 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 main(): pygame.init() surface = pygame.display.set_mode((WIDTH, HEIGHT)) ### 座標初期化 x = 0 y = 0 ### 縦座標 for b1 in MAP: ### 横座標 for b2 in b1: if b2 == 0: # 壁描画 pygame.draw.rect(surface, ( 48, 48, 48), (x*B_SIZE,y*B_SIZE,B_SIZE,B_SIZE), 0) elif b2 == 1: # 通路描画 pygame.draw.rect(surface, (224,224,224), (x*B_SIZE,y*B_SIZE,B_SIZE,B_SIZE), 0) elif b2 == 2: # ゴール描画 pygame.draw.rect(surface, ( 48,176, 96), (x*B_SIZE,y*B_SIZE,B_SIZE,B_SIZE), 0) x += 1 ### 座標更新 else: x = 0 y += 1 ### マップ描画 pygame.display.update() ### イベント待ち while True: pygame.time.wait(W_TIME) ### イベント取得 for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() ############################ ### メイン関数呼び出し ############################ if __name__ == "__main__": main() |
スクリプト解説
7~9行目
ひとつの辺の長さを40ドットの正方形を 8 x 8 個並べるために、今回は画面サイズを 320 x 320 にしています。
14~21行目
8 x 8 の2次元リストを定義します。
0は壁、1は通路、2はゴールとしています。
35~50行目
2次元リストなので、二重ループでリストの値を取得します。
値により描画する正方形の色を変えています。
40、42、44行目
pygame.draw.rect()関数は、四角形を描画します。
引数の意味は、以下の通りです。
1番目:四角形を描画する画面
2番目:四角形の色をRGBで表す
3番目:四角形の座標と辺の長さ(X座標、Y座標、横の長さ、縦の長さ)
4番目:外枠の太さ。0にすると四角形の内部は塗りつぶされる。塗りつぶす場合は省略可能
53行目
pygame.display.update()関数で、四角形を画面に描画します。
56~63行目
無限ループでイベントを待ちます。
✕(バツ)ボタンが押されたら、処理を終了して画面を閉じます。