Pythonゲーム作りの過程 その3

本日は、臨場感を出す音を出す機能を付けます。音の再生は、BGMとして問題を出題している間に再生する音楽と、問題をプレーヤーが正解あるいは不正解のときになる効果音の2種類です。

音の再生は、マルチスレッドにします。なぜなら、マルチスレッドにしないと音楽の再生が終わらないと問題が表示されたり、回答できなくなるからです。一般にマルチスレッドのプログラムは難しいそうですが、音の再生をマルチスレッドにするのは、pygameというモジュールを使うと簡単にできます。

pygameの使い方は下記のとおりです。

import pygame

pygame.mixer.init(frequency = 44100) #再生の準備。
bgm_sound =
pygame.mixer.Sound("./sound/battle.wav") #再生する音のファイルを指定してオブジェクトを作る。

この後に、再生を開始するところで次のように記述します。これで音声の再生が開始するとこの処理が終わらないうちに次の行の処理が開始されます。これがマルチスレッドの考え方です。

bgm_sound.play()

なお、ループを抜けるときなどは再生が開始されると同時に再生が終わるため、結果的に音が再生されないことがあります。そこで、

time.sleep(2)

のように音がある時間を確保します。この場合は2秒まつ、すなわち2秒の間音が再生されます。

この考え方でBGMの再生は問題の出題の時に、また正解の判定のあとに正解。不正解の効果音を入れると次のようなコードになります。 (ディクショナリについては次の回で説明します)

import subprocess
import time
import csv
from playsound import playsound #メモ windows11では古めのバージョンをインストールすること。pip install playsound==1.2.2
import pygame
import random
import sys

i=0
mhp=40 #主人公のHP
ehp=50 #敵モンスターのHP

pygame.mixer.init(frequency = 44100)
bgm_sound = pygame.mixer.Sound("./sound/battle.wav")
bgm_sound2 = pygame.mixer.Sound("./sound/quiz1.wav")
bgm_sound3 = pygame.mixer.Sound("./sound/quiz2.wav")
bgm_sound4 = pygame.mixer.Sound("./sound/madamada.mp3")
bgm_sound5 = pygame.mixer.Sound("./sound/kakugo.mp3")
bgm_sound.play()

#問題のデータベース。ここから問題がピックアップされて出題される。
questions =[
    {'question':"「洋琴」が表す楽器はどれ?",'kouho':['ピアノ','ギター','チェロ','ハープ'],'answer':"ピアノ",'category':'漢字'},
    {'question':"ラッコを漢字で書くとどれ?",'kouho':['海鼠','海獺','海狸','海犬'],'answer':"海獺",'category':'漢字'},
    {'question':"ガーナの首都は?",'kouho':['アクラ','アピア','アテネ','アンカラ'],'answer':"海獺",'category':'地理'},
]

this_question = questions[random.randint(0,2)] #questions[0] とかquestions[1]とか
print(this_question)
#sys.exit( )

while i<3:
    ran = random.randint(1,3)
    if ran ==2 :
        bgm_sound5.play()

    if mhp<=0:
        bgm_sound4.play() 
        print("主人公は敗北した…")
        time.sleep(2)
        break
    elif ehp<=0:
        print("モンスターは倒れた!")
        break
    else:
        print("漢字出題モンスターが現れた!")
        print(this_question['question'])
        print(this_question['kouho'])
        
        for question_kouho in this_question['kouho']:
            print('候補: '+question_kouho)

        """
        print("「洋琴」が表す楽器はどれ?")
        print("A:ピアノ")
        print("B:ギター")
        print("C:チェロ")
        print("D:ハープ")
        """
        
    ans=input()
    if ans=="A":
        bgm_sound2.play()
        print("モンスターは30のダメージを受けた!")
        #bgm_sound.stop()
        ehp=ehp-30
        time.sleep(1)
        break
    else:
        bgm_sound3.play()
        print("主人公は30のダメージを受けた!")
        mhp=mhp-30
        time.sleep(1)
    i=i+1
    time.sleep(2)
    subprocess.run('CLS',shell=True)

このようにすると音楽が再生されるようになりました。これでだいぶ臨場感が出ます。

なお、音は利用が可能なフリーで配布しているサイトからもらいます。今回は、以下の2つのサイトからもらいました。

https://maou.audio/category/se/se-voice/page/2/

https://www.tam-music.com/se000_category/game