Python超入門⑧ クイズゲームを完成させよう
変数、if文、for文、関数、リスト、辞書を組み合わせ、3問のクイズゲームを作ります。
最終回では、これまでの文法を組み合わせてクイズゲームを作ります。
完成したコード
questions = [
{"text": "2 + 3 は?", "answer": "5"},
{"text": "Pythonで文字を表示する関数は?", "answer": "print"},
{"text": "リストの最初の位置は?", "answer": "0"}
]
def ask_question(question):
user_answer = input(question["text"] + " ")
return user_answer == question["answer"]
score = 0
for question in questions:
if ask_question(question):
print("正解です")
score += 1
else:
print(f"正解は{question['answer']}です")
print(f"{len(questions)}問中{score}問正解しました")
問題をリストと辞書で保存する
questionsはリストです。その中へ、問題文と答えを持つ辞書を入れています。
問題を増やしたいときは、同じ形の辞書をリストへ追加します。
1問分を関数へ分ける
ask_question関数は、問題を表示して答えを受け取ります。
入力された答えと正解が同じならTrue、違えばFalseを返します。
for文で全問題を出す
for question in questions:
questionsの辞書が一つずつquestionへ入ります。正解した場合だけscoreを1増やします。
改造してみよう
- 問題を5問へ増やす
- 大文字と小文字を区別しないようにする
- 正解率を表示する
- 問題をファイルから読み込む
一つ変更したら実行し、正しく動くことを確認してから次へ進みましょう。
模範解答
まず、プログラムと同じフォルダへquestions.jsonを作ります。
[
{"text": "2 + 3 は?", "answer": "5"},
{"text": "Pythonで文字を表示する関数は?", "answer": "print"},
{"text": "リストの最初の位置は?", "answer": "0"},
{"text": "真を表す値は?", "answer": "true"},
{"text": "繰り返しに使うキーワードは?", "answer": "for"}
]
次のプログラムでファイルを読み込み、5問を出題します。
import json
with open("questions.json", "r", encoding="utf-8") as file:
questions = json.load(file)
def ask_question(question):
user_answer = input(question["text"] + " ").strip().lower()
correct_answer = question["answer"].strip().lower()
return user_answer == correct_answer
score = 0
for question in questions:
if ask_question(question):
print("正解です")
score += 1
else:
print(f"正解は{question['answer']}です")
rate = score / len(questions) * 100
print(f"{len(questions)}問中{score}問正解しました")
print(f"正解率は{rate:.1f}%です")
解説
json.loadでJSONファイルをPythonのリストと辞書へ変換します。stripは前後の空白を取り除き、lowerは英字を小文字へそろえるため、PRINTとprintを同じ答えとして判定できます。正解数を問題数で割って100を掛けると正解率になります。
まとめ
- リストと辞書で複数の問題を管理できます。
- 関数へ処理を分けると、流れを読みやすくできます。
- if文とfor文を組み合わせると、採点処理を作れます。
最初から復習する:Python超入門① 最初のプログラムを書いて動かそう