File size: 7,252 Bytes
a92ce96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import os
from dotenv import load_dotenv
from langchain_groq import ChatGroq
import streamlit as st

# Load environment variables from .env file
load_dotenv()

# Retrieve the API key from environment variables
api_key = os.getenv('GROQ_API_KEY')

# Initialize ChatGroq
llm = ChatGroq(
    api_key=api_key,
    model="llama-3.1-70b-versatile",  # Specify your desired model
    temperature=1.0,                  # Set temperature for creative output
    max_retries=2                     # Set maximum retries for requests
)

# Function to generate quiz questions
def generate_questions(topic="math", num_questions=3):
    """

    Generate quiz questions without answers.

    """
    try:
        prompt = f"Generate {num_questions} {topic} multiple-choice quiz questions with 4 options each. Do not include answers."
        response = llm.invoke([  
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": prompt}
        ])
        content = response.content if hasattr(response, 'content') else str(response)

        # Debug: Print raw content
        print("Raw Questions Content:", content)

        # Parse questions
        questions = []
        current_question = {"options": []}

        for line in content.split("\n"):
            line = line.strip()
            if line.startswith("1.") or line.startswith("2.") or line.startswith("3."):
                # Save the previous question if present
                if current_question and "question" in current_question:
                    questions.append(current_question)
                    current_question = {"options": []}

                current_question["question"] = line

            elif line.startswith("A)") or line.startswith("B)") or line.startswith("C)") or line.startswith("D)"):
                # Append options
                current_question["options"].append(line)

        # Add the last question if it exists
        if current_question and "question" in current_question:
            questions.append(current_question)

        return questions if questions else []
    except Exception as e:
        st.error(f"Error generating questions: {e}")
        return []

# Function to fetch concise answers (A, B, C, D) for the provided questions
def fetch_answers(questions):
    """

    Fetch concise answers (A, B, C, or D) for the provided questions.

    """
    try:
        prompt = "Provide the correct answers for the following multiple-choice questions in concise form (e.g., A, B, C, or D). Only return the letter of the correct answer for each question:\n"
        for i, question in enumerate(questions):
            prompt += f"\n{i + 1}. {question['question']}\n"
            for option in question["options"]:
                prompt += f"{option}\n"

        response = llm.invoke([
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": prompt}
        ])
        content = response.content if hasattr(response, 'content') else str(response)

        # Debug: Print raw answers content
        print("Raw Answers Content:", content)

        # Extract concise answers (e.g., A, B, C, or D)
        answers = {}
        for line in content.split("\n"):
            line = line.strip()
            if line and len(line) == 1 and line.upper() in ["A", "B", "C", "D"]:
                question_number = len(answers)  # Match order with the question index
                answers[question_number] = line.upper()

        return answers
    except Exception as e:
        st.error(f"Error fetching answers: {e}")
        return {}

# Initialize session state
if "score" not in st.session_state:
    st.session_state.score = 0
if "current_question" not in st.session_state:
    st.session_state.current_question = 0
if "attempts" not in st.session_state:
    st.session_state.attempts = 0
if "lives" not in st.session_state:
    st.session_state.lives = 3
if "questions" not in st.session_state or not st.session_state.questions:
    st.session_state.questions = generate_questions("math", num_questions=3)
if "answers" not in st.session_state or not st.session_state.answers:
    st.session_state.answers = fetch_answers(st.session_state.questions)

# Function to reset the quiz
def reset_quiz():
    st.session_state.current_question = 0
    st.session_state.score = 0
    st.session_state.attempts = 0
    st.session_state.lives = 3
    st.session_state.questions = generate_questions("math", num_questions=3)
    st.session_state.answers = fetch_answers(st.session_state.questions)

# Main quiz logic
st.title("Dino Game - Quiz Mode")
st.write("Answer the questions to regain lives!")

if st.session_state.lives > 0:  # Check if the player has lives left
    if st.session_state.current_question < len(st.session_state.questions):
        current_quiz = st.session_state.questions[st.session_state.current_question]
        correct_answer = st.session_state.answers.get(st.session_state.current_question, "").lower()

        # Display the question and options
        st.write(f"**Question:** {current_quiz['question']}")
        for option in current_quiz["options"]:
            st.write(option)

        # Input for user answer
        user_answer = st.text_input("Your Answer (e.g., A, B, C, or D)", key=f"q{st.session_state.current_question}")

        if st.button("Submit", key=f"submit_{st.session_state.current_question}"):
            if user_answer:
                print("correct answer", correct_answer)
                print("user answer", user_answer.lower())
                if user_answer.lower() == correct_answer:  # Compare with the correct answer
                    st.success("Correct!")
                    st.session_state.score += 1
                    st.session_state.current_question += 1
                    st.session_state.attempts = 0
                else:
                    st.error("Wrong! Try again.")
                    st.session_state.attempts += 1
                    if st.session_state.attempts >= 3:  # Max retries reached
                        st.warning("Maximum attempts reached! Moving to the next question.")
                        st.session_state.lives -= 1  # Decrease life if wrong attempts exceed limit
                        st.session_state.current_question += 1
                        st.session_state.attempts = 0
            else:
                st.warning("Please enter an answer before submitting.")
    else:
        st.write(f"Quiz completed! **Score:** {st.session_state.score}/{len(st.session_state.questions)}")
        if st.session_state.score == len(st.session_state.questions):
            st.write("You answered all questions correctly! Restoring lives.")
            st.session_state.lives = 3  # Restore lives if all questions were answered correctly
        if st.button("Restart Quiz"):
            reset_quiz()
else:
    st.write("You have no lives left! Returning to the main game.")
    if st.button("Exit Quiz Mode"):
        # Reset quiz and return to main game
        reset_quiz()