ChatGPTに、簡単な2択式クイズゲームを作成してもらった

ChatGPTに、簡単な2択式クイズゲームを作成してもらいました。コードはPythonとhtmlです。

クイズを定義するテキストファイル(csv形式)と、クイズに使う画像(猫と虎を選ばせる画像)は、事前に用意してます。

ChatGPTにプロトコルを投げては訂正を繰り返していたらエラーで止まってしまうようになったので、途中から仕切り直しでBing_AI-Chatを使ってます。少し込み入った処理になってくると、さすがにプロンプト一発OKを出すのは苦しいですね。小一時間ほど試行錯誤していたのですが、その経過を記載するのは面倒なので、ほぼ成功までいけたプロンプトだけ紹介します。

指示文(プロンプト):

A or Bを選択する2択式のクイズゲームPythonとFlaskで作りたいです。
初めに問題文を定義したテキストファイルを読み込みます。 問題文を定義するテキストファイルは以下のように形式とします。


#問題定義ファイル
文章1,A,画像a1.jpg,画像b1.jpg
文章2,B,画像a2.jpg,画像b2.jpg
文章3,A,画像a3.jpg,画像b3.jpg

最初のカラムが問題文で、2つ目のカラムが正解の選択肢、3つ目のカラムは問題文と一緒に表示する画像で、4つ目のカラムは正解判定時に表示する画像です。

クイズは以下の流れで進みます。
1. 問題1を表示する。
2. 二択(A または B)で回答する。
3. 正解判定。正解判定時用の画像も表示。
4. 次に進むボタンをクリックすると次の問題を表示する。
5. すべての問題が終わったら「終了」と表示する。
6. クイズはWebブラウザで動作する。

回答:

# 2択式クイズゲーム

# Flaskをインポートする
from flask import Flask, render_template, request, session

# 問題文を定義するテキストファイルを読み込む
import csv
with open("questions.csv", encoding="utf-8") as f:
    reader = csv.reader(f)
    questions = list(reader)[1:] # ヘッダーを除く

# Flaskアプリケーションを作る
app = Flask(__name__)

# セッションを使うために秘密鍵を設定する
app.secret_key = "secret"

# ルートパスにアクセスしたときの処理
@app.route("/")
def index():
    # セッションに問題数と正解数を初期化する
    session["count"] = 0
    session["correct"] = 0
    # 問題文をランダムに並び替える
    import random
    random.shuffle(questions)
    # 最初の問題文と画像を取り出す
    text, answer, image1, image2 = questions[0]
    # 問題ページを表示する
    return render_template("question.html", text=text, image=image1)

# /answerパスにアクセスしたときの処理
@app.route("/answer", methods=["POST"])
def answer():
    # ユーザーから回答を受け取る
    user_answer = request.form["answer"]
    # 現在の問題数と正解数をセッションから取り出す
    count = session["count"]
    correct = session["correct"]
    # 正解判定
    if user_answer == questions[count][1]:
        # 正解数を増やす
        correct += 1
        # 正解メッセージと画像を表示する
        message = "正解!"
        image = questions[count][3]
    else:
        # 不正解メッセージと画像を表示する
        message = "不正解..."
        image = questions[count][3]
    # 次の問題があれば次に進むボタンを表示する
    if count < len(questions) - 1:
        next_button = True
    else:
        next_button = False
    # 回答ページを表示する
    return render_template("answer.html", message=message, image=image, next_button=next_button)

# /nextパスにアクセスしたときの処理
@app.route("/next")
def next():
    # 問題数と正解数をセッションから取り出す
    count = session["count"]
    correct = session["correct"]
    # 問題数を増やす
    count += 1
    # 次の問題文と画像を取り出す
    text, answer, image1, image2 = questions[count]
    # セッションに問題数と正解数を更新する
    session["count"] = count
    session["correct"] = correct
    # 問題ページを表示する
    return render_template("question.html", text=text, image=image1)

# /resultパスにアクセスしたときの処理
@app.route("/result")
def result():
    # 正解数をセッションから取り出す
    correct = session["correct"]
    # 結果メッセージを作る
    message = f"{len(questions)}問中{correct}問正解でした!"
    # 結果ページを表示する
    return render_template("result.html", message=message)

# Flaskアプリケーションを実行する
if __name__ == "__main__":
    app.run(debug=True)
    

question.html


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>クイズゲーム</title>
</head>
<body>
    <h1>クイズゲーム</h1>
    <p>{{ text }}</p>
    <img src="/static/{{ image }}" alt="画像" width="300">
    <form action="/answer" method="POST">
        <input type="radio" name="answer" value="A">A
        <input type="radio" name="answer" value="B">B
        <input type="submit" value="回答する">
    </form>
</body>
</html>

    

answer.html


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>クイズゲーム</title>
</head>
<body>
    <h1>クイズゲーム</h1>
    <p>{{ message }}</p>
    <img src="/static/{{ image }}" alt="画像" width="300">
    {% if next_button %}
        <a href="/next">次の問題へ</a>
    {% else %}
        <a href="/result">結果を見る</a>
    {% endif %}
</body>
</html>
    

result.html


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>クイズゲーム</title>
</head>
<body>
    <h1>クイズゲーム</h1>
    <p>{{ message }}</p>
    <a href="/">もう一度挑戦する</a>
</body>
</html>
    
結果:

一応、成功しました。ただ、いろいろ不備もあります。選択肢を選ばずに回答するとエラーになったり、結果画面に正解数が正しく反映されなかったり、画像のパスの指定が変だったり。もう少しプロンプトを練ればいけそうですが。。。