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

今回の目標

選択肢のシャッフル
回答の正誤判定

今回の結果

選択肢のシャッフル
→達成
回答の正誤判定
→達成
今回は無事に達成できました

選択肢のシャッフル

変数shuffle_kouhoに問題の選択肢のデータを格納し、それをrandomモジュールのshuffle()関数でランダムに入れ替えました。
以下がそのコードです。

shuffle_kouho=q['kouho']
    random.shuffle(shuffle_kouho)

回答の正誤判定

if ans==chr(65+ans_list[1]):

前回に使ったchr()関数を使用し、get_answer関数の戻り値を格納したlist型変数の第二要素を引数の一部として使いました。
以降の目標にはなりますが、関数で正誤判定ができるようにしたいです。
以下、今回までのコードです。

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


def get_answer(q):#関数定義
    shuffle_kouho=q['kouho']
    random.shuffle(shuffle_kouho)
    answer_str=shuffle_kouho.index(q['answer'])#1
    for i in range(0,len(shuffle_kouho)):
        print(chr(65+i)+': '+shuffle_kouho[i])#ASCIIコードで設定しました
    return [shuffle_kouho,answer_str]



def battle():#戦闘時の関数定義
    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:
            """
            s1="漢字出題モンスターが現れた!"
            s2=s1.replace(s1,"")
            print(s1)
            time.sleep(2)
            print(s2)
            """
            #没になった。メモリ内容が変わるだけで、画面に出力したのは変わらない。
            
            
            #print(this_question['category'],end='')
            #print("出題モンスターが現れた!")
            #print("漢字出題モンスターが現れた!")
            print(this_question['category']+"出題モンスターが現れた")#モンスターの名前の表示
            time.sleep(2)
            subprocess.run('CLS',shell=True)#2秒後に消す
            print(this_question['question'])
            #print(this_question['kouho'])
            ans_list=get_answer(this_question)
            """
            for question_kouho in this_question['kouho']:
                print('候補: '+question_kouho)
            """
            
            
        # ans=input()
        # if ans=="A":
        #     bgm_sound2.play()
        #     print("モンスターは30のダメージを受けた!")
        #     #bgm_sound.stop()
        #     ehp=ehp-30
        #     time.sleep(1)
        #     break
        ans=input()
        if ans==chr(65+ans_list[1]):
            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)




battle()#確認用に呼び出し

余談:関数の重要性

1年前の自分は自分ではない

ほとんどのコードは自分で作ったものでも忘れます。
コードを振り返る際に、過去の自分の当時考えていたことはもちろん忘れています。
なので、関数は頭の中で整理がしやすくなるので、定義はなるべくすることをお勧めします。
私自身、ソースコードが長くなるにつれて、頭の中でどの処理をまとめているのかを整理するのが大変になります。
関数を定義することで、一連の処理をまとめることでコード内容を頭の中で整理できるようになります。