【Python講座】Pythonで作るパズルゲーム#5_タイトルやゲームオーバー等を追加して完成させよう
こんにちは、koheiです。
Pythonでパズルゲームを作ろうの最終回です。
- 【Python講座】Pythonで作るパズルゲーム#1_Python基本
- 【Python講座】Pythonで作るパズルゲーム#2_マス上にだんごを表示させてみる
- 【Python講座】Pythonで作るパズルゲーム#3_だんごを落下させよう
- 【Python講座】Pythonで作るパズルゲーム#4_揃っただんごを消してみよう
- 【Python講座】Pythonで作るパズルゲーム#5_タイトルやゲームオーバー等を追加して完成させよう←★今回の記事
動画解説もあります。記事と合わせてどうぞ!
目次
今回のゴール
ゲームのタイトルやゲームオーバーなどを追加してゲームとして完成させたいと思います。
練習用素材は以下からダウンロードできます。
#5_タイトルやゲームオーバー等を追加して完成させよう
1 file(s) 816.83 KB状態を追加しゲームの処理を分ける
前回まで、3つ以上揃っただんごを消す処理まで作りました。
これからゲームとして完成させるには、タイトル画面、だんごの落下、だんごが揃ったかの判定、だんご消す、ゲームオーバー処理など
様々な処理を作っていく必要があります。そこで、ゲームの進行状態を表す変数(state)を追加します。
このゲーム状態(state)の値によって、ゲーム処理を分けていきます。
state=0 タイトル画面処理を作る
まずは、stateが0 タイトル画面処理を作っていきます。
メイン処理内でゲーム状態を表す変数stateを宣言しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#ゲームメイン処理 def main(): cursor_x=0 cursor_y=0 global score,hisc #ゲーム進行状態(0:初回画面/1:ゲーム開始待ち/2:だんご落下中/3:だんご判定/4:スコア判定(だんご消す)/5:カーソル入力待ち/6:ゲームオーバー) state = 0 # 初期化(0:初回画面) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() mouse_x,mouse_y = pygame.mouse.get_pos() #マウス位置 mouse_click = pygame.mouse.get_pressed() #マウスクリック mouse_c = mouse_click[0] |
続いて、タイトル画像とクリックスタート用の画像をロードしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
if __name__ == '__main__': #初期化、画像ロード処理など pygame.init() pygame.display.set_caption("だんごパズル(pygame ver)") screen = pygame.display.set_mode((912,768)) font = pygame.font.Font(None,60) clock = pygame.time.Clock() bg = pygame.image.load("dango_back.png") #背景画像をロード cursor = pygame.image.load("cursor.png") #カーソル画像をロード img_dango = [ #だんご画像をロード None, pygame.image.load("dango1.png"), pygame.image.load("dango2.png"), pygame.image.load("dango3.png"), pygame.image.load("dango4.png"), pygame.image.load("dango_kushi.png") ] title = pygame.image.load("game_title.png") click_start = pygame.image.load("click_start.png") #ゲームメイン処理 main() |
メイン処理のwhile文内で、状態を判定する処理を追加していきましょう。
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 |
#ゲームメイン処理 def main(): cursor_x=0 cursor_y=0 global score,hisc #ゲーム進行状態(0:初回画面/1:ゲーム開始待ち/2:だんご落下中/3:だんご判定/4:スコア判定(だんご消す)/5:カーソル入力待ち/6:ゲームオーバー) state = 0 # 初期化(0:初回画面) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() mouse_x,mouse_y = pygame.mouse.get_pos() #マウス位置 mouse_click = pygame.mouse.get_pressed() #マウスクリック mouse_c = mouse_click[0] #マウス左クリック状態を設定 # -------ゲーム進行状態0:初回画面---------- if state==0: screen.blit(bg,[0,0]) #背景画像描画 screen.blit(title,[50,240]) #タイトル描画 screen.blit(click_start,[50,560]) #クリックスタート描画 state = 1 mouse_c = False |
if文でstateが0の場合の処理を追加しています。(上記19行目〜25行目)
タイトル描画等が終わったら、ゲーム進行状態(state)を1にして次の状態へ移行します。
state=1 ゲーム開始入力まち
今回のゲームは、タイトル画面からマウスをクリックしたらゲームスタートするようにします。
なので、左クリック状態がTrueの時、変数の初期化、最上位にだんごをランダムに配置し、次の状態へ移行します。
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 |
#ゲームメイン処理 def main(): cursor_x=0 cursor_y=0 global score,hisc #ゲーム進行状態(0:初回画面/1:ゲーム開始待ち/2:だんご落下中/3:だんご判定/4:スコア判定(だんご消す)/5:カーソル入力待ち/6:ゲームオーバー) state = 0 # 初期化(0:初回画面) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() mouse_x,mouse_y = pygame.mouse.get_pos() #マウス位置 mouse_click = pygame.mouse.get_pressed() #マウスクリック mouse_c = mouse_click[0] #マウス左クリック状態を設定 # -------ゲーム進行状態0:初回画面---------- if state==0: screen.blit(bg,[0,0]) #背景画像描画 screen.blit(title,[50,240]) #タイトル描画 screen.blit(click_start,[50,560]) #クリックスタート描画 state = 1 mouse_c = False # -------ゲーム進行状態1:ゲーム開始待ち---------- elif state==1: if mouse_c == True: #マウスクリックされたとき for y in range(10): for x in range(8): dango[y][x] = 0 #マス目の配列初期化 mouse_c = False score = 0 next_dango = 0 cursor_x = 0 cursor_y = 0 set_dango() #最上位にだんごセット state = 2 |
以下が最上位にだんごをランダムに配置する処理です。
1 2 3 4 |
# 最上段にだんごをセットする関数 def set_dango(): for x in range(8): dango[0][x] = random.randint(0,4) #難易度に応じてランダムにだんごをセットする。 |
state=2 だんご落下処理
状態state=2はだんご落下処理です。前回作成しただんご落下処理を少し改造して、だんごの落下処理がすべて終わったかどうかを判定するようにします。
1 2 3 4 5 6 7 8 9 10 |
# だんごを落下させる関数 def drop_dango(): flg = False for y in range(8,-1,-1): for x in range(8): if dango[y][x] !=0 and dango[y+1][x] == 0: dango[y+1][x] = dango[y][x] dango[y][x] = 0 flg = True return flg |
関数内に入った時に、変数flgをFalseで初期化しておきます。だんごの落下処理が実行された時、flgをTrueに設定します。
何も落下がなければ、flgはFalseのままリターンされます。すなわち落下処理がすべて終わったら戻り値はFalseで返ります。
続いて、メイン処理内にstate=2の処理を以下のように実装します。
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 |
#ゲームメイン処理 def main(): cursor_x=0 cursor_y=0 global score,hisc #ゲーム進行状態(0:初回画面/1:ゲーム開始待ち/2:だんご落下中/3:だんご判定/4:スコア判定(だんご消す)/5:カーソル入力待ち/6:ゲームオーバー) state = 0 # 初期化(0:初回画面) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() mouse_x,mouse_y = pygame.mouse.get_pos() #マウス位置 mouse_click = pygame.mouse.get_pressed() #マウスクリック mouse_c = mouse_click[0] #マウス左クリック状態を設定 # -------ゲーム進行状態0:初回画面---------- if state==0: screen.blit(bg,[0,0]) #背景画像描画 screen.blit(title,[50,240]) #タイトル描画 screen.blit(click_start,[50,560]) #クリックスタート描画 state = 1 mouse_c = False # -------ゲーム進行状態1:ゲーム開始待ち---------- elif state==1: if mouse_c == True: #マウスクリックされたとき for y in range(10): for x in range(8): dango[y][x] = 0 #マス目の配列初期化 mouse_c = False score = 0 next_dango = 0 cursor_x = 0 cursor_y = 0 set_dango() #最上位にだんごセット state = 2 # -------ゲーム進行状態2:だんご落下中---------- elif state==2: if drop_dango() == False: #だんごを落下させる state = 3 #落下が終わったら、state=3へ disp_dango() # だんご表示 |
だんご落下処理(drop_dango)に戻り値を追加したので、Falseの場合は次の状態だんご判定処理へ移行します。
state=3 だんご判定
次にメイン処理内にstate=3(だんご判定)の処理を以下のように実装します。
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 |
#ゲームメイン処理 def main(): cursor_x=0 cursor_y=0 global score,hisc #ゲーム進行状態(0:初回画面/1:ゲーム開始待ち/2:だんご落下中/3:だんご判定/4:スコア判定(だんご消す)/5:カーソル入力待ち/6:ゲームオーバー) state = 0 # 初期化(0:初回画面) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() mouse_x,mouse_y = pygame.mouse.get_pos() #マウス位置 mouse_click = pygame.mouse.get_pressed() #マウスクリック mouse_c = mouse_click[0] #マウス左クリック状態を設定 # -------ゲーム進行状態0:初回画面---------- if state==0: screen.blit(bg,[0,0]) #背景画像描画 screen.blit(title,[50,240]) #タイトル描画 screen.blit(click_start,[50,560]) #クリックスタート描画 state = 1 mouse_c = False # -------ゲーム進行状態1:ゲーム開始待ち---------- elif state==1: if mouse_c == True: #マウスクリックされたとき for y in range(10): for x in range(8): dango[y][x] = 0 #マス目の配列初期化 mouse_c = False score = 0 next_dango = 0 cursor_x = 0 cursor_y = 0 set_dango() #最上位にだんごセット state = 2 # -------ゲーム進行状態2:だんご落下中---------- elif state==2: if drop_dango() == False: #だんごを落下させる state = 3 #落下が終わったら、state=3へ disp_dango() # だんご表示 # -------ゲーム進行状態3:だんご判定---------- elif state==3: check_dango() #だんごが揃ったか判定 state = 4 disp_dango() # だんご表示 |
46行目のだんごが揃ったか判定する処理(check_dango())は、前回作成した関数のままです。3つ揃っていたら、串のデータに変換しています。
あとは、次の状態state=4(だんご消去処理(スコア計算))に移行します。
state=4 だんご消去処理(スコア計算)
メイン処理に実装する前にまず、マスの最上位にだんごが達しているかを調べる関数を作っておきます。これはゲームオーバー判定に使います。
以下の様に実装しましょう。
1 2 3 4 5 6 |
# 最上段に達したか調べる関数 def over_dango(): for x in range(8): if dango[0][x] > 0: return True return False |
続いて、メイン処理内にstate=4の処理を以下のように実装しましょう。
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 |
#ゲームメイン処理 def main(): cursor_x=0 cursor_y=0 global score,hisc #ゲーム進行状態(0:初回画面/1:ゲーム開始待ち/2:だんご落下中/3:だんご判定/4:スコア判定(だんご消す)/5:カーソル入力待ち/6:ゲームオーバー) state = 0 # 初期化(0:初回画面) next_dango = 0 #次にセットするだんご while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() mouse_x,mouse_y = pygame.mouse.get_pos() #マウス位置 mouse_click = pygame.mouse.get_pressed() #マウスクリック mouse_c = mouse_click[0] #マウス左クリック状態を設定 # -------ゲーム進行状態0:初回画面---------- if state==0: screen.blit(bg,[0,0]) #背景画像描画 screen.blit(title,[50,240]) #タイトル描画 screen.blit(click_start,[50,560]) #クリックスタート描画 state = 1 mouse_c = False # -------ゲーム進行状態1:ゲーム開始待ち---------- elif state==1: if mouse_c == True: #マウスクリックされたとき for y in range(10): for x in range(8): dango[y][x] = 0 #マス目の配列初期化 mouse_c = False score = 0 next_dango = 0 cursor_x = 0 cursor_y = 0 set_dango() #最上位にだんごセット state = 2 # -------ゲーム進行状態2:だんご落下中---------- elif state==2: if drop_dango() == False: #だんごを落下させる state = 3 #落下が終わったら、state=3へ disp_dango() # だんご表示 # -------ゲーム進行状態3:だんご判定---------- elif state==3: check_dango() #だんごが揃ったか判定 state = 4 disp_dango() # だんご表示 # -------ゲーム進行状態4:スコア判定(だんご消す)---------- elif state==4: sc = delete_dango() score = score + sc*10 if score > hisc: hisc = score if sc > 0: state=2 else: if over_dango() == False: #だんごが最上位になかったら next_dango = random.randint(1,4) #次のだんごを決める state = 5 else: state = 6 timer = 0 disp_dango() # だんご表示 |
前回作成しただんごを消す処理(delete_dango())を使います。またスコア計算処理も前回同様です。
56行目のif文でスコアが0より大きい時、すなわちだんごが消された場合は、state=2(だんご落下処理)へ移行します。
スコアが0の時、すなわちだんごが消されていない場合は、ゲームオーバー判定します。59行目でだんごが最上位になかったら、マス上にクリックした時に配置する次のだんごを変数に設定します。(※next_dangoは、メイン関数のはじめとstate=1の処理内で初期化処理を入れています)
その後、state=5(だんご配置待ち処理)へ移行します。
だんごが最上位にある場合は、state=6(ゲームオーバー処理)へ移行します。timer変数は、次のゲームオーバー処理で使う変数です。
state=5 だんご配置待ち
続いて、マス上にだんごを配置する処理です。こちらは前回作成した処理を基本そのまま使います。
以下の様に実装しましょう。
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 |
#ゲームメイン処理 def main(): cursor_x=0 cursor_y=0 global score,hisc #ゲーム進行状態(0:初回画面/1:ゲーム開始待ち/2:だんご落下中/3:だんご判定/4:スコア判定(だんご消す)/5:カーソル入力待ち/6:ゲームオーバー) state = 0 # 初期化(0:初回画面) next_dango = 0 #次にセットするだんご while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() mouse_x,mouse_y = pygame.mouse.get_pos() #マウス位置 mouse_click = pygame.mouse.get_pressed() #マウスクリック mouse_c = mouse_click[0] #マウス左クリック状態を設定 # -------ゲーム進行状態0:初回画面---------- if state==0: screen.blit(bg,[0,0]) #背景画像描画 screen.blit(title,[50,240]) #タイトル描画 screen.blit(click_start,[50,560]) #クリックスタート描画 state = 1 mouse_c = False # -------ゲーム進行状態1:ゲーム開始待ち---------- elif state==1: if mouse_c == True: #マウスクリックされたとき for y in range(10): for x in range(8): dango[y][x] = 0 #マス目の配列初期化 mouse_c = False score = 0 next_dango = 0 cursor_x = 0 cursor_y = 0 set_dango() #最上位にだんごセット state = 2 # -------ゲーム進行状態2:だんご落下中---------- elif state==2: if drop_dango() == False: #だんごを落下させる state = 3 #落下が終わったら、state=3へ disp_dango() # だんご表示 # -------ゲーム進行状態3:だんご判定---------- elif state==3: check_dango() #だんごが揃ったか判定 state = 4 disp_dango() # だんご表示 # -------ゲーム進行状態4:スコア判定(だんご消す)---------- elif state==4: sc = delete_dango() score = score + sc*10 if score > hisc: hisc = score if sc > 0: state=2 else: if over_dango() == False: #だんごが最上位になかったら next_dango = random.randint(1,4) #次のだんごを決める state = 5 else: state = 6 timer = 0 disp_dango() # だんご表示 # -------ゲーム進行状態5:カーソル入力待ち---------- elif state==5: # マウスが盤上内であれば if 20 <= mouse_x and mouse_x < 20+72*8 and 20 <= mouse_y and mouse_y < 20+72*10: cursor_x = int((mouse_x-20)/72) cursor_y = int((mouse_y-20)/72) if mouse_c == True and dango[cursor_y][cursor_x] == 0: mouse_c = False set_dango() dango[cursor_y][cursor_x] = next_dango next_dango = 0 state = 2 #だんご落下中へ(state=2) disp_dango() # だんご表示 screen.blit(cursor,[cursor_x*72+20,cursor_y*72+20]) #カーソル表示 |
マウスが盤上内にあるかどうかは、前回同様の処理です。(68行目〜73行目)
マウスが盤上内にあり、クリックされた場合、最上位にだんごをランダムに配置(set_dango())し、クリックしたマス上に次のだんご(next_dango)を設定します。そして、state=2(だんご落下処理)へ移行します。
state=6 ゲームオーバー処理など
続いて、state=6 ゲームオーバー処理を実装しましょう。
まずは、ゲームオーバー用の画像をロードします。
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 |
if __name__ == '__main__': #初期化、画像ロード処理など pygame.init() pygame.display.set_caption("だんごパズル(pygame ver)") screen = pygame.display.set_mode((912,768)) font = pygame.font.Font(None,60) clock = pygame.time.Clock() bg = pygame.image.load("dango_back.png") #背景画像をロード cursor = pygame.image.load("cursor.png") #カーソル画像をロード img_dango = [ #だんご画像をロード None, pygame.image.load("dango1.png"), pygame.image.load("dango2.png"), pygame.image.load("dango3.png"), pygame.image.load("dango4.png"), pygame.image.load("dango_kushi.png") ] title = pygame.image.load("game_title.png") click_start = pygame.image.load("click_start.png") game_over = pygame.image.load("game_over.png") #ゲームメイン処理 main() |
続いてメイン処理内にstate=6(ゲームオーバー処理)を実装します。
以下のように実装しましょう。
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 |
#ゲームメイン処理 def main(): cursor_x=0 cursor_y=0 global score,hisc #ゲーム進行状態(0:初回画面/1:ゲーム開始待ち/2:だんご落下中/3:だんご判定/4:スコア判定(だんご消す)/5:カーソル入力待ち/6:ゲームオーバー) state = 0 # 初期化(0:初回画面) next_dango = 0 #次にセットするだんご while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() mouse_x,mouse_y = pygame.mouse.get_pos() #マウス位置 mouse_click = pygame.mouse.get_pressed() #マウスクリック mouse_c = mouse_click[0] #マウス左クリック状態を設定 # -------ゲーム進行状態0:初回画面---------- if state==0: screen.blit(bg,[0,0]) #背景画像描画 screen.blit(title,[50,240]) #タイトル描画 screen.blit(click_start,[50,560]) #クリックスタート描画 state = 1 mouse_c = False # -------ゲーム進行状態1:ゲーム開始待ち---------- elif state==1: if mouse_c == True: #マウスクリックされたとき for y in range(10): for x in range(8): dango[y][x] = 0 #マス目の配列初期化 mouse_c = False score = 0 next_dango = 0 cursor_x = 0 cursor_y = 0 set_dango() #最上位にだんごセット state = 2 # -------ゲーム進行状態2:だんご落下中---------- elif state==2: if drop_dango() == False: #だんごを落下させる state = 3 #落下が終わったら、state=3へ disp_dango() # だんご表示 # -------ゲーム進行状態3:だんご判定---------- elif state==3: check_dango() #だんごが揃ったか判定 state = 4 disp_dango() # だんご表示 # -------ゲーム進行状態4:スコア判定(だんご消す)---------- elif state==4: sc = delete_dango() score = score + sc*10 if score > hisc: hisc = score if sc > 0: state=2 else: if over_dango() == False: #だんごが最上位になかったら next_dango = random.randint(1,4) #次のだんごを決める state = 5 else: state = 6 timer = 0 disp_dango() # だんご表示 # -------ゲーム進行状態5:カーソル入力待ち---------- elif state==5: # マウスが盤上内であれば if 20 <= mouse_x and mouse_x < 20+72*8 and 20 <= mouse_y and mouse_y < 20+72*10: cursor_x = int((mouse_x-20)/72) cursor_y = int((mouse_y-20)/72) if mouse_c == True and dango[cursor_y][cursor_x] == 0: mouse_c = False set_dango() dango[cursor_y][cursor_x] = next_dango next_dango = 0 state = 2 #だんご落下中へ(state=2) disp_dango() # だんご表示 screen.blit(cursor,[cursor_x*72+20,cursor_y*72+20]) #カーソル表示 # -------ゲーム進行状態6:ゲームオーバー---------- elif state==6: timer = timer + 1 if timer == 1: screen.blit(game_over,[50,348]) #ゲームオーバー画面 if timer == 50: #タイマーが50になったら、初回画面に戻す state = 0 disp_score() # スコア表示 #次のだんご表示 if next_dango > 0: screen.blit(img_dango[next_dango],[752-20,128-20]) pygame.display.update() clock.tick(10) |
ゲームオーバー処理では、timer変数を1ずつ加算していき、50になったら、state=0(初回画面)に移行します。
88行目からは、stateのif文の判定外の処理で、stateの値によらず共通で処理される処理です。
スコア表示、次のだんご表示を行っています。
ここまでで、一旦動きを見てみましょう。
タイトル画面からゲーム開始、ゲームオーバーなど一通りゲームとして動作すればOKです。
BGM,効果音処理を入れる
最後にゲームのBGMと効果音処理を入れてみましょう。
ゲームのBGMは、dango_bgm.mp3、だんごが消えた時の効果音としてpi.mp3を使います。
pygameでサウンドを出力させるために、まずは、音楽ファイルをロードします。以下のように実装しましょう。
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 |
if __name__ == '__main__': #初期化、画像ロード処理など pygame.init() pygame.display.set_caption("だんごパズル(pygame ver)") screen = pygame.display.set_mode((912,768)) font = pygame.font.Font(None,60) clock = pygame.time.Clock() bg = pygame.image.load("dango_back.png") #背景画像をロード cursor = pygame.image.load("cursor.png") #カーソル画像をロード img_dango = [ #だんご画像をロード None, pygame.image.load("dango1.png"), pygame.image.load("dango2.png"), pygame.image.load("dango3.png"), pygame.image.load("dango4.png"), pygame.image.load("dango_kushi.png") ] title = pygame.image.load("game_title.png") click_start = pygame.image.load("click_start.png") game_over = pygame.image.load("game_over.png") try: pygame.mixer.music.load("dango_bgm.mp3") #BGMをロード se = pygame.mixer.Sound("pi.mp3") except: print("ファイルが見当たらないか、オーディオ機器が接続されていません") #ゲームメイン処理 main() |
try-except処理は、プログラム実行中に例外エラーが発生した場合、eccept内に書いた処理が実行されます。
続いて、ゲームBGMの再生処理を記載します。
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 |
if __name__ == '__main__': #初期化、画像ロード処理など pygame.init() pygame.display.set_caption("だんごパズル(pygame ver)") screen = pygame.display.set_mode((912,768)) font = pygame.font.Font(None,60) clock = pygame.time.Clock() bg = pygame.image.load("dango_back.png") #背景画像をロード cursor = pygame.image.load("cursor.png") #カーソル画像をロード img_dango = [ #だんご画像をロード None, pygame.image.load("dango1.png"), pygame.image.load("dango2.png"), pygame.image.load("dango3.png"), pygame.image.load("dango4.png"), pygame.image.load("dango_kushi.png") ] title = pygame.image.load("game_title.png") click_start = pygame.image.load("click_start.png") game_over = pygame.image.load("game_over.png") try: pygame.mixer.music.load("dango_bgm.mp3") #BGMをロード se = pygame.mixer.Sound("pi.mp3") except: print("ファイルが見当たらないか、オーディオ機器が接続されていません") pygame.mixer.music.play(-1) #ゲームメイン処理 main() |
pygame.mixer.music.play(-1)でBGMを再生します。引数の-1は、ループ再生です。0が1回再生、その他回数を指定するとその回数分再生されます。
次に、だんごを消した時の効果音を再生させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# -------ゲーム進行状態4:スコア判定(だんご消す)---------- elif state==4: sc = delete_dango() score = score + sc*10 if score > hisc: hisc = score if sc > 0: state=2 #効果音 se.play() else: if over_dango() == False: #だんごが最上位になかったら next_dango = random.randint(1,4) #次のだんごを決める state = 5 else: state = 6 timer = 0 disp_dango() # だんご表示 |
メイン処理内のstate=4の処理内で、だんごが消された場合の処理に再生処理を入れます。
seという変数にロードした音声ファイルが設定されていますので、se.play()と記載します。
これで、だんごが消えた時に、効果音が鳴るはずです。
さて、ここまでできたら、再度プログラムを実行してみましょう。
BGMやだんごが消えた時の効果音が鳴ればOKです。
ついに、パズルゲームとして完成しました。お疲れさまでした!
最後に
全5回に渡って解説してきたPythonによるパズルゲーム、今回の解説で完成です。
少しでも参考にしていただけたら幸いです。
それでは!
スポンサーリンク