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

今回の目標

素材の位置を外部に保存して相対パスを指定する
オブジェクト指向について少しずつでも勉強する

今回の結果

素材の位置を外部に保存して相対パスを指定する
→達成
オブジェクト指向について少しずつでも勉強する
→未達成

次回の目標

手を動かす(class:monsterのデータ属性について考える)

素材の位置を外部に保存して相対パスを指定する

 今回は作った日ごとにフォルダを作る関係上、まったくの無駄な工程が音楽を保存するフォルダを毎回複製しているのが無駄に感じたので手を付けることにしました。
 それを相対パスで指定した例が、以下になります。

bgm_sound = pygame.mixer.Sound("../素材/sound/battle.wav")
オブジェクト指向について少しずつでも勉強する

 今回はできていませんでした。
 理由は単純。手を動かしていないからです。
 実際にコード書くなり試験的にファイルでいろいろ書いておかないと、今回のように翌日には忘れて身になっていません。

 以下が、現状のコードです。

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

class monster:#モンスターの設計。
    def __init__(self, level):
        self.level=level
        
# 問題の入った辞書を引数に、シャッフルした選択肢と解答のリスト
def get_answer(q):#関数定義
    shuffle_kouho=q['kouho']
    #print(shuffle_kouho) 230501 こちらのprint文は取り除きました。
    random.shuffle(shuffle_kouho)
    answer_str=shuffle_kouho.index(q['answer']) #インデックスを返す。
    return [shuffle_kouho,answer_str]

# 回答者が答えた選択肢の文字列a1(A,B,C,Dとか)と正解の選択肢のインデックス(0,1,2,3とか)を引数に、一致しているときはTrue,一致しないときはFalseを返す
def sf(a1,a2):#success,failuer
    if a1==chr(65+a2):
        return 1
    else:
        return 0

# CSVのファイル名を指定して、問題が格納されたリストを返す
def csv2list(file_path):
    questions =[]
    with open(file_path, 'r',encoding="UTF-8") as f:
        reader = csv.reader(f)
        for line in reader:#ここでCSV1行ごとの処理が行われる
            #print(line)
            kouho_array = line[1].split('/') #鯏/鯵/鱒/鱚
            dict = {'question':line[0],'kouho':kouho_array,'answer':line[2],'category':line[3],'level':line[4]}
            questions.append(dict)
        
        questions.pop(0)
    return questions

#引 数:出題する問題と全問題のディクショナリ
#戻り値:出題する問題のカテゴリにあった問題のみ
def categorize_questions(category,allquestions):
    categorized_questions=[]
    for tuple in allquestions:
        if category==tuple['category']:
            categorized_questions.append(tuple)
    return categorized_questions

#このbattleは1匹のモンスターとの戦闘に関わる関数
def battle():#戦闘時の関数定義  def battle(monster):
    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':'地理'},
    ]"""
    
    questions = csv2list('Dict3.csv') #questionsが1匹のモンスターに相当する
    while len(questions)>0:
            # if i==0:
            #     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:
            this_question = questions.pop(random.randint(0,len(questions)-1)) #questions[0] とかquestions[1]とか
            # this_question = questions[random.randint(0,2)] #questions[0] とかquestions[1]とか
            #print(this_question)
            #sys.exit( )
            """
            s1="漢字出題モンスターが現れた!"
            s2=s1.replace(s1,"")
            print(s1)
            time.sleep(2)
            print(s2)
            """
            #没になった。メモリ内容が変わるだけで、画面に出力したのは変わらない。
            
            
            #print(this_question['category'],end='')
            #print("出題モンスターが現れた!")
            #print("漢字出題モンスターが現れた!")
            if i==0:#初回のみモンスター名の表示するための変数
                ran = random.randint(1,3)
                if ran ==2 :
                    bgm_sound5.play()
                print(this_question['category']+"出題モンスターが現れた")#モンスターの名前の表示
                questions=categorize_questions(this_question['category'],questions)#questionsをカテゴリ統一したものに上書きする
                time.sleep(2)
                subprocess.run('CLS',shell=True)#2秒後に消す
            # if i>0:
            #     after_question= questions[t] 
            print("debug: ", end="")
            print(this_question['question'])#ここで表示された後にシャッフルされている!!
            #print(this_question['kouho'])
            ans_list=get_answer(this_question)
            #print(ans_list)
            #ans_list は次のような形 [['紋白蝶', '紋花蝦蛄', '秋刀魚', '背赤後家蜘蛛'], 1]
            print(ans_list[0])
            for j in range(0,len(ans_list[0])):
                print(chr(65+j)+': '+ans_list[0][j])#ASCIIコードで設定しました
            """
            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()
            ans=input()#答えの入力を行わせる
            if sf(ans,ans_list[1]):#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)
        if len(questions)<=0:
            print("問題数が不足しています。戦闘を中断します。")




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

"""
while my_hp :
    mondai = monster_attack(monster) #モンスターが出題する
    my_hp,monster_hp =player_attack(mondai,kaitou) #主人公が答える
    if monster_hp <= 0 :
        monster = monster_change()
  
"""

余談:特になし。

 自分用:授業だけでは資格取れません。勉強しましょう。

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

今回の目標

自分の書いたソースコードを見る

今回の結果

自分の書いたソースコードを見る
→達成

次回の目標

ゲームの難易度を問題の選択肢の数で調整

自分の書いたソースコードを見る

 今回は、学校忙しくて手を付けていなかったまま一か月が経過しました。一か月間見なかったコードですが、コメントがなければ、何をしているのかも解らない文字列の塊になっていたかと思います。
 今回は動作確認上で確認できていなかった、問題数が枯渇したときに戦闘中断すると表示する箇所を、問題の数が少ないカテゴリを利用して確認取れました。それだけです。

if len(questions)<=0:
            print("問題数が不足しています。戦闘を中断します。")

以下は現状のソースコードです。

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']
    #print(shuffle_kouho) 230501 こちらのprint文は取り除きました。
    random.shuffle(shuffle_kouho)
    answer_str=shuffle_kouho.index(q['answer']) #インデックスを返す。
    return [shuffle_kouho,answer_str]

# 回答者が答えた選択肢の文字列a1(A,B,C,Dとか)と正解の選択肢のインデックス(0,1,2,3とか)を引数に、一致しているときはTrue,一致しないときはFalseを返す
def sf(a1,a2):#success,failuer
    if a1==chr(65+a2):
        return 1
    else:
        return 0

# CSVのファイル名を指定して、問題が格納されたリストを返す
def csv2list(file_path):
    questions =[]
    with open(file_path, 'r',encoding="UTF-8") as f:
        reader = csv.reader(f)
        for line in reader:#ここでCSV1行ごとの処理が行われる
            #print(line)
            kouho_array = line[1].split('/') #鯏/鯵/鱒/鱚
            dict = {'question':line[0],'kouho':kouho_array,'answer':line[2],'category':line[3]}
            questions.append(dict)
        
        questions.pop(0)
    return questions

#引 数:出題する問題と全問題のディクショナリ
#戻り値:出題する問題のカテゴリにあった問題のみ
def categorize_questions(category,allquestions):
    categorized_questions=[]
    for tuple in allquestions:
        if category==tuple['category']:
            categorized_questions.append(tuple)
    return categorized_questions

#このbattleは1匹のモンスターとの戦闘に関わる関数
def battle():#戦闘時の関数定義  def battle(monster):
    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':'地理'},
    ]"""
    
    questions = csv2list('Dict.csv') #questionsが1匹のモンスターに相当する
    while len(questions)>0:
            # if i==0:
            #     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:
            this_question = questions.pop(random.randint(0,len(questions)-1)) #questions[0] とかquestions[1]とか
            # this_question = questions[random.randint(0,2)] #questions[0] とかquestions[1]とか
            #print(this_question)
            #sys.exit( )
            """
            s1="漢字出題モンスターが現れた!"
            s2=s1.replace(s1,"")
            print(s1)
            time.sleep(2)
            print(s2)
            """
            #没になった。メモリ内容が変わるだけで、画面に出力したのは変わらない。
            
            
            #print(this_question['category'],end='')
            #print("出題モンスターが現れた!")
            #print("漢字出題モンスターが現れた!")
            if i==0:#初回のみモンスター名の表示するための変数
                ran = random.randint(1,3)
                if ran ==2 :
                    bgm_sound5.play()
                print(this_question['category']+"出題モンスターが現れた")#モンスターの名前の表示
                questions=categorize_questions(this_question['category'],questions)#questionsをカテゴリ統一したものに上書きする
                time.sleep(2)
                subprocess.run('CLS',shell=True)#2秒後に消す
            # if i>0:
            #     after_question= questions[t] 
            print("debug: ", end="")
            print(this_question['question'])#ここで表示された後にシャッフルされている!!
            #print(this_question['kouho'])
            ans_list=get_answer(this_question)
            #print(ans_list)
            #ans_list は次のような形 [['紋白蝶', '紋花蝦蛄', '秋刀魚', '背赤後家蜘蛛'], 1]
            print(ans_list[0])
            for j in range(0,len(ans_list[0])):
                print(chr(65+j)+': '+ans_list[0][j])#ASCIIコードで設定しました
            """
            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()
            ans=input()#答えの入力を行わせる
            if sf(ans,ans_list[1]):#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)
        if len(questions)<=0:
            print("問題数が不足しています。戦闘を中断します。")




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

"""
while my_hp :
    mondai = monster_attack(monster) #モンスターが出題する
    my_hp,monster_hp =player_attack(mondai,kaitou) #主人公が答える
    if monster_hp <= 0 :
        monster = monster_change()
  
"""

余談:今回は特になし。

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

今回の目標

ゲームの難易度調整

今回の結果

ゲームの難易度調整
→未達成(案だけ考えた)

次回の目標

ゲームの難易度を問題の選択肢の数で調整

ゲームの難易度調整

 何故か考えるだけで終わりました。
 問題の選択肢を減らすことで、難易度調整をすることにしました。
 そのためには、正解の選択肢を残したままほかの選択肢をランダムに削る必要があります。
 まずは動くコードをかけるようにして、それからスパゲッティコードになったら調整します。
 今回は特に変更ありません。以下は今回のコードです。

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']
    #print(shuffle_kouho) 230501 こちらのprint文は取り除きました。
    random.shuffle(shuffle_kouho)
    answer_str=shuffle_kouho.index(q['answer']) #インデックスを返す。
    return [shuffle_kouho,answer_str]

# 回答者が答えた選択肢の文字列a1(A,B,C,Dとか)と正解の選択肢のインデックス(0,1,2,3とか)を引数に、一致しているときはTrue,一致しないときはFalseを返す
def sf(a1,a2):#success,failuer
    if a1==chr(65+a2):
        return 1
    else:
        return 0

# CSVのファイル名を指定して、問題が格納されたリストを返す
def csv2list(file_path):
    questions =[]
    with open(file_path, 'r',encoding="UTF-8") as f:
        reader = csv.reader(f)
        for line in reader:#ここでCSV1行ごとの処理が行われる
            #print(line)
            kouho_array = line[1].split('/') #鯏/鯵/鱒/鱚
            dict = {'question':line[0],'kouho':kouho_array,'answer':line[2],'category':line[3]}
            questions.append(dict)
        
        questions.pop(0)
    return questions

#引 数:出題する問題と全問題のディクショナリ
#戻り値:出題する問題のカテゴリにあった問題のみ
def categorize_questions(category,allquestions):
    categorized_questions=[]
    for tuple in allquestions:
        if category==tuple['category']:
            categorized_questions.append(tuple)
    return categorized_questions

#このbattleは1匹のモンスターとの戦闘に関わる関数
def battle():#戦闘時の関数定義  def battle(monster):
    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':'地理'},
    ]"""
    
    questions = csv2list('Dict.csv') #questionsが1匹のモンスターに相当する
    while len(questions)>0:
            # if i==0:
            #     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:
            this_question = questions.pop(random.randint(0,len(questions)-1)) #questions[0] とかquestions[1]とか
            # this_question = questions[random.randint(0,2)] #questions[0] とかquestions[1]とか
            #print(this_question)
            #sys.exit( )
            """
            s1="漢字出題モンスターが現れた!"
            s2=s1.replace(s1,"")
            print(s1)
            time.sleep(2)
            print(s2)
            """
            #没になった。メモリ内容が変わるだけで、画面に出力したのは変わらない。
            
            
            #print(this_question['category'],end='')
            #print("出題モンスターが現れた!")
            #print("漢字出題モンスターが現れた!")
            if i==0:#初回のみモンスター名の表示するための変数
                ran = random.randint(1,3)
                if ran ==2 :
                    bgm_sound5.play()
                print(this_question['category']+"出題モンスターが現れた")#モンスターの名前の表示
                questions=categorize_questions(this_question['category'],questions)#questionsをカテゴリ統一したものに上書きする
                time.sleep(2)
                subprocess.run('CLS',shell=True)#2秒後に消す
            # if i>0:
            #     after_question= questions[t] 
            print("debug: ", end="")
            print(this_question['question'])#ここで表示された後にシャッフルされている!!
            #print(this_question['kouho'])
            ans_list=get_answer(this_question)
            #print(ans_list)
            #ans_list は次のような形 [['紋白蝶', '紋花蝦蛄', '秋刀魚', '背赤後家蜘蛛'], 1]
            print(ans_list[0])
            for j in range(0,len(ans_list[0])):
                print(chr(65+j)+': '+ans_list[0][j])#ASCIIコードで設定しました
            """
            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()
            ans=input()#答えの入力を行わせる
            if sf(ans,ans_list[1]):#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)
        if len(questions)<=0:
            print("問題数が不足しています。戦闘を中断します。")




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

"""
while my_hp :
    mondai = monster_attack(monster) #モンスターが出題する
    my_hp,monster_hp =player_attack(mondai,kaitou) #主人公が答える
    if monster_hp <= 0 :
        monster = monster_change()
  
"""

余談:失敗は学びを得るためのものであり、引きずるものではない。

 個人的な話にはなりますが、バイト先で失敗するときに納得のいったのが、上に書いてある言葉です。
 そのままの意味ですが、この考え方がないと、成長しません。
 コードを書く際は特にそうです。
 スパゲッティコードにならないように頑張るのはいいのですが、絶対に失敗しない人間はいません。
 エラーコードの山を足場にするのは大切なことです。自分の失敗は、自分の経験になり、成長の糧になる。そう思っています。
 教科書を読んで、先生の作ったコードを写すだけでは、自分でコードをかけるようにはなりません(実証済み)

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

今回の目標

問題の難易度別微調整

今回の結果

問題の難易度別微調整
→未達成(コードには残せなかった)

次回目標

難易度を、イージー、ノーマル、ハードで区別する

問題の難易度別微調整

 諸事情により考えるだけで終わりました。
 考え付いたのだと、問題の選択肢を減らすかモンスターのHPを調整することくらいでした。
 後は、問題の難易度を分別するのが考え付いたくらいでした。
 コード内部でどのような分け方をするのかは、今のところ思いつきませんでした。
 以下、今回のコードです。なんか「戦闘」が「先頭」になっていたのでそこは3秒で直しました。

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']
    #print(shuffle_kouho) 230501 こちらのprint文は取り除きました。
    random.shuffle(shuffle_kouho)
    answer_str=shuffle_kouho.index(q['answer']) #インデックスを返す。
    return [shuffle_kouho,answer_str]

# 回答者が答えた選択肢の文字列a1(A,B,C,Dとか)と正解の選択肢のインデックス(0,1,2,3とか)を引数に、一致しているときはTrue,一致しないときはFalseを返す
def sf(a1,a2):#success,failuer
    if a1==chr(65+a2):
        return 1
    else:
        return 0

# CSVのファイル名を指定して、問題が格納されたリストを返す
def csv2list(file_path):
    questions =[]
    with open(file_path, 'r',encoding="UTF-8") as f:
        reader = csv.reader(f)
        for line in reader:#ここでCSV1行ごとの処理が行われる
            #print(line)
            kouho_array = line[1].split('/') #鯏/鯵/鱒/鱚
            dict = {'question':line[0],'kouho':kouho_array,'answer':line[2],'category':line[3]}
            questions.append(dict)
        
        questions.pop(0)
    return questions

#引 数:出題する問題と全問題のディクショナリ
#戻り値:出題する問題のカテゴリにあった問題のみ
def categorize_questions(category,allquestions):
    categorized_questions=[]
    for tuple in allquestions:
        if category==tuple['category']:
            categorized_questions.append(tuple)
    return categorized_questions

#このbattleは1匹のモンスターとの戦闘に関わる関数
def battle():#戦闘時の関数定義  def battle(monster):
    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':'地理'},
    ]"""
    
    questions = csv2list('Dict.csv') #questionsが1匹のモンスターに相当する
    while len(questions)>0:
            # if i==0:
            #     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:
            this_question = questions.pop(random.randint(0,len(questions)-1)) #questions[0] とかquestions[1]とか
            # this_question = questions[random.randint(0,2)] #questions[0] とかquestions[1]とか
            #print(this_question)
            #sys.exit( )
            """
            s1="漢字出題モンスターが現れた!"
            s2=s1.replace(s1,"")
            print(s1)
            time.sleep(2)
            print(s2)
            """
            #没になった。メモリ内容が変わるだけで、画面に出力したのは変わらない。
            
            
            #print(this_question['category'],end='')
            #print("出題モンスターが現れた!")
            #print("漢字出題モンスターが現れた!")
            if i==0:#初回のみモンスター名の表示するための変数
                ran = random.randint(1,3)
                if ran ==2 :
                    bgm_sound5.play()
                print(this_question['category']+"出題モンスターが現れた")#モンスターの名前の表示
                questions=categorize_questions(this_question['category'],questions)#questionsをカテゴリ統一したものに上書きする
                time.sleep(2)
                subprocess.run('CLS',shell=True)#2秒後に消す
            # if i>0:
            #     after_question= questions[t] 
            print("debug: ", end="")
            print(this_question['question'])#ここで表示された後にシャッフルされている!!
            #print(this_question['kouho'])
            ans_list=get_answer(this_question)
            #print(ans_list)
            #ans_list は次のような形 [['紋白蝶', '紋花蝦蛄', '秋刀魚', '背赤後家蜘蛛'], 1]
            print(ans_list[0])
            for j in range(0,len(ans_list[0])):
                print(chr(65+j)+': '+ans_list[0][j])#ASCIIコードで設定しました
            """
            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()
            ans=input()#答えの入力を行わせる
            if sf(ans,ans_list[1]):#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)
        if len(questions)<=0:
            print("問題数が不足しています。戦闘を中断します。")




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

"""
while my_hp :
    mondai = monster_attack(monster) #モンスターが出題する
    my_hp,monster_hp =player_attack(mondai,kaitou) #主人公が答える
    if monster_hp <= 0 :
        monster = monster_change()
  
"""

余談:特になし

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

今回の目標

問題カテゴリの固定

今回の結果

問題カテゴリの固定
→達成

次回目標

ゲームの難易度別の微調整

問題カテゴリの固定

 今回は、問題のカテゴリに一致したディクショナリになるように、for文内部の条件分岐で絞り込む方針で考えました。
 今回新しく加えた関数が以下の通りです。

#引 数:出題する問題と全問題のディクショナリ
#戻り値:出題する問題のカテゴリにあった問題のみ
def categorize_questions(category,allquestions):
    categorized_questions=[]
    for tuple in allquestions:
        if category==tuple['category']:
            categorized_questions.append(tuple)
    return categorized_questions

 そして、実際に使ったのが以下です。

questions=categorize_questions(this_question['category'],questions)#questionsをカテゴリ統一したものに上書きする

 このままでは、builtin_function_or_method’ object is not subscriptable とエラーが出ます。
 これは、前回に

this_question = questions.pop[random.randint(0,len(questions)-1)] #questions[0] とかquestions[1]とか  

と、ミスを残したままであったからです。
 popメソッドは、()で囲いますが、".pop"を付け加えただけで終わり、確認していなかったからです。
 なぜ、それに気づくのが早かったか。それは、残念ながら、同じミスをしていた人がいたからです。
 エラーメッセージで検索かければすぐに出てきました。
 話がそれました。以下、今回のコードです。

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']
    #print(shuffle_kouho) 230501 こちらのprint文は取り除きました。
    random.shuffle(shuffle_kouho)
    answer_str=shuffle_kouho.index(q['answer']) #インデックスを返す。
    return [shuffle_kouho,answer_str]

# 回答者が答えた選択肢の文字列a1(A,B,C,Dとか)と正解の選択肢のインデックス(0,1,2,3とか)を引数に、一致しているときはTrue,一致しないときはFalseを返す
def sf(a1,a2):#success,failuer
    if a1==chr(65+a2):
        return 1
    else:
        return 0

# CSVのファイル名を指定して、問題が格納されたリストを返す
def csv2list(file_path):
    questions =[]
    with open(file_path, 'r',encoding="UTF-8") as f:
        reader = csv.reader(f)
        for line in reader:#ここでCSV1行ごとの処理が行われる
            #print(line)
            kouho_array = line[1].split('/') #鯏/鯵/鱒/鱚
            dict = {'question':line[0],'kouho':kouho_array,'answer':line[2],'category':line[3]}
            questions.append(dict)
        
        questions.pop(0)
    return questions

#引 数:出題する問題と全問題のディクショナリ
#戻り値:出題する問題のカテゴリにあった問題のみ
def categorize_questions(category,allquestions):
    categorized_questions=[]
    for tuple in allquestions:
        if category==tuple['category']:
            categorized_questions.append(tuple)
    return categorized_questions

#このbattleは1匹のモンスターとの戦闘に関わる関数
def battle():#戦闘時の関数定義  def battle(monster):
    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':'地理'},
    ]"""
    
    questions = csv2list('Dict.csv') #questionsが1匹のモンスターに相当する
    while len(questions)>0:
            # if i==0:
            #     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:
            this_question = questions.pop(random.randint(0,len(questions)-1)) #questions[0] とかquestions[1]とか
            # this_question = questions[random.randint(0,2)] #questions[0] とかquestions[1]とか
            #print(this_question)
            #sys.exit( )
            """
            s1="漢字出題モンスターが現れた!"
            s2=s1.replace(s1,"")
            print(s1)
            time.sleep(2)
            print(s2)
            """
            #没になった。メモリ内容が変わるだけで、画面に出力したのは変わらない。
            
            
            #print(this_question['category'],end='')
            #print("出題モンスターが現れた!")
            #print("漢字出題モンスターが現れた!")
            if i==0:#初回のみモンスター名の表示するための変数
                ran = random.randint(1,3)
                if ran ==2 :
                    bgm_sound5.play()
                print(this_question['category']+"出題モンスターが現れた")#モンスターの名前の表示
                questions=categorize_questions(this_question['category'],questions)#questionsをカテゴリ統一したものに上書きする
                time.sleep(2)
                subprocess.run('CLS',shell=True)#2秒後に消す
            # if i>0:
            #     after_question= questions[t] 
            print("debug: ", end="")
            print(this_question['question'])#ここで表示された後にシャッフルされている!!
            #print(this_question['kouho'])
            ans_list=get_answer(this_question)
            #print(ans_list)
            #ans_list は次のような形 [['紋白蝶', '紋花蝦蛄', '秋刀魚', '背赤後家蜘蛛'], 1]
            print(ans_list[0])
            for j in range(0,len(ans_list[0])):
                print(chr(65+j)+': '+ans_list[0][j])#ASCIIコードで設定しました
            """
            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()
            ans=input()#答えの入力を行わせる
            if sf(ans,ans_list[1]):#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)
        if len(questions)<=0:
            print("問題数が不足しています。先頭を中断します。")




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

"""
while my_hp :
    mondai = monster_attack(monster) #モンスターが出題する
    my_hp,monster_hp =player_attack(mondai,kaitou) #主人公が答える
    if monster_hp <= 0 :
        monster = monster_change()
  
"""

余談:羊頭狗肉(名前と役割と、引数の型に一貫性がない関数の別称)

 今回、categorize_questions()関数の第一引数に、構造体を入れていました。
 これでは、ほかの人がコードを読んだ際に困惑してしまいます。
 関数の名前と関数の役割、引数の型は第三者が困らないように配慮しましょう。
 自分のためだけに自分だけが読めるコードを用意するのは、一生にあるかないかです。

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

今回の目標

コード内のミスを見つける 同じ問題が出ないようにする

今回の結果

コード内のミスを見つける
→達成
同じ問題が出ないようにする
→達成

次回の目標

問題カテゴリーの固定
それに合わせたwhile文の継続条件の設定

コード内のミスを見つける

 今回は以下のような二つの不具合がありました。
・問題の表示の不整合
・問題が同じものが出る。

問題の表示の不整合

 何故か表示されている問題と解答の配置が違っていました。
 これは、ユーザ定義関数ger_answer()関数内部に、print関数が入っていました。おそらく、動作確認のために入れたと考えています。
 一応、このようなミスはコメントアウトで残しておきます。こういったミスは忘れないほうが、再発防止の意識につながります。
 以下が、修正前と修正後です。

# 問題の入った辞書を引数に、シャッフルした選択肢と解答のリスト
def get_answer(q):#関数定義
    shuffle_kouho=q['kouho']
    print(shuffle_kouho)
    random.shuffle(shuffle_kouho)
    answer_str=shuffle_kouho.index(q['answer']) #インデックスを返す。
    return [shuffle_kouho,answer_str]
# 問題の入った辞書を引数に、シャッフルした選択肢と解答のリスト
def get_answer(q):#関数定義
    shuffle_kouho=q['kouho']
    #print(shuffle_kouho) 230501 こちらのprint文は取り除きました。
    random.shuffle(shuffle_kouho)
    answer_str=shuffle_kouho.index(q['answer']) #インデックスを返す。
    return [shuffle_kouho,answer_str]
同じ問題が出ないようにする

コードのwhile()ループ外に問題を決めるコードを書いていただけです。

同じ問題が出ないようにする

 popメソッドを使って重複しないように削除していきます。今回は時間の都合上動作確認は取れていません。

this_question = questions.pop[random.randint(0,len(questions)-1)] #questions[0] とかquestions[1]とか

 以上です。以下が今回のコードです。

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']
    #print(shuffle_kouho) 230501 こちらのprint文は取り除きました。
    random.shuffle(shuffle_kouho)
    answer_str=shuffle_kouho.index(q['answer']) #インデックスを返す。
    return [shuffle_kouho,answer_str]

# 回答者が答えた選択肢の文字列a1(A,B,C,Dとか)と正解の選択肢のインデックス(0,1,2,3とか)を引数に、一致しているときはTrue,一致しないときはFalseを返す
def sf(a1,a2):#success,failuer
    if a1==chr(65+a2):
        return 1
    else:
        return 0

# CSVのファイル名を指定して、問題が格納されたリストを返す
def csv2list(file_path):
    questions =[]
    with open(file_path, 'r',encoding="UTF-8") as f:
        reader = csv.reader(f)
        for line in reader:#ここでCSV1行ごとの処理が行われる
            #print(line)
            kouho_array = line[1].split('/') #鯏/鯵/鱒/鱚
            dict = {'question':line[0],'kouho':kouho_array,'answer':line[2],'category':line[3]}
            questions.append(dict)
        
        questions.pop(0)
    return questions

#このbattleは1匹のモンスターとの戦闘に関わる関数
def battle():#戦闘時の関数定義  def battle(monster):
    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':'地理'},
    ]"""
    
    questions = csv2list('Dict.csv') #questionsが1匹のモンスターに相当する
    while len(questions)>0:
            # if i==0:
            #     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:
            this_question = questions.pop[random.randint(0,len(questions)-1)] #questions[0] とかquestions[1]とか
            # this_question = questions[random.randint(0,2)] #questions[0] とかquestions[1]とか
            #print(this_question)
            #sys.exit( )
            """
            s1="漢字出題モンスターが現れた!"
            s2=s1.replace(s1,"")
            print(s1)
            time.sleep(2)
            print(s2)
            """
            #没になった。メモリ内容が変わるだけで、画面に出力したのは変わらない。
            
            
            #print(this_question['category'],end='')
            #print("出題モンスターが現れた!")
            #print("漢字出題モンスターが現れた!")
            if i==0:#初回のみモンスター名の表示するための変数
                ran = random.randint(1,3)
                if ran ==2 :
                    bgm_sound5.play()
                print(this_question['category']+"出題モンスターが現れた")#モンスターの名前の表示
                time.sleep(2)
                subprocess.run('CLS',shell=True)#2秒後に消す
            # if i>0:
            #     after_question= questions[t] 
            print("debug: ", end="")
            print(this_question['question'])#ここで表示された後にシャッフルされている!!
            #print(this_question['kouho'])
            ans_list=get_answer(this_question)
            #print(ans_list)
            #ans_list は次のような形 [['紋白蝶', '紋花蝦蛄', '秋刀魚', '背赤後家蜘蛛'], 1]
            print(ans_list[0])
            for j in range(0,len(ans_list[0])):
                print(chr(65+j)+': '+ans_list[0][j])#ASCIIコードで設定しました
            """
            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()
            ans=input()#答えの入力を行わせる
            if sf(ans,ans_list[1]):#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()#確認用に呼び出し

"""
while my_hp :
    mondai = monster_attack(monster) #モンスターが出題する
    my_hp,monster_hp =player_attack(mondai,kaitou) #主人公が答える
    if monster_hp <= 0 :
        monster = monster_change()
  
"""

余談:今回は特にないです。

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

今回の目標

モンスター別の問題のカテゴリの固定

今回の結果

モンスター別の問題のカテゴリの固定
→失敗(逆にすることが増えた)

次回の目標

コード内のミスを見つける

コード内のミスを見つける

 今回は自分用にどうなったのかをまとめておきます。
 今回の目標を達成すべく、コードを書いていましたが、なぜか問題を表示した後にシャッフルしていました。
 また、問題のカテゴリを統一するために、問題を正解しても同じ問題がでるようにしていましたがこれが何のためにあったのか、コメントしていませんでした。
 以下が今回のコードです。

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']
    print(shuffle_kouho)
    random.shuffle(shuffle_kouho)
    answer_str=shuffle_kouho.index(q['answer']) #インデックスを返す。
    return [shuffle_kouho,answer_str]

# 回答者が答えた選択肢の文字列a1(A,B,C,Dとか)と正解の選択肢のインデックス(0,1,2,3とか)を引数に、一致しているときはTrue,一致しないときはFalseを返す
def sf(a1,a2):#success,failuer
    if a1==chr(65+a2):
        return 1
    else:
        return 0

# CSVのファイル名を指定して、問題が格納されたリストを返す
def csv2list(file_path):
    questions =[]
    with open(file_path, 'r',encoding="UTF-8") as f:
        reader = csv.reader(f)
        for line in reader:#ここでCSV1行ごとの処理が行われる
            #print(line)
            kouho_array = line[1].split('/') #鯏/鯵/鱒/鱚
            dict = {'question':line[0],'kouho':kouho_array,'answer':line[2],'category':line[3]}
            questions.append(dict)
        
        questions.pop(0)
    return questions

#このbattleは1匹のモンスターとの戦闘に関わる関数
def battle():#戦闘時の関数定義  def battle(monster):
    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':'地理'},
    ]"""
    questions = csv2list('Dict.csv') #questionsが1匹のモンスターに相当する
    this_question = questions[random.randint(0,len(questions)-1)] #questions[0] とかquestions[1]とか
    # this_question = questions[random.randint(0,2)] #questions[0] とかquestions[1]とか
    #print(this_question)
    #sys.exit( )

    while True:
        # if i==0:
        #     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("漢字出題モンスターが現れた!")
            if i==0:
                ran = random.randint(1,3)
                if ran ==2 :
                    bgm_sound5.play()
                print(this_question['category']+"出題モンスターが現れた")#モンスターの名前の表示
                time.sleep(2)
                subprocess.run('CLS',shell=True)#2秒後に消す
            # if i>0:
            #     after_question= questions[t] 
            print(this_question['question'])
            #print(this_question['kouho'])
            ans_list=get_answer(this_question)
            for j in range(0,len(ans_list[0])):
                print(chr(65+j)+': '+ans_list[0][j])#ASCIIコードで設定しました
            """
            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()
        ans=input()#答えの入力を行わせる
        if sf(ans,ans_list[1]):#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()#確認用に呼び出し

"""
while my_hp :
    mondai = monster_attack(monster) #モンスターが出題する
    my_hp,monster_hp =player_attack(mondai,kaitou) #主人公が答える
    if monster_hp <= 0 :
        monster = monster_change()
  
"""

余談:今更気づいた常識

 私の場合、学費が1日に少なくとも1万円が飛んでいます。
 皆さんも、学費の重さに気づいたら、元を取ろうと勉強する気になると思います(少なくとも、私の場合は)