classを使おう!さらにゲームの完成へ ~Pythonで百人一首クイズを作ろう ep 2~

python
python

前回はCSVファイルの読み込みで終わってしまった。

こっからゲームを作ってこう!

記事①:ローカルとweb上のcsvファイルを読み込む ~Pythonで百人一首クイズを作ろう ep 1~

さて、前回から百人一首のゲームを作ってきました
前回はCSVファイルの読み込みに終始してしまいました。しかし、それでよし!

今回は百人一首ゲーム作りを先に進めていきたいと思います。
さらに裏テーマ、「オブジェクト指向」と「class」の学習に入っていきたいと思います。
(2021年3月27日:学習開始36日目気づけば1か月続いている!!PyQさんで勉強中!

オンラインPython学習サービス「PyQ™(パイキュー)」

「百人一首」といえば「五人一首」です。
和風プログレメタルの隠れ名盤「内視鏡世界」から「人媒花」を聞きながらやっていきましょう。
(バカテク、美しさと激しさと静寂が濁流のごとく押し寄せる。まさに内視鏡世界!曲名からレーベル公式YouTubeに飛びます。)

この美しくも残虐なサウンドに飲まれつつ、プログラムをつくっていきたいと思います。

今回は、百人一首クイズゲームが完成します!!!

1.ゲームの確認と前回の振り返り

まず、どんなゲームを作るか振り返りましょう。
前回考えたゲームの概要は以下です。

冒頭にも書いたとおり、まだ全然進んでいません。
こちらの小倉百人一首.csvをローカルにダウンロードしてPythonで読み込むところまでです。

ちなみに、前回のローカルCSVファイルの読み込みプログラムはこちらでした。

with open('C:/Users/xxxx/yyyy/hyakunin.csv', 'r', encoding='shift_jis') as f:
    for row in f:
        print(row.strip().split(','))

よく考えると、まだ3行しか進んでないんですね・・・

2.フローチャート

前回、後回しにしたフローチャートを作成します。
上で決めたゲームのルールを実際のプログラムの流れをイメージして書いていきます。

こんな感じで考えてみました。

工程自体はそこまで多くないですね。
見切り発車で「百人一首をclassで定義」と書いていますが、うまくいくのでしょうか。

それではこちらをもとに書いていきましょう。

3.プログラムを書いていこう ~classを定義す、はるのゆうぐれ~

プログラムを書いていきたいと思います。
今回、始めてclassを定義していきたいと思います。
まずは、見よう見真似でやっていきます。

どのようなclassを定義するか考えていきます。
まず、CSVファイルの中身を見てみましょう。前回読み込んだファイルの2行です。

['No', '歌人', '上の句', '下の句', '上の句(ひらがな)', '下の句(ひらがな)']
['1', '天智天皇', '秋の田のかりほの庵の苫をあらみ', 'わが衣手は露にぬれつつ', 'あきのたのかりほのいほのとまをあらみ', ' わがころもではつゆにぬれつつ']

1行目に非常に分かりやすく書かれていますね。作ってくれた方ありがとう。
これ以降の100首すべて同じ要素が用意されています。

つまり、classの要素は
「No」, 「歌人」, 「上の句」, 「下の句」, 「上の句(ひらがな)」, 「下の句(ひらがな)」
の6個とすればよいのですね。

これをそのままプログラムに反映してみましょう。

class Issyu:
    def __init__(self, num, kajin ='', kami_kanji='', shimo_kanji='', kami_hiragana='', shimo_hiragana=''):
        self.num = num #No
        self.kajin = kajin #歌人
        self.kami_kanji = kami_kanji #上の句(漢字)
        self.shimo_kanji = shimo_kanji #下の句(漢字)
        self.kami_hiragana = kami_hiragana #上の句(ひらがな)
        self.shimo_hiragana = shimo_hiragana #下の句(ひらがな)

クラス「Issyu」を作ってみました。こんな感じでしょうか?
まず、和歌No1だけ定義してみましょう。classの定義は省略しています。

waka_1 = Issyu('1', '天智天皇', '秋の田のかりほの庵の苫をあらみ', 'わが衣手は露にぬれつつ', 'あきのたのかりほのいほのとまをあらみ', ' わがころもではつゆにぬれつつ')


うまく書けているのでしょうか?
例として、「歌人」と「上の句(ひらがな)」を出力してみます。

print(waka_1.kajin)
print(waka_1.kami_hiragana)

実行してみましょう。

天智天皇
あきのたのかりほのいほのとまをあらみ

ここまではうまく書けているようです。

これを100首すべてでやれば出来るわけですが、手入力をするわけないですよね。
すでにfor構文で1行ごとにCSVファイルを開く状態になっているので、これを利用すれば全部「Issyu」にぶち込めるのではないでしょうか。いや出来るはずです。

こんな感じでしょうか?(注:うまく行きません)

class Issyu:
~~~~~略~~~~~

with open('C:/Users/xxxx/yyyy/hyakunin.csv', 'r', encoding='shift_jis') as f: #「hyakunin.csv」を開く
    for row in f:
        hyakunin_list = row.strip().split(',') #空白の削除とカンマでの区切り
        waka_num = hyakunin_list[0] #No
        waka_kajin = hyakunin_list[1] #歌人
        waka_k_k = hyakunin_list[2] #上の句(漢字)
        waka_s_k = hyakunin_list[3] #下の句(漢字)
        waka_k_h = hyakunin_list[4] #上の句(ひらがな)
        waka_s_h = hyakunin_list[5] #下の句(ひらがな)
        waka = Issyu(waka_num, waka_kajin, waka_k_k, waka_s_k, waka_k_h, waka_s_h)
print(waka.num)

実行するとこうなります。

100

正直、書いているときからうすうす分かっていましたが、forで1行処理されるごとに上書きされています。

どうすればよいのでしょうか?
式の左側(waka)の方が、forで進むごとに毎回変われば行けそうです。
・・・・調べたけどやり方が分かりません。

waka_1~waka_100までを定義する方法は、、、、これも調べたけど分かりません。

ヤバい!!!(ここで苦しむこと約1時間・・・結局調べても良い方法が見つからず・・・)

辞書型ならいけるか?辞書のkeyを「No」valueを「Issyu」にしてちょっとやってみましょう。

class Issyu:
~~~~~略~~~~~

hyakunin_dict ={} #辞書を定義

with open('C:/Users/xxxx/yyyy/hyakunin.csv', 'r', encoding='shift_jis') as f: #「hyakunin.csv」を開く
    for row in f:
        hyakunin_list = row.strip().split(',') #空白の削除とカンマでの区切り
        waka_num = hyakunin_list[0] #No
        waka_kajin = hyakunin_list[1] #歌人
        waka_k_k = hyakunin_list[2] #上の句(漢字)
        waka_s_k = hyakunin_list[3] #下の句(漢字)
        waka_k_h = hyakunin_list[4] #上の句(ひらがな)
        waka_s_h = hyakunin_list[5] #下の句(ひらがな)
        hyakunin_dict[waka_num] = Issyu(waka_num, waka_kajin, waka_k_k, waka_s_k, waka_k_h, waka_s_h)

print(hyakunin_dict)

実行してみましょう。

{'No': <__main__.Issyu object at 0x000001798EE49E20>, '1': <__main__.Issyu object at 0x000001798EE49D60>, '2': <__main__.Issyu object at 0x000001798EE49D30>, '3': <__main__.Issyu object at 0x000001798EE49A30>,
~~~~~略~~~~~ 
'99': <__main__.Issyu object at 0x000001798EE04D30>, '100': <__main__.Issyu object at 0x000001798EE04730>}

これは、大丈夫か??Valueが変なことになってます・・・
もう少しやってみます。例えば5番目の和歌を呼び出してみましょう。

~~~~~略~~~~~ 
        hyakunin_dict[waka_num] = Issyu(waka_num, waka_kajin, waka_k_k, waka_s_k, waka_k_h, waka_s_h)

print(hyakunin_dict['5'].num)
print(hyakunin_dict['5'].kajin)
print(hyakunin_dict['5'].kami_kanji)
print(hyakunin_dict['5'].shimo_kanji)
print(hyakunin_dict['5'].kami_hiragana)
print(hyakunin_dict['5'].shimo_hiragana)

どうでしょうか?実行してみます。

5
猿丸大夫
奥山に紅葉踏み分け鳴く鹿の
声聞く時ぞ秋は悲しき
おくやまにもみぢふみわけなくしかの
こゑきくときぞあきはかなしき

よっしゃ~~~~!!!行けました!!
調べても見つからなかっただけに、喜びもひとしおです。
確認できたので、printはもう不要なので消して

すこし気になるのは、Noです。今は文字列(Str)ですが、できれば数字の方がよいと思います。
このようにしてみます。

~~~~~略~~~~~
with open('C:/Users/xxxx/yyyy/hyakunin.csv', 'r', encoding='shift_jis') as f: #「hyakunin.csv」を開く
    for row in f:
        hyakunin_list = row.strip().split(',') #空白の削除とカンマでの区切り
        waka_num = int(hyakunin_list[0]) #No数字に
~~~~~略~~~~~

実行するとエラー(ValueError)がでました。
1行目に「No」の文字列が入っているので、数字にできないわけですね。
しかし、よく考えるとCSVの説明の1行目[‘No’, ‘歌人’, ‘上の句’, ‘下の句’, ‘上の句(ひらがな)’, ‘下の句(ひらがな)’]は不要です。

ということは、この行はエラーが出れば飛ばせばよいわけですね。
Try/exceptでいけるのではないでしょうか?

こんな感じに変えてみました。ちょっと場所があやしいです。
うまくできているか確認したいのでprintします。

~~~~~略~~~~~
with open('C:/Users/xxxx/yyyy/hyakunin.csv', 'r', encoding='shift_jis') as f: #「hyakunin.csv」を開く
    for row in f:
        hyakunin_list = row.strip().split(',') #空白の削除とカンマでの区切り
        try:
            waka_num = int(hyakunin_list[0]) #No数字に
            waka_kajin = hyakunin_list[1] #歌人
            waka_k_k = hyakunin_list[2] #上の句(漢字)
            waka_s_k = hyakunin_list[3] #下の句(漢字)
            waka_k_h = hyakunin_list[4] #上の句(ひらがな)
            waka_s_h = hyakunin_list[5] #下の句(ひらがな)
            hyakunin_dict[waka_num] = Issyu(waka_num, waka_kajin, waka_k_k, waka_s_k, waka_k_h, waka_s_h)
        except ValueError:
            pass
        
print(hyakunin_dict)

実行結果はこうなります。

{1: <__main__.Issyu object at 0x000001798EDEE7C0>, 2: <__main__.Issyu object at 0x000001798EDEEE20>, 
~~~~~略~~~~~
99: <__main__.Issyu object at 0x000001798EDED910>, 100: <__main__.Issyu object at 0x000001798EE049D0>}

まず、はじめのNoが飛ばされています。
次に、辞書のkeyが文字列「’1’」から数字「1」に変わっています。

うまくできてそうです。やっとクラスの定義までできました。
これ、便利なのでしょうか?まだよくわかりません・・・

4.プログラムを書いていこう ~クイズに移る夜ぞ更けにける~

さて、クラスの定義が終わりました。フローチャートを進めていきましょう。

まずは、「クイズの開始」と「1首をランダムで選ぶ」からです。
「クイズの開始」がprintで宣言すればよいと思います。
問題は「1首をランダムで選ぶ」です。
すでに1~100のNoがついているので、これから1つをランダムで選べば良さそうです。
ここまでを再現してみましょう。def main_game()として書いていきます。

import random #randomをインポート

~~~~~略~~~~~

def main_game():
    print('百人一首クイズ!')
    num_list = list(range(1,101)) #1~100の数字リストを作成
    mondai_no = random.choice(num_list) #問題のNoをランダム選択
    mondai_waka = hyakunin_dict[mondai_no] #問題の和歌を定義

こんな感じでしょう。

次は、「選んだ上の句を表示(出題)」です。
ここは、classの方で定義してみようと思います。
classの中に新たに関数を設定します。ひらがなの上の句が出力されるようにします。

import random #randomをインポート

class Issyu:
    def __init__(self, num, kajin ='', kami_kanji='', shimo_kanji='', kami_hiragana='', shimo_hiragana=''):
        self.num = num #No
        self.kajin = kajin #歌人
        self.kami_kanji = kami_kanji #上の句(漢字)
        self.shimo_kanji = shimo_kanji #下の句(漢字)
        self.kami_hiragana = kami_hiragana #上の句(ひらがな)
        self.shimo_hiragana = shimo_hiragana #下の句(ひらがな)
    
    def syutudai(self): #出題を定義
        return f'問題!上の句:{self.kami_hiragana}'

~~~~~略~~~~~

def main_game():
    print('百人一首クイズ!')
    num_list = list(range(1,101)) #1~100の数字リストを作成
    mondai_no = random.choice(num_list) #問題のNoをランダム選択
    mondai_waka = hyakunin_dict[mondai_no] #問題の和歌を定義
    print(mondai_waka.syutudai()) #出題

いったん、ここまでで出力してみましょう。
main_game()で実行してます。結果はこうなりました。

百人一首クイズ!
問題!上の句:おほけなくうきよのたみにおほふかな

いまのところはいけてそうですね。先に進めましょう。
次は、「ランダムで4首の選択」と「出題1首と追加4首の下の句を順不同で表示」です。
ここは、もう少しかみ砕く必要がありそうです。

まず、「ランダムな4首」の選択です。
考え方としては、出題の1首の選択と同じで、100首から4首を選べばよいです。
ただし、
①100首から出題の1首は除外=99首から選ぶ。
②選ぶ4首がかぶらない。

という工夫が必要です。

ついで、「出題1首と追加4首の下の句を順不同で表示」です。
ここもかみ砕きましょう。
まず、出題する1首が1~5の何番の下の句になるか?を選ぶ必要があります。
この番号は、選択肢の番号であると同時に、正誤判定の番号になるので、きちんと分けておく必要があります。
ここも1~5のリストを用意して1つをランダムで選べば良さそうです。

順不同で「表示」のところは先ほどと同じようにclassで定義してみたいと思います。
ここでは「選択肢の番号:ひらがな下の句」のような形で表示したいと思います。

最終的な選択肢表示のイメージはこんな感じです。仮に4が正解とします。
1:下の句1
2:下の句2
3:下の句3
4:下の句4(正解)
5:下の句5
ようは、1,2,3,4,5と順に表示させたいわけです。
for構文が使えるのではないでしょうか?

import random #randomをインポート

class Issyu:
    def __init__(self, num, kajin ='', kami_kanji='', shimo_kanji='', kami_hiragana='', shimo_hiragana=''):
        self.num = num #No
        self.kajin = kajin #歌人
        self.kami_kanji = kami_kanji #上の句(漢字)
        self.shimo_kanji = shimo_kanji #下の句(漢字)
        self.kami_hiragana = kami_hiragana #上の句(ひらがな)
        self.shimo_hiragana = shimo_hiragana #下の句(ひらがな)
    
    def syutudai(self): #出題を定義
        return f'問題!上の句:{self.kami_hiragana}'
    
    def kaitou(self,num): #選択肢を定義、numは解答する番号
        return f'{num} : {self.shimo_hiragana}'

~~~~~略~~~~~

def main_game():
    print('百人一首クイズ!')
    num_list = list(range(1,101)) #1~100の数字リストを作成
    mondai_no = random.choice(num_list) #問題のNoをランダム選択
    mondai_waka = hyakunin_dict[mondai_no] #問題の和歌を定義
    print(mondai_waka.syutudai()) #出題
    huseikai_list = list(range(1,101)) #不正解の和歌番号リスト
    huseikai_list.remove(mondai_no) #不正解リストから正解の1首を除去
    kaitou_list = list(range(1,6)) #解答番号のリスト作成
    seikai_no = random.choice(kaitou_list) #正解の番号
    for row in kaitou_list:
        if row == seikai_no: #正解の番号の場合
            print(mondai_waka.kaitou(row)) #正解の下の句を表示
        else:
            huseikai_no = random.choice(huseikai_list) #不正解の和歌Noをランダム選択
            huseikai_waka = hyakunin_dict[huseikai_no] #不正解の和歌Noを定義
            print(huseikai_waka.kaitou(row)) #不正解の下の句を表示
            huseikai_list.remove(huseikai_no) #不正解の和歌Noの選択肢を除去

ここまでで出力してみましょう。

百人一首クイズ!
問題!上の句:ちぎりきなかたみにそでをしぼりつつ
1 : あしのまろやにあきかぜぞふく
2 : ひとこそしらねかわくまもなし
3 : あらはれわたるせぜのあじろぎ
4 : すゑのまつやまなみこさじとは
5 : ながくもがなとおもひけるかな

おお、なんとなくいけてそうです。被りもないです。

さて、次は「1~5で回答をインプット」です。

これまでの経験から、インプットに関してはメインの中ではなく、別で関数を定義した方がよいと考えています。
(参照:モンティ・ホール問題をPythonで検証する ~モンティホール・アウトレイジ ep 1~
理由は、「1~5が入力された場合は進めて、それ以外が入力された場合は再入力を求める」というのを実装するためにはループが必要になり、本体の中でやるとややこしくなるからです。

では、別の関数を定義しましょう。

~~~~~略~~~~~

def kaitou_input():
    while True:
        kaitou_no = input('回答:')
        if kaitou_no in ['1', '2', '3', '4', '5']: #1~5が入力された場合
            return kaitou_no #文字列の1~5を返す。
            break #ループから抜ける。
        else:
            print('1~5から選んでください') #1~5以外が入力された場合

def main_game():
    print('百人一首クイズ!')
~~~~~略~~~~~
            huseikai_list.remove(huseikai_no) #不正解の和歌Noの選択肢を除去
    print('正解は?1~5から選んでください')
    kaitou_no = kaitou_input() #回答Noをインプット

さて、次に行きましょう。
次は「正誤判定」と「正解なら出題する百首から正解した1首を外す」です。

正誤判定」は、正解の番号と回答の番号が同じか?ちがうか?で分ければ良さそうです。
すでに、1~5以外はインプットできない状態で定義していますので簡単ですね。

正解なら出題する百首から正解した1首を外す」は最初に定義した1~100のリストからす出題した和歌の番号を除去していけば良さそうです。

では、プログラムを書いていきましょう。
(私は正解が分からないのでカンニングも付けました笑)

~~~~~略~~~~~
    print('正解は?1~5から選んでください')
    print(f'答えは[seikai_no]') #カンニング
    kaitou_no = kaitou_input() #回答Noをインプット
    if kaitou_no == str(seikai_no): #回答Noと正解のNoが同じ
        print('正解!!')
        num_list.remove(mondai_no) #1~100のリストから、問題Noを除去
    else: #回答Noと正解のNoが異なる
        print(f'不正解!!正解は {seikai_no} 番')

ここまでを実行してみましょう。
まず正解パターンです。

百人一首クイズ!
問題!上の句:あけぬればくるるものとはしりながら
1 : なほうらめしきあさぼらけかな
2 : あらはれわたるせぜのあじろぎ
3 : まつとしきかばいまかへりこむ
4 : かこちがほなるわがなみだかな
5 : あしのまろやにあきかぜぞふく
正解は?1~5から選んでください
答えは1
回答:1
正解!!

不正解パターン。

百人一首クイズ!
問題!上の句:みかきもりゑじのたくひのよるはもえ
1 : みのいたづらになりぬべきかな
2 : ひるはきえつつものをこそおもへ
3 : むべやまかぜをあらしといふらむ
4 : まつもむかしのともならなくに
5 : からくれなゐにみづくくるとは
正解は?1~5から選んでください
答えは2
回答:4
不正解!!正解は 2 番

1~5以外をいれるパターン

百人一首クイズ!
問題!上の句:おとにきくたかしのはまのあだなみは
1 : わがみよにふるながめせしまに
2 : くもがくれにしよはのつきかな
3 : かけじやそでのぬれもこそすれ
4 : ふるさとさむくころもうつなり
5 : つらぬきとめぬたまぞちりける
正解は?1~5から選んでください
答えは3
回答:p
1~5から選んでください
回答:

よし!!うまくいけてそうです。
ただ、ひとつ確認できていないのが「正解した和歌がリストから除外できているかどうか?」
ここでは記載しませんが、正誤判定後にnum_listを表示させてみると、確かに正解した和歌が除外できていました。

次に進みます。最後まで行きます。
残りは、「残り1首以上か?」と「まだ残っている場合は次の問題に戻る」です。

残り1首以上か?」ですが、これは簡単です。
最初に定義した1~100のリストが空かどうかを判定すればOKです。

まだ残っている場合は次の問題に戻る」です。
これは、100首正解するまでループするので、これまでのところをゴッソリwhileでループさせる必要があります。

ついでに残り問題数もprintするようにします。

ここまでをプログラムで書いていきます。これで完成なので、プログラム全体を記載します。

import random #randomをインポート

class Issyu:
    def __init__(self, num, kajin ='', kami_kanji='', shimo_kanji='', kami_hiragana='', shimo_hiragana=''):
        self.num = num #No
        self.kajin = kajin #歌人
        self.kami_kanji = kami_kanji #上の句(漢字)
        self.shimo_kanji = shimo_kanji #下の句(漢字)
        self.kami_hiragana = kami_hiragana #上の句(ひらがな)
        self.shimo_hiragana = shimo_hiragana #下の句(ひらがな)
    
    def syutudai(self): #出題を定義
        return f'問題!上の句:{self.kami_hiragana}'
    
    def kaitou(self,num):
        return f'{num} : {self.shimo_hiragana}'

hyakunin_dict ={} #辞書を定義

with open('C:/Users/xxxx/yyyy/hyakunin.csv', 'r', encoding='shift_jis') as f: #「hyakunin.csv」を開く
    for row in f:
        hyakunin_list = row.strip().split(',') #空白の削除とカンマでの区切り
        try:
            waka_num = int(hyakunin_list[0]) #No数字に
            waka_kajin = hyakunin_list[1] #歌人
            waka_k_k = hyakunin_list[2] #上の句(漢字)
            waka_s_k = hyakunin_list[3] #下の句(漢字)
            waka_k_h = hyakunin_list[4] #上の句(ひらがな)
            waka_s_h = hyakunin_list[5] #下の句(ひらがな)
            hyakunin_dict[waka_num] = Issyu(waka_num, waka_kajin, waka_k_k, waka_s_k, waka_k_h, waka_s_h)
        except ValueError:
            pass

def kaitou_input():
    while True:
        kaitou_no = input('回答:')
        if kaitou_no in ['1', '2', '3', '4', '5']: #1~5が入力された場合
            return kaitou_no #文字列の1~5を返す。
            break #ループから抜ける。
        else:
            print('1~5から選んでください') #1~5以外が入力された場合
        
def main_game():
    print('百人一首クイズ!')
    num_list = list(range(1,101)) #1~100の数字リストを作成
    while True:
        if num_list == []:  #100首すべて終了
            print('全問終了です!!')
            break
        print(f'残り{len(num_list)}問') #残り問題数を表示
        mondai_no = random.choice(num_list) #問題のNoをランダム選択
        mondai_waka = hyakunin_dict[mondai_no] #問題の和歌を定義
        print(mondai_waka.syutudai()) #出題
        huseikai_list = list(range(1,101)) #不正解の和歌番号リスト
        huseikai_list.remove(mondai_no) #不正解リストから正解の1首を除去
        kaitou_list = list(range(1,6)) #解答番号のリスト作成
        seikai_no = random.choice(kaitou_list) #正解の番号
        for row in kaitou_list:
            if row == seikai_no: #正解の番号の場合
                print(mondai_waka.kaitou(row)) #正解の下の句を表示
            else:
                huseikai_no = random.choice(huseikai_list) #不正解の和歌Noをランダム選択
                huseikai_waka = hyakunin_dict[huseikai_no] #不正解の和歌Noを定義
                print(huseikai_waka.kaitou(row)) #不正解の下の句を表示
                huseikai_list.remove(huseikai_no) #不正解の和歌Noの選択肢を除去
        print('正解は?1~5から選んでください')
        print(f'答えは{seikai_no}') #カンニング
        kaitou_no = kaitou_input() #回答Noをインプット
        if kaitou_no == str(seikai_no): #回答Noと正解のNoが同じ
            print('正解!!')
            num_list.remove(mondai_no) #1~100のリストから、問題Noを除去
        else: #回答Noと正解のNoが異なる
            print(f'不正解!!正解は {seikai_no} 番')

main_game()

実行してみましょう。

百人一首クイズ!
残り100問
問題!上の句:わたのはらこぎいでてみればひさかたの
1 : わがころもでにゆきはふりつつ
2 : ころもかたしきひとりかもねむ
3 : よをうぢやまとひとはいふなり
4 : くもゐにまがふおきつしらなみ
5 : われてもすゑにあはむとぞおもふ
正解は?1~5から選んでください
答えは4
回答:4
正解!!
残り99問
問題!上の句:あけぬればくるるものとはしりながら
1 : なほうらめしきあさぼらけかな
2 : もみぢのにしきかみのまにまに
3 : ひとにはつげよあまのつりぶね
4 : ひとのいのちのをしくもあるかな
5 : なこそながれてなほきこえけれ
正解は?1~5から選んでください
答えは1
回答:3
不正解!!正解は 1 番
残り99問
問題!上の句:ゆふさればかどたのいなばおとづれて
1 : いつみきとてかこひしかるらむ
2 : わがみよにふるながめせしまに
3 : ひとこそしらねかわくまもなし
4 : あはでこのよをすぐしてよとや
5 : あしのまろやにあきかぜぞふく
正解は?1~5から選んでください
答えは5

きちんと進んでいますね。

最後どうなるかも見てみます。
1問1問回答するのはしんどいので、インプットしなくても「kaitou_no == str(seikai_no)」として実行しました。

残り1問
問題!上の句:あきかぜにたなびくくものたえまより
1 : もれいづるつきのかげのさやけさ
2 : けふをかぎりのいのちともがな
3 : わがみひとつのあきにはあらねど
4 : しろきをみればよぞふけにける
5 : みそぎぞなつのしるしなりける
正解は?1~5から選んでください
正解!!
全問終了です!!

最後まで行きました。
これで、カンニングを非表示(#)にすれば「百人一首クイズゲーム」完成です!!!!

一旦、完成しましたが、次回は少しブラシュアップしてみたいと思います。

To Be Continued : Pythonで百人一首クイズを作ろう ep 3

PyQさんで勉強中!

コメント

タイトルとURLをコピーしました