Simplified codes

This commit is contained in:
2025-11-27 23:17:03 +03:00
parent 42fa44c3a2
commit cae0d5b946
23 changed files with 2892 additions and 1546 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1,154 +0,0 @@
DANIL - DATABASE DESIGNER MISSION
Your Role: Question Master | Your File: questions.json
💡 What You're Building: You're creating all the quiz questions about Russian culture!
📋 LESSON 1-2: SETUP & BASIC QUESTIONS
Step 1: Fork and Clone (10 minutes)
1. Go to: https://gitea.techshare.cc/technolyceum/ai6-m2
2. Click the "Fork" button (creates your copy)
3. Copy your forked repository URL
4. Open Terminal and type:
git clone [YOUR-FORKED-URL-HERE]
cd ai6-m2
git checkout -b danil-database-work
Step 2: Understand the Question Format (10 minutes)
Open questions.json and look at the example:
[
{
"question": "EXAMPLE: What is the capital of Russia?",
"options": ["St. Petersburg", "Moscow", "Kazan", "Sochi"],
"correct_answer": "Moscow"
}
]
Each question needs:
- question: The actual question text
- options: 4 possible answers (A, B, C, D)
- correct_answer: The right answer (must match exactly)
Step 3: Create Your First 5 Questions (30 minutes)
DELETE everything in questions.json and TYPE THIS instead:
[
{
"question": "What is the capital of Russia?",
"options": ["St. Petersburg", "Moscow", "Kazan", "Sochi"],
"correct_answer": "Moscow"
},
{
"question": "Which Russian composer wrote the music for Swan Lake?",
"options": ["Tchaikovsky", "Rachmaninoff", "Shostakovich", "Stravinsky"],
"correct_answer": "Tchaikovsky"
},
{
"question": "What is the traditional Russian doll called?",
"options": ["Babushka", "Matryoshka", "Krasnaya", "Kukla"],
"correct_answer": "Matryoshka"
},
{
"question": "Which Russian river is the longest in Europe?",
"options": ["Don River", "Volga River", "Yenisei River", "Lena River"],
"correct_answer": "Volga River"
},
{
"question": "What is the name of the Russian space agency?",
"options": ["Rosaviakosmos", "Roscosmos", "Soviet Space Program", "Starfleet Russia"],
"correct_answer": "Roscosmos"
}
]
Save and push:
git add questions.json
git commit -m "feat: added first 5 Russian questions"
git push origin danil-database-work
📋 LESSON 3-4: MORE RUSSIAN CULTURE QUESTIONS
Step 4: Add 5 More Questions (40 minutes)
Add these questions AFTER your first 5 (don't delete the first ones!):
{
"question": "Which Russian leader introduced the policy of perestroika?",
"options": ["Vladimir Putin", "Joseph Stalin", "Mikhail Gorbachev", "Boris Yeltsin"],
"correct_answer": "Mikhail Gorbachev"
},
{
"question": "What is borscht?",
"options": ["A type of Russian bread", "A fermented drink", "A beet soup", "A meat pastry"],
"correct_answer": "A beet soup"
},
{
"question": "Which animal appears on the Russian coat of arms?",
"options": ["Bear", "Eagle", "Wolf", "Lion"],
"correct_answer": "Eagle"
},
{
"question": "What is the currency of Russia?",
"options": ["Ruble", "Krone", "Zloty", "Forint"],
"correct_answer": "Ruble"
},
{
"question": "Which Russian city was formerly called Stalingrad?",
"options": ["Moscow", "Volgograd", "Yekaterinburg", "Kursk"],
"correct_answer": "Volgograd"
}
Save and push:
git add questions.json
git commit -m "feat: added 5 more Russian culture questions"
git push origin danil-database-work
📋 LESSON 5-6: FINAL QUESTIONS & DIFFICULT ONES
Step 5: Add the Last 5 Challenging Questions (40 minutes)
Add these 5 final questions:
{
"question": "What is the name of the famous Russian ballet company?",
"options": ["Moscow Ballet", "Bolshoi Ballet", "St. Petersburg Ballet", "Imperial Russian Ballet"],
"correct_answer": "Bolshoi Ballet"
},
{
"question": "Which Russian scientist created the periodic table of elements?",
"options": ["Mikhail Lomonosov", "Dmitri Mendeleev", "Ivan Pavlov", "Nikola Tesla"],
"correct_answer": "Dmitri Mendeleev"
},
{
"question": "What was Sputnik famous for?",
"options": ["First animal in space", "First human in space", "First satellite in space", "First space station"],
"correct_answer": "First satellite in space"
},
{
"question": "Which Russian mountain range separates Europe from Asia?",
"options": ["Caucasus Mountains", "Ural Mountains", "Altai Mountains", "Sayan Mountains"],
"correct_answer": "Ural Mountains"
},
{
"question": "Who was the first woman in space from Russia?",
"options": ["Svetlana Savitskaya", "Yelena Kondakova", "Valentina Tereshkova", "Anna Kikina"],
"correct_answer": "Valentina Tereshkova"
}
Step 6: Test Your Questions (10 minutes)
Make sure you have exactly 15 questions total!
Final push:
git add questions.json
git commit -m "feat: completed all 15 Russian questions"
git push origin danil-database-work
✅ DANIL'S COMPLETION CHECKLIST
☐ 15 questions total (no more, no less)
☐ All questions about Russian culture/history
☐ Each question has 4 options
☐ Correct answers are accurate
☐ No spelling mistakes
☐ All questions are different topics
☐ All code pushed to your branch
☐ Created Pull Request for teacher to review
🎉 Congratulations Danil! You created the entire question database!

View File

@@ -1,262 +0,0 @@
DIMA - BACKEND DEVELOPER MISSION
Your Role: Game Brain Developer | Your File: app.py
💡 What You're Building: You're creating the "brain" of the game - all the rules, scoring, and game logic!
📋 LESSON 1-2: SETUP & PRIZE SYSTEM
Step 1: Fork and Clone (10 minutes)
1. Go to: https://gitea.techshare.cc/technolyceum/ai6-m2
2. Click the "Fork" button (creates your copy)
3. Copy your forked repository URL
4. Open Terminal and type:
git clone [YOUR-FORKED-URL-HERE]
cd ai6-m2
git checkout -b dima-backend-work
Step 2: Create the Prize Money System (20 minutes)
Open app.py and find these lines around line 8:
# TODO: Dima - Implement prize structure (15 levels)
PRIZE_LEVELS = [
# Format: [1000, 2000, 4000, 8000, 16000, 32000, ... up to 15 values]
]
DELETE those lines and TYPE THIS instead:
PRIZE_LEVELS = [
1000, # Level 1 - Question 1
2000, # Level 2 - Question 2
4000, # Level 3 - Question 3
8000, # Level 4 - Question 4
16000, # Level 5 - Question 5 ✅ Safe level!
32000, # Level 6 - Question 6
64000, # Level 7 - Question 7
128000, # Level 8 - Question 8
256000, # Level 9 - Question 9
512000, # Level 10 - Question 10 ✅ Safe level!
1024000, # Level 11 - Question 11
2048000, # Level 12 - Question 12
4096000, # Level 13 - Question 13
8192000, # Level 14 - Question 14
16384000 # Level 15 - Question 15 🏆 JACKPOT!
]
Save the file and test:
git add app.py
git commit -m "feat: added prize money system"
git push origin dima-backend-work
📋 LESSON 3-4: GAME SESSION & QUESTIONS
Step 3: Make the Game Start Working (25 minutes)
Find these lines around line 25:
@app.route('/start')
def start_game():
# TODO: Dima - Initialize game session
# Set up: score, current_question, lifelines, questions
return render_template('game.html')
DELETE those lines and TYPE THIS instead:
@app.route('/start')
def start_game():
# Initialize a new game session
session['score'] = 0
session['current_question'] = 0
session['guaranteed_prize'] = 0
session['lifelines'] = {
'fifty_fifty': True,
'phone_friend': True
}
session['game_over'] = False
# Load questions and shuffle them
with open('questions.json', 'r') as f:
session['questions'] = json.load(f)
return render_template('game.html')
Step 4: Make Questions Appear (15 minutes)
Find these lines around line 35:
@app.route('/get_question')
def get_question():
# TODO: Dima - Serve questions to frontend
# Return: question, options, question_number, current_prize
return jsonify({"error": "Not implemented"})
DELETE those lines and TYPE THIS instead:
@app.route('/get_question')
def get_question():
if session.get('game_over'):
return jsonify({'error': 'Game over'})
question_index = session.get('current_question', 0)
questions = session.get('questions', [])
if question_index >= len(questions):
session['game_over'] = True
return jsonify({'game_over': True, 'final_score': session['score']})
question = questions[question_index]
current_prize = PRIZE_LEVELS[question_index] if question_index < len(PRIZE_LEVELS) else 0
return jsonify({
'question': question['question'],
'options': question['options'],
'question_number': question_index + 1,
'total_questions': len(questions),
'current_prize': current_prize,
'score': session['score']
})
Save and push:
git add app.py
git commit -m "feat: game start and questions working"
git push origin dima-backend-work
📋 LESSON 5-6: ANSWER CHECKING & LIFELINES
Step 5: Make Answer Checking Work (30 minutes)
Find these lines around line 45:
@app.route('/answer', methods=['POST'])
def check_answer():
# TODO: Dima - Validate answers and update score
# Check if answer is correct, update session, return result
return jsonify({"error": "Not implemented"})
DELETE those lines and TYPE THIS instead:
@app.route('/answer', methods=['POST'])
def check_answer():
if session.get('game_over'):
return jsonify({'error': 'Game over'})
data = request.json
user_answer = data.get('answer')
question_index = session.get('current_question', 0)
questions = session.get('questions', [])
if question_index >= len(questions):
return jsonify({'error': 'No more questions'})
question = questions[question_index]
correct_answer = question['correct_answer']
prize_won = PRIZE_LEVELS[question_index] if question_index < len(PRIZE_LEVELS) else 0
if user_answer == correct_answer:
# Correct answer! Update score
session['score'] = prize_won
# Update guaranteed prize if reached safe level
if (question_index + 1) in GUARANTEED_LEVELS:
session['guaranteed_prize'] = prize_won
session['current_question'] += 1
# Check if game is won
if session['current_question'] >= len(questions):
session['game_over'] = True
return jsonify({
'correct': True,
'score': session['score'],
'prize_won': prize_won,
'game_won': True,
'final_score': session['score']
})
return jsonify({
'correct': True,
'score': session['score'],
'prize_won': prize_won,
'next_question': session['current_question'] < len(questions)
})
else:
# Wrong answer - game over!
session['game_over'] = True
final_prize = session.get('guaranteed_prize', 0)
return jsonify({
'correct': False,
'correct_answer': correct_answer,
'game_over': True,
'final_score': final_prize,
'prize_lost': prize_won
})
Step 6: Create Lifelines (20 minutes)
Find these lines around line 55:
@app.route('/lifeline/<lifeline_name>')
def use_lifeline(lifeline_name):
# TODO: Dima - Implement 50:50 and Phone a Friend
# Note: Ask AI will be version 2
return jsonify({"error": "Not implemented"})
DELETE those lines and TYPE THIS instead:
@app.route('/lifeline/<lifeline_name>')
def use_lifeline(lifeline_name):
if session.get('game_over'):
return jsonify({'error': 'Game over'})
if lifeline_name not in session['lifelines']:
return jsonify({'error': 'Invalid lifeline'})
if not session['lifelines'][lifeline_name]:
return jsonify({'error': 'Lifeline already used'})
question_index = session.get('current_question', 0)
questions = session.get('questions', [])
question = questions[question_index]
if lifeline_name == 'fifty_fifty':
# Remove two wrong answers
correct_answer = question['correct_answer']
options = question['options'].copy()
# Keep correct answer + one wrong answer
remaining_options = [correct_answer]
wrong_options = [opt for opt in options if opt != correct_answer]
remaining_options.append(random.choice(wrong_options))
random.shuffle(remaining_options)
session['lifelines'][lifeline_name] = False
return jsonify({
'lifeline': 'fifty_fifty',
'remaining_options': remaining_options
})
elif lifeline_name == 'phone_friend':
# Phone a friend simulation
correct_answer = question['correct_answer']
friend_names = ["Ivan", "Svetlana", "Dmitri", "Anastasia"]
confidence = random.randint(50, 90)
session['lifelines'][lifeline_name] = False
return jsonify({
'lifeline': 'phone_friend',
'friend_says': f"{random.choice(friend_names)} says: 'I think it's {correct_answer}, but I'm only {confidence}% sure'"
})
Final push:
git add app.py
git commit -m "feat: completed backend with answers and lifelines"
git push origin dima-backend-work
✅ DIMA'S COMPLETION CHECKLIST
☐ Prize money system (15 levels) working
☐ Game starts and creates new session
☐ Questions load from JSON file
☐ Answer checking works (right/wrong)
☐ 50:50 lifeline removes 2 wrong answers
☐ Phone a Friend gives hints
☐ Safe levels save your money at Q5 and Q10
☐ All code pushed to your branch
☐ Created Pull Request for teacher to review
🎉 Congratulations Dima! You built the entire game engine!

View File

@@ -0,0 +1,535 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Build a Russian Millionaire Quiz Game!</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Comic Sans MS', cursive, sans-serif;
}
body {
background: linear-gradient(135deg, #1a2a6c, #b21f1f, #fdbb2d);
color: white;
min-height: 100vh;
padding: 20px;
}
.container {
max-width: 1000px;
margin: 0 auto;
background-color: rgba(0, 0, 0, 0.7);
border-radius: 20px;
padding: 30px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
}
header {
text-align: center;
margin-bottom: 30px;
padding: 20px;
background: linear-gradient(90deg, #1a2a6c, #b21f1f);
border-radius: 15px;
}
h1 {
font-size: 2.5rem;
margin-bottom: 10px;
text-shadow: 3px 3px 5px rgba(0, 0, 0, 0.5);
}
h2 {
color: #fdbb2d;
margin: 20px 0 15px;
border-bottom: 2px solid #fdbb2d;
padding-bottom: 5px;
}
.slide {
display: none;
padding: 20px;
background-color: rgba(255, 255, 255, 0.1);
border-radius: 15px;
margin-bottom: 20px;
animation: fadeIn 0.5s ease-in;
}
.active {
display: block;
}
.content {
line-height: 1.6;
font-size: 1.2rem;
}
.role-box {
background: linear-gradient(135deg, #1a2a6c, #b21f1f);
padding: 15px;
border-radius: 10px;
margin: 15px 0;
border-left: 5px solid #fdbb2d;
}
.role-title {
font-weight: bold;
color: #fdbb2d;
font-size: 1.3rem;
}
.role-desc {
margin-top: 10px;
}
.btn-container {
display: flex;
justify-content: space-between;
margin-top: 30px;
}
button {
background: linear-gradient(135deg, #1a2a6c, #b21f1f);
color: white;
border: none;
padding: 12px 25px;
border-radius: 50px;
font-size: 1.1rem;
cursor: pointer;
transition: all 0.3s;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
}
button:hover {
transform: translateY(-3px);
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4);
}
button:active {
transform: translateY(1px);
}
.progress-bar {
height: 10px;
background-color: rgba(255, 255, 255, 0.2);
border-radius: 5px;
margin: 20px 0;
overflow: hidden;
}
.progress {
height: 100%;
background: linear-gradient(90deg, #1a2a6c, #fdbb2d);
width: 0%;
transition: width 0.5s;
}
.slide-counter {
text-align: center;
margin-top: 10px;
font-size: 1rem;
color: #fdbb2d;
}
.game-preview {
display: flex;
justify-content: center;
margin: 20px 0;
}
.game-screen {
width: 300px;
height: 200px;
background-color: #1a2a6c;
border-radius: 10px;
padding: 15px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
position: relative;
overflow: hidden;
}
.question-box {
background-color: #fdbb2d;
color: #1a2a6c;
padding: 10px;
border-radius: 5px;
text-align: center;
font-weight: bold;
margin-bottom: 15px;
}
.option {
background-color: white;
color: #1a2a6c;
padding: 8px;
margin: 5px 0;
border-radius: 5px;
cursor: pointer;
transition: all 0.2s;
}
.option:hover {
background-color: #b21f1f;
color: white;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.highlight {
color: #fdbb2d;
font-weight: bold;
}
.russian-flag {
display: inline-block;
width: 20px;
height: 15px;
background: linear-gradient(to bottom, white 33%, blue 33%, blue 66%, red 66%);
margin: 0 5px;
vertical-align: middle;
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>Build a Russian Millionaire Quiz Game!</h1>
<p>From Concept to Release in 30 Minutes</p>
</header>
<div class="progress-bar">
<div class="progress" id="progress"></div>
</div>
<!-- Slide 1: Introduction -->
<div class="slide active" id="slide1">
<h2>Welcome, Future Game Developers!</h2>
<div class="content">
<p>Today we're going to create our very own "Who Wants to Be a Millionaire" style quiz game with a Russian twist!</p>
<p>We'll use Python Flask for the website and DeepSeek AI to help with our questions.</p>
<p>By the end of this class, you'll understand how games are made from start to finish!</p>
<div class="game-preview">
<div class="game-screen">
<div class="question-box">What is the capital of Russia?</div>
<div class="option">A. St. Petersburg</div>
<div class="option">B. Moscow <span class="russian-flag"></span></div>
<div class="option">C. Kazan</div>
<div class="option">D. Sochi</div>
</div>
</div>
<p>Let's get started on our game development journey!</p>
</div>
<div class="btn-container">
<button onclick="prevSlide()">Previous</button>
<button onclick="nextSlide()">Next</button>
</div>
<div class="slide-counter">Slide 1 of 8</div>
</div>
<!-- Slide 2: Concept & Research -->
<div class="slide" id="slide2">
<h2>Stage 1: Concept & Research</h2>
<div class="content">
<p>Every great game starts with an idea! Our concept is:</p>
<p class="highlight">"A 'Who Wants to Be a Millionaire' style quiz about Russian culture, history, and fun facts!"</p>
<p>Our research tasks:</p>
<ul>
<li>Learn about the original Millionaire game format</li>
<li>Research interesting Russian trivia</li>
<li>Study how Flask websites work</li>
<li>Explore how AI can help create questions</li>
</ul>
<div class="role-box">
<div class="role-title">Research Specialist</div>
<div class="role-desc">This person will find fun Russian facts and help create our question database.</div>
</div>
<p>Who wants to be our Research Specialist?</p>
</div>
<div class="btn-container">
<button onclick="prevSlide()">Previous</button>
<button onclick="nextSlide()">Next</button>
</div>
<div class="slide-counter">Slide 2 of 8</div>
</div>
<!-- Slide 3: User Stories -->
<div class="slide" id="slide3">
<h2>Stage 2: User Stories</h2>
<div class="content">
<p>User stories help us understand what our players will do in the game:</p>
<ul>
<li>"As a player, I want to see multiple choice questions"</li>
<li>"As a player, I want lifelines like 50:50 and Ask the Audience"</li>
<li>"As a player, I want to see my score increase as I answer correctly"</li>
<li>"As a player, I want fun Russian-themed graphics and sounds"</li>
</ul>
<p>These stories help us plan what features to build!</p>
<div class="game-preview">
<div class="game-screen">
<div class="question-box">Which Russian composer wrote 'Swan Lake'?</div>
<div class="option">A. Tchaikovsky <span class="russian-flag"></span></div>
<div class="option">B. Rachmaninoff</div>
<div class="option">C. Shostakovich</div>
<div class="option">D. Stravinsky</div>
<div style="margin-top: 10px; font-size: 0.8rem;">
Lifelines: 50:50 | Ask AI | Phone a Friend
</div>
</div>
</div>
</div>
<div class="btn-container">
<button onclick="prevSlide()">Previous</button>
<button onclick="nextSlide()">Next</button>
</div>
<div class="slide-counter">Slide 3 of 8</div>
</div>
<!-- Slide 4: Task Allocation -->
<div class="slide" id="slide4">
<h2>Stage 3: Task Allocation</h2>
<div class="content">
<p>Now let's divide the work! We have 4 important roles:</p>
<div class="role-box">
<div class="role-title">Backend Developer</div>
<div class="role-desc">Creates the game logic using Python Flask and connects to the DeepSeek API.</div>
</div>
<div class="role-box">
<div class="role-title">Database Designer</div>
<div class="role-desc">Builds the question database using JSON and works with the Research Specialist.</div>
</div>
<div class="role-box">
<div class="role-title">Frontend Developer</div>
<div class="role-desc">Designs the game screens using HTML, CSS, and JavaScript.</div>
</div>
<div class="role-box">
<div class="role-title">Graphics & Sound Artist</div>
<div class="role-desc">Creates Russian-themed visuals, icons, and sound effects for the game.</div>
</div>
<p>Which role sounds most interesting to you?</p>
</div>
<div class="btn-container">
<button onclick="prevSlide()">Previous</button>
<button onclick="nextSlide()">Next</button>
</div>
<div class="slide-counter">Slide 4 of 8</div>
</div>
<!-- Slide 5: Alpha Development -->
<div class="slide" id="slide5">
<h2>Stage 4: Alpha Development</h2>
<div class="content">
<p>In the Alpha stage, we build the basic version of our game:</p>
<ul>
<li>Backend Developer: Sets up Flask server and basic game routes</li>
<li>Database Designer: Creates JSON file with first 5 Russian trivia questions</li>
<li>Frontend Developer: Builds the question screen with 4 answer options</li>
<li>Graphics Artist: Creates simple Russian-themed background and buttons</li>
</ul>
<p>Our Alpha version will have:</p>
<ul>
<li>Basic question display</li>
<li>Answer selection</li>
<li>Simple scoring</li>
<li>Russian color theme (white, blue, red)</li>
</ul>
<p>Let's build our foundation!</p>
</div>
<div class="btn-container">
<button onclick="prevSlide()">Previous</button>
<button onclick="nextSlide()">Next</button>
</div>
<div class="slide-counter">Slide 5 of 8</div>
</div>
<!-- Slide 6: Beta Development -->
<div class="slide" id="slide6">
<h2>Stage 5: Beta Development</h2>
<div class="content">
<p>In the Beta stage, we add more features and polish:</p>
<ul>
<li>Backend Developer: Implements lifelines and connects to DeepSeek API</li>
<li>Database Designer: Expands to 15 questions with difficulty levels</li>
<li>Frontend Developer: Adds lifeline buttons and score display</li>
<li>Graphics Artist: Creates matryoshka doll icons and Russian landmark images</li>
</ul>
<p>Our Beta version will have:</p>
<ul>
<li>All 15 questions with increasing difficulty</li>
<li>50:50 and "Ask AI" lifelines</li>
<li>Better visuals with Russian themes</li>
<li>Sound effects for correct/incorrect answers</li>
</ul>
<div class="game-preview">
<div class="game-screen">
<div class="question-box">What is the traditional Russian doll called?</div>
<div class="option">A. Babushka</div>
<div class="option">B. Matryoshka <span class="russian-flag"></span></div>
<div class="option">C. Krasnaya</div>
<div class="option">D. Kukla</div>
<div style="margin-top: 10px; font-size: 0.8rem; text-align: center;">
Score: 1,000 RUB | Lifelines: <span style="color: #fdbb2d">50:50</span> | Ask AI |
</div>
</div>
</div>
</div>
<div class="btn-container">
<button onclick="prevSlide()">Previous</button>
<button onclick="nextSlide()">Next</button>
</div>
<div class="slide-counter">Slide 6 of 8</div>
</div>
<!-- Slide 7: Production & Testing -->
<div class="slide" id="slide7">
<h2>Stage 6: Production & Testing</h2>
<div class="content">
<p>Time to test our game and fix any issues!</p>
<p>Testing tasks:</p>
<ul>
<li>Play the game multiple times to find bugs</li>
<li>Check if all questions display correctly</li>
<li>Test the lifelines - do they work properly?</li>
<li>Make sure the scoring system is accurate</li>
<li>Verify the AI integration gives helpful hints</li>
</ul>
<p>After testing, we'll:</p>
<ul>
<li>Fix any problems we find</li>
<li>Add final polish to graphics and sounds</li>
<li>Prepare for our game launch!</li>
</ul>
<p>Who wants to be our Chief Tester?</p>
</div>
<div class="btn-container">
<button onclick="prevSlide()">Previous</button>
<button onclick="nextSlide()">Next</button>
</div>
<div class="slide-counter">Slide 7 of 8</div>
</div>
<!-- Slide 8: Release & Celebration -->
<div class="slide" id="slide8">
<h2>Stage 7: Release & Celebration!</h2>
<div class="content">
<p>Congratulations! Our Russian Millionaire Quiz Game is ready!</p>
<p>What we've accomplished:</p>
<ul>
<li>Created a working quiz game with 15 Russian trivia questions</li>
<li>Built a Flask website with game logic</li>
<li>Integrated DeepSeek AI for lifelines</li>
<li>Designed Russian-themed graphics and sounds</li>
<li>Tested and polished our game</li>
</ul>
<p>Now it's time to:</p>
<ul>
<li>Share our game with friends and family</li>
<li>Celebrate our success!</li>
<li>Think about what game we want to make next</li>
</ul>
<div class="game-preview">
<div class="game-screen" style="text-align: center; display: flex; flex-direction: column; justify-content: center;">
<div style="font-size: 1.5rem; color: #fdbb2d; margin-bottom: 10px;">YOU WIN!</div>
<div>1,000,000 RUB</div>
<div style="margin-top: 15px; font-size: 0.9rem;">Congratulations, Millionaire!</div>
</div>
</div>
<p>Great job, game developers! You've successfully created your first AI-powered quiz game!</p>
</div>
<div class="btn-container">
<button onclick="prevSlide()">Previous</button>
<button onclick="restartPresentation()">Start Over</button>
</div>
<div class="slide-counter">Slide 8 of 8</div>
</div>
</div>
<script>
let currentSlide = 1;
const totalSlides = 8;
function updateProgress() {
const progress = (currentSlide / totalSlides) * 100;
document.getElementById('progress').style.width = `${progress}%`;
}
function showSlide(n) {
// Hide all slides
const slides = document.getElementsByClassName('slide');
for (let i = 0; i < slides.length; i++) {
slides[i].classList.remove('active');
}
// Show the current slide
document.getElementById(`slide${n}`).classList.add('active');
// Update progress bar
updateProgress();
}
function nextSlide() {
if (currentSlide < totalSlides) {
currentSlide++;
showSlide(currentSlide);
}
}
function prevSlide() {
if (currentSlide > 1) {
currentSlide--;
showSlide(currentSlide);
}
}
function restartPresentation() {
currentSlide = 1;
showSlide(currentSlide);
}
// Initialize the presentation
document.addEventListener('DOMContentLoaded', function() {
showSlide(1);
updateProgress();
});
</script>
</body>
</html>

View File

@@ -1,349 +0,0 @@
INNA - FRONTEND DEVELOPER MISSION
Your Role: Game Interface Designer | Your Files: templates/ and static/script.js
💡 What You're Building: You're creating what players see and click on!
📋 LESSON 1-2: SETUP & BASIC GAME FLOW
Step 1: Fork and Clone (10 minutes)
1. Go to: https://gitea.techshare.cc/technolyceum/ai6-m2
2. Click the "Fork" button (creates your copy)
3. Copy your forked repository URL
4. Open Terminal and type:
git clone [YOUR-FORKED-URL-HERE]
cd ai6-m2
git checkout -b inna-frontend-work
Step 2: Make the Game Load Questions (30 minutes)
Open static/script.js and find the loadQuestion function.
DELETE these lines:
function loadQuestion() {
fetch('/get_question')
.then(response => response.json())
.then(data => {
if (data.error) {
console.error(data.error);
return;
}
if (data.game_over) {
endGame(data.final_score);
return;
}
gameState.currentQuestion = data;
displayQuestion(data);
})
.catch(error => console.error('Error:', error));
}
TYPE THIS instead:
function loadQuestion() {
fetch('/get_question')
.then(response => response.json())
.then(data => {
if (data.error) {
alert("Game error: " + data.error);
return;
}
if (data.game_over) {
endGame(data.final_score);
return;
}
gameState.currentQuestion = data;
displayQuestion(data);
})
.catch(error => {
alert("Network error - check if server is running!");
console.error('Error:', error);
});
}
Step 3: Make Questions Display Properly (20 minutes)
Find the displayQuestion function.
DELETE these lines:
function displayQuestion(questionData) {
document.getElementById('question-num').textContent = questionData.question_number;
document.getElementById('question-text').textContent = questionData.question;
const optionsContainer = document.getElementById('options-container');
optionsContainer.innerHTML = '';
const optionLetters = ['A', 'B', 'C', 'D'];
questionData.options.forEach((option, index) => {
const optionElement = document.createElement('div');
optionElement.className = 'option';
optionElement.textContent = `${optionLetters[index]}. ${option}`;
optionElement.onclick = () => selectAnswer(option);
optionsContainer.appendChild(optionElement);
});
document.getElementById('feedback').style.display = 'none';
gameState.optionsDisabled = false;
}
TYPE THIS instead:
function displayQuestion(questionData) {
// Update question number and text
document.getElementById('question-num').textContent = questionData.question_number;
document.getElementById('question-text').textContent = questionData.question;
document.getElementById('current-prize').textContent = questionData.current_prize;
// Clear previous options
const optionsContainer = document.getElementById('options-container');
optionsContainer.innerHTML = '';
// Create new option buttons
const optionLetters = ['A', 'B', 'C', 'D'];
questionData.options.forEach((option, index) => {
const optionElement = document.createElement('div');
optionElement.className = 'option';
optionElement.textContent = `${optionLetters[index]}. ${option}`;
optionElement.onclick = () => selectAnswer(option);
optionsContainer.appendChild(optionElement);
});
// Reset feedback and enable clicking
document.getElementById('feedback').style.display = 'none';
document.getElementById('feedback').className = 'feedback';
gameState.optionsDisabled = false;
// Clear lifeline result
document.getElementById('lifeline-result').textContent = '';
}
Save and push:
git add static/script.js
git commit -m "feat: basic question loading working"
git push origin inna-frontend-work
📋 LESSON 3-4: ANSWER HANDLING
Step 4: Make Answer Selection Work (30 minutes)
Find the selectAnswer function.
DELETE these lines:
function selectAnswer(selectedAnswer) {
if (gameState.optionsDisabled) return;
gameState.optionsDisabled = true;
fetch('/answer', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ answer: selectedAnswer })
})
.then(response => response.json())
.then(data => {
const feedback = document.getElementById('feedback');
feedback.style.display = 'block';
if (data.correct) {
feedback.textContent = 'Correct! 🎉';
feedback.className = 'feedback correct';
setTimeout(() => {
if (data.next_question) loadQuestion();
else endGame(data.final_score, true);
}, 1500);
} else {
feedback.textContent = `Incorrect! Correct answer: ${data.correct_answer}`;
feedback.className = 'feedback incorrect';
setTimeout(() => endGame(data.final_score), 2000);
}
})
.catch(error => console.error('Error:', error));
}
TYPE THIS instead:
function selectAnswer(selectedAnswer) {
// Prevent double-clicking
if (gameState.optionsDisabled) return;
gameState.optionsDisabled = true;
// Disable all options while checking
document.querySelectorAll('.option').forEach(btn => {
btn.style.pointerEvents = 'none';
});
// Send answer to server
fetch('/answer', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ answer: selectedAnswer })
})
.then(response => response.json())
.then(data => {
const feedback = document.getElementById('feedback');
feedback.style.display = 'block';
if (data.correct) {
feedback.textContent = 'Correct! 🎉 +' + data.prize_won + ' ₽';
feedback.className = 'feedback correct';
// Wait then load next question or end game
setTimeout(() => {
if (data.game_won) {
endGame(data.final_score, true);
} else if (data.next_question) {
loadQuestion();
} else {
endGame(data.final_score);
}
}, 2000);
} else {
feedback.textContent = `Incorrect! Correct answer was: ${data.correct_answer}`;
feedback.className = 'feedback incorrect';
// Highlight correct answer in green
document.querySelectorAll('.option').forEach(btn => {
if (btn.textContent.includes(data.correct_answer)) {
btn.style.background = '#4CAF50';
btn.style.color = 'white';
}
});
setTimeout(() => endGame(data.final_score), 3000);
}
})
.catch(error => {
alert("Error sending answer!");
console.error('Error:', error);
});
}
Step 5: Make Lifelines Work (20 minutes)
Find the useLifeline function.
DELETE these lines:
function useLifeline(lifelineName) {
fetch(`/lifeline/${lifelineName}`)
.then(response => response.json())
.then(data => {
if (data.error) {
alert(data.error);
return;
}
document.getElementById('lifeline-result').textContent =
data.hint || data.friend_says || 'Lifeline used!';
})
.catch(error => console.error('Error:', error));
}
TYPE THIS instead:
function useLifeline(lifelineName) {
// Disable the lifeline button
document.querySelector(`button[onclick="useLifeline('${lifelineName}')"]`).disabled = true;
fetch(`/lifeline/${lifelineName}`)
.then(response => response.json())
.then(data => {
if (data.error) {
alert(data.error);
document.querySelector(`button[onclick="useLifeline('${lifelineName}')"]`).disabled = false;
return;
}
const resultElement = document.getElementById('lifeline-result');
if (lifelineName === 'fifty_fifty') {
// Hide the wrong options
document.querySelectorAll('.option').forEach(option => {
const optionText = option.textContent.substring(3); // Remove "A. ", "B. ", etc.
if (!data.remaining_options.includes(optionText)) {
option.style.display = 'none';
}
});
resultElement.textContent = 'Two wrong answers removed!';
} else if (lifelineName === 'phone_friend') {
resultElement.textContent = data.friend_says;
}
})
.catch(error => {
alert("Lifeline error!");
console.error('Error:', error);
});
}
Save and push:
git add static/script.js
git commit -m "feat: answer handling and lifelines working"
git push origin inna-frontend-work
📋 LESSON 5-6: GAME FLOW COMPLETION
Step 6: Complete the Game Flow (40 minutes)
Find the endGame function.
DELETE these lines:
function endGame(finalScore, isWin = false) {
document.getElementById('final-prize').textContent = finalScore;
document.getElementById('game-over-screen').style.display = 'block';
document.querySelector('.game-area').style.display = 'none';
}
TYPE THIS instead:
function endGame(finalScore, isWin = false) {
const finalPrizeElement = document.getElementById('final-prize');
const gameOverScreen = document.getElementById('game-over-screen');
const gameOverTitle = document.getElementById('game-over-title');
const gameOverMessage = document.getElementById('game-over-message');
finalPrizeElement.textContent = finalScore.toLocaleString();
if (isWin) {
gameOverTitle.innerHTML = '🎉 YOU WIN! 🎉';
gameOverTitle.style.color = '#fdbb2d';
gameOverMessage.textContent = 'Congratulations! You won the top prize!';
} else if (finalScore > 0) {
gameOverTitle.textContent = 'Game Over!';
gameOverTitle.style.color = '#1a2a6c';
gameOverMessage.textContent = 'You reached a guaranteed prize level!';
} else {
gameOverTitle.textContent = 'Game Over!';
gameOverTitle.style.color = '#b21f1f';
gameOverMessage.textContent = 'Better luck next time!';
}
gameOverScreen.style.display = 'block';
document.querySelector('.game-area').style.display = 'none';
}
Also update the restartGame function:
DELETE this line:
function restartGame() {
window.location.href = '/start';
}
TYPE THIS instead:
function restartGame() {
// Reload the page to start fresh
window.location.reload();
}
Final push:
git add static/script.js
git commit -m "feat: completed frontend game flow"
git push origin inna-frontend-work
✅ INNA'S COMPLETION CHECKLIST
☐ Questions load and display correctly
☐ Answer buttons work and show feedback
☐ Prize money updates when answering
☐ 50:50 lifeline hides wrong answers
☐ Phone a Friend shows hints
☐ Game over screen shows correct messages
☐ Restart button works
☐ All code pushed to your branch
☐ Created Pull Request for teacher to review
🎉 Congratulations Inna! You built the entire game interface!

File diff suppressed because it is too large Load Diff

View File

@@ -1,510 +0,0 @@
{\rtf1\ansi\ansicpg1252\cocoartf2818
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 AppleColorEmoji;\f2\fnil\fcharset0 AppleSymbols;
\f3\fnil\fcharset0 LucidaGrande;}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
\paperw11900\paperh16840\margl1440\margr1440\vieww11900\viewh14080\viewkind1
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\f0\fs24 \cf0 # Teacher - Complete Project Manager Guide.txt\
\
```\
TEACHER - COMPLETE PROJECT MANAGER GUIDE\
Russian Millionaire Quiz Game - 6 Lesson Project\
\
\f1 \uc0\u55357 \u56523
\f0 YOUR ROLES:\
\'95 Team Lead - Guide students through development\
\'95 Git Master - Manage repositories and merges\
\'95 User Tester - Verify all components work\
\'95 Integration Manager - Combine all student work\
\
\f1 \uc0\u55356 \u57263
\f0 PROJECT TIMELINE (6 Lessons)\
\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
LESSON 1-2: SETUP & FOUNDATION\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
STUDENT GOALS:\
\'95 Dima: Implement prize money system in app.py\
\'95 Danil: Create first 5 Russian culture questions\
\'95 Inna: Make basic question loading work\
\'95 Artyom: Start Russian color theme in CSS\
\
TEACHER TASKS:\
\
\f1 \uc0\u9989
\f0 Setup Verification:\
1. Ensure main repo is ready: \
https://gitea.techshare.cc/technolyceum/ai6-m2\
\
2. Verify all students have:\
\f2 \uc0\u9744
\f0 Forked the repository\
\f2 \uc0\u9744
\f0 Created their role-specific branch\
\f2 \uc0\u9744
\f0 Made first commit\
\
3. Quick Progress Check (Terminal):\
```bash\
# Check each student's fork manually in Gitea web interface\
# Look for 4 branches: \
# - dima-backend-work\
# - inna-frontend-work \
# - danil-database-work\
# - artyom-graphics-work\
```\
\
\f1 \uc0\u9989
\f0 Individual Progress Checks:\
```bash\
# Temporary check for each student:\
git clone [STUDENT-FORK-URL] temp-check\
cd temp-check\
git checkout [THEIR-BRANCH]\
\
# Dima Check:\
grep -A 15 "PRIZE_LEVELS" app.py\
\
# Danil Check:\
python3 -c "import json; print('Questions:', len(json.load(open('questions.json'))))"\
\
# Inna Check:\
grep -c "function" static/script.js\
\
# Artyom Check:\
grep -c "background" static/style.css\
\
cd ..\
rm -rf temp-check\
```\
\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
LESSON 3-4: CORE DEVELOPMENT\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
STUDENT GOALS:\
\'95 Dima: Game session & question loading\
\'95 Danil: 10+ questions completed \
\'95 Inna: Answer handling system\
\'95 Artyom: Enhanced question/option styling\
\
TEACHER TASKS:\
\
\f1 \uc0\u9989
\f0 Daily Monitoring:\
\f2 \uc0\u9744
\f0 All students have pushed latest work\
\f2 \uc0\u9744
\f0 No Git conflicts detected\
\f2 \uc0\u9744
\f0 Students approximately 60% complete\
\
\f1 \uc0\u9989
\f0 Progress Verification Commands:\
```bash\
# Dima - Session Management:\
grep -A 10 "session\\[" app.py\
\
# Danil - Question Count:\
python3 -c "import json; data=json.load(open('questions.json')); print(f'Total: \{len(data)\} questions')"\
\
# Inna - Answer Handling:\
grep -A 5 "selectAnswer" static/script.js\
\
# Artyom - Enhanced Styling:\
grep -c "border-radius.*15\\|box-shadow" static/style.css\
```\
\
\f1 \uc0\u9989
\f0 Early Integration Test:\
```bash\
# Test backend basics:\
python3 app.py\
# Open http://localhost:5000\
# Check: Home page loads? /start works?\
```\
\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
LESSON 5-6: FEATURE COMPLETION & TESTING\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
STUDENT GOALS:\
\'95 Dima: Answer checking & lifelines complete\
\'95 Danil: All 15 questions finished\
\'95 Inna: Lifelines & game flow working\
\'95 Artyom: Complete visual design\
\
TEACHER TASKS:\
\
\f1 \uc0\u9989
\f0 Final Progress Check:\
\f2 \uc0\u9744
\f0 All features implemented\
\f2 \uc0\u9744
\f0 Students created Pull Requests\
\f2 \uc0\u9744
\f0 Ready for final integration\
\
\f1 \uc0\u9989
\f0 PR Review Checklist:\
\
DIMA'S BACKEND PR:\
\f2 \uc0\u9744
\f0 All routes work (/start, /get_question, /answer, /lifeline)\
\f2 \uc0\u9744
\f0 Prize system calculates correctly\
\f2 \uc0\u9744
\f0 No syntax errors in app.py\
\
DANIL'S DATABASE PR:\
\f2 \uc0\u9744
\f0 Exactly 15 questions\
\f2 \uc0\u9744
\f0 Russian culture themes\
\f2 \uc0\u9744
\f0 No spelling errors\
\f2 \uc0\u9744
\f0 Plausible wrong answers\
\
INNA'S FRONTEND PR:\
\f2 \uc0\u9744
\f0 Questions display correctly\
\f2 \uc0\u9744
\f0 Answer selection works\
\f2 \uc0\u9744
\f0 Lifelines functional\
\f2 \uc0\u9744
\f0 Game flow complete\
\
ARTYOM'S GRAPHICS PR:\
\f2 \uc0\u9744
\f0 Russian color theme throughout\
\f2 \uc0\u9744
\f0 Professional styling\
\f2 \uc0\u9744
\f0 Good user experience\
\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
FINAL INTEGRATION & MERGING\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
\f1 \uc0\u9989
\f0 Merge Strategy (Do in Gitea Web Interface):\
1. FIRST: Danil's questions.json (database)\
2. SECOND: Dima's app.py (backend)\
3. THIRD: Artyom's static/style.css (styling) \
4. FOURTH: Inna's templates/ and static/script.js (frontend)\
\
Merge Commands (Gitea Web):\
\'95 Go to each PR\
\'95 Click "Merge Pull Request"\
\'95 Resolve conflicts if needed (prioritize more complete code)\
\
\f1 \uc0\u9989
\f0 Final Integration Test:\
```bash\
# After all merges:\
git clone https://gitea.techshare.cc/technolyceum/ai6-m2.git final-game\
cd final-game\
\
# Install dependencies:\
pip install flask\
\
# Test complete application:\
python3 app.py\
\
# Manual Testing Checklist:\
\f2 \uc0\u9744
\f0 Home page loads with Russian theme\
\f2 \uc0\u9744
\f0 Start game button works\
\f2 \uc0\u9744
\f0 Questions display with styling\
\f2 \uc0\u9744
\f0 Answer selection works\
\f2 \uc0\u9744
\f0 Prize money updates correctly\
\f2 \uc0\u9744
\f0 50:50 lifeline removes wrong answers\
\f2 \uc0\u9744
\f0 Phone a Friend gives hints\
\f2 \uc0\u9744
\f0 Game over screen appears\
\f2 \uc0\u9744
\f0 Restart button works\
\f2 \uc0\u9744
\f0 No console errors in browser\
```\
\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
TROUBLESHOOTING GUIDE\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
COMMON ISSUES & SOLUTIONS:\
\
\f1 \uc0\u10060
\f0 "ModuleNotFoundError: No module named 'flask'"\
\f1 \uc0\u9989
\f0 Solution: pip install flask\
\
\f1 \uc0\u10060
\f0 JSON syntax error in questions.json\
\f1 \uc0\u9989
\f0 Solution: Use https://jsonlint.com to validate\
\
\f1 \uc0\u10060
\f0 Game starts but no questions appear\
\f1 \uc0\u9989
\f0 Solution: Check browser console for errors, verify backend routes\
\
\f1 \uc0\u10060
\f0 CSS not loading\
\f1 \uc0\u9989
\f0 Solution: Check static file paths, clear browser cache\
\
\f1 \uc0\u10060
\f0 Git merge conflicts\
\f1 \uc0\u9989
\f0 Solution: Manually resolve in Gitea, prioritize more complete implementation\
\
\f1 \uc0\u10060
\f0 Student stuck on task\
\f1 \uc0\u9989
\f0 Solution: Use exact code from their instruction sheet\
\
\f1 \uc0\u10060
\f0 Prize money not updating\
\f1 \uc0\u9989
\f0 Solution: Check Dima's PRIZE_LEVELS array and answer validation\
\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
ASSESSMENT RUBRIC\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
GRADING (25 points per student):\
\
BACKEND (DIMA):\
\f2 \uc0\u9744
\f0 Prize system implemented (5pts)\
\f2 \uc0\u9744
\f0 Game session management (5pts)\
\f2 \uc0\u9744
\f0 Question serving (5pts)\
\f2 \uc0\u9744
\f0 Answer validation (5pts)\
\f2 \uc0\u9744
\f0 Lifeline functionality (5pts)\
\
DATABASE (DANIL):\
\f2 \uc0\u9744
\f0 15 questions total (5pts)\
\f2 \uc0\u9744
\f0 Russian culture theme (5pts)\
\f2 \uc0\u9744
\f0 Accurate answers (5pts)\
\f2 \uc0\u9744
\f0 Good wrong options (5pts)\
\f2 \uc0\u9744
\f0 No errors (5pts)\
\
FRONTEND (INNA):\
\f2 \uc0\u9744
\f0 Question display (5pts)\
\f2 \uc0\u9744
\f0 Answer handling (5pts)\
\f2 \uc0\u9744
\f0 Game flow (5pts)\
\f2 \uc0\u9744
\f0 Lifeline integration (5pts)\
\f2 \uc0\u9744
\f0 Error handling (5pts)\
\
GRAPHICS (ARTYOM):\
\f2 \uc0\u9744
\f0 Russian theme (5pts)\
\f2 \uc0\u9744
\f0 Professional styling (5pts)\
\f2 \uc0\u9744
\f0 User experience (5pts)\
\f2 \uc0\u9744
\f0 Consistency (5pts)\
\f2 \uc0\u9744
\f0 Visual appeal (5pts)\
\
EXTRA CREDIT (5pts):\
\f2 \uc0\u9744
\f0 Early completion\
\f2 \uc0\u9744
\f0 Extra features\
\f2 \uc0\u9744
\f0 Exceptional quality\
\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
QUICK REFERENCE COMMANDS\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
```bash\
# Check any student's progress:\
git clone [STUDENT-FORK-URL] temp\
cd temp && git checkout [BRANCH]\
\
# Backend check:\
grep -A 15 "PRIZE_LEVELS" app.py\
\
# Database check:\
python3 -c "import json; print(len(json.load(open('questions.json'))))"\
\
# Frontend check:\
grep -c "function" static/script.js\
\
# Graphics check:\
grep -c "gradient" static/style.css\
\
# Test integrated game:\
python3 app.py\
# Open: http://localhost:5000\
```\
\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
FINAL TEACHER CHECKLIST\
\uc0\u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \u9473 \
\
BEFORE PROJECT:\
\f2 \uc0\u9744
\f0 Main repo prepared with boilerplate\
\f2 \uc0\u9744
\f0 Students understand fork workflow\
\f2 \uc0\u9744
\f0 Instruction sheets distributed\
\
DURING PROJECT:\
\f2 \uc0\u9744
\f0 Daily progress monitoring\
\f2 \uc0\u9744
\f0 Individual student support\
\f3 \uc0\u65533 \u65039
\f0 Regular Git status checks\
\
AFTER PROJECT:\
\f2 \uc0\u9744
\f0 All PRs reviewed and merged\
\f2 \uc0\u9744
\f0 Final integration tested\
\f2 \uc0\u9744
\f0 Game fully functional\
\f2 \uc0\u9744
\f0 Grades assigned using rubric\
\f2 \uc0\u9744
\f0 Student achievements celebrated!
\f1 \uc0\u55356 \u57225
\f0 \
\
\f1 \uc0\u55356 \u57225
\f0 CONGRATULATIONS! You successfully guided a complete software development project from concept to working application!\
```\
\
This single file contains everything you need as project manager - timeline, monitoring commands, troubleshooting, assessment, and final integration steps all in one printable document!}

Binary file not shown.

125
app.py
View File

@@ -1,44 +1,141 @@
from flask import Flask, render_template, request, jsonify, session
import json
import random
import os
app = Flask(__name__)
app.secret_key = 'quizimoto_secret_key'
# TODO: Dima - Implement prize structure (15 levels)
# Load questions from file
with open('questions.json', 'r') as f:
questions_data = json.load(f)
# Prize structure (15 levels)
PRIZE_LEVELS = [
# Format: [1000, 2000, 4000, 8000, 16000, 32000, ... up to 15 values]
100, 200, 300, 500, 1000,
2000, 4000, 8000, 16000, 32000,
64000, 125000, 250000, 500000, 1000000
]
GUARANTEED_LEVELS = [5, 10] # First and second guaranteed levels
def get_current_question():
"""Get current question data from session"""
current_q_index = session.get('current_question', 0)
questions = session.get('questions', [])
if current_q_index >= len(questions):
return None
return questions[current_q_index], current_q_index
def calculate_guaranteed_prize(current_index):
"""Calculate the guaranteed prize based on current question index"""
final_score = 0
for level in sorted(GUARANTEED_LEVELS, reverse=True):
if current_index + 1 >= level:
final_score = PRIZE_LEVELS[level - 1] if level <= len(PRIZE_LEVELS) else 0
break
return final_score
@app.route('/')
def index():
return render_template('index.html')
@app.route('/start')
def start_game():
# TODO: Dima - Initialize game session
# Set up: score, current_question, lifelines, questions
# Initialize game session
session['score'] = 0
session['current_question'] = 0
session['lifelines'] = ['fifty_fifty']
session['questions'] = random.sample(questions_data, min(15, len(questions_data))) # Select up to 15 random questions
return render_template('game.html')
@app.route('/get_question')
def get_question():
# TODO: Dima - Serve questions to frontend
# Return: question, options, question_number, current_prize
return jsonify({"error": "Not implemented"})
current_q_index = session.get('current_question', 0)
# Check if game is over (15 questions answered or no more questions)
if current_q_index >= len(session.get('questions', [])) or current_q_index >= 15:
return jsonify({
"game_over": True,
"final_score": session.get('score', 0)
})
question_data = session['questions'][current_q_index]
return jsonify({
"question_number": current_q_index + 1,
"question": question_data['question'],
"options": question_data['options'],
"current_prize": PRIZE_LEVELS[current_q_index] if current_q_index < len(PRIZE_LEVELS) else 1000000,
"game_over": False
})
@app.route('/answer', methods=['POST'])
def check_answer():
# TODO: Dima - Validate answers and update score
# Check if answer is correct, update session, return result
return jsonify({"error": "Not implemented"})
data = request.get_json()
answer = data.get('answer', '')
question_info = get_current_question()
if not question_info:
return jsonify({"error": "No more questions"})
question_data, current_q_index = question_info
correct = answer == question_data['correct_answer']
if correct:
session['current_q_index'] = current_q_index + 1
session['score'] = PRIZE_LEVELS[current_q_index] if current_q_index < len(PRIZE_LEVELS) else session.get('score', 0)
# Check if game is won (15th question answered correctly)
game_won = session['current_question'] >= min(15, len(session.get('questions', [])))
return jsonify({
"correct": True,
"correct_answer": question_data['correct_answer'],
"final_score": session['score'],
"game_over": game_won
})
else:
# Game over with last guaranteed prize
final_score = calculate_guaranteed_prize(current_q_index)
return jsonify({
"correct": False,
"correct_answer": question_data['correct_answer'],
"final_score": final_score,
"game_over": True
})
@app.route('/lifeline/<lifeline_name>')
def use_lifeline(lifeline_name):
# TODO: Dima - Implement 50:50 and Phone a Friend
# Note: Ask AI will be version 2
return jsonify({"error": "Not implemented"})
if lifeline_name != 'fifty_fifty':
return jsonify({"error": "Unknown lifeline"})
if 'fifty_fifty' not in session.get('lifelines', []):
return jsonify({"error": "Lifeline already used"})
question_info = get_current_question()
if not question_info:
return jsonify({"error": "No current question"})
# Remove the lifeline from available lifelines
session['lifelines'].remove('fifty_fifty')
question_data, _ = question_info
correct_answer = question_data['correct_answer']
options = question_data['options']
# Find indices of wrong answers to remove (we need to remove 2)
wrong_indices = [i for i, option in enumerate(options) if option != correct_answer]
# Randomly select 2 wrong indices to remove
indices_to_remove = random.sample(wrong_indices, min(2, len(wrong_indices)))
indices_to_remove.sort(reverse=True) # Sort in descending order for safe removal
return jsonify({
"remove_indices": indices_to_remove
})
if __name__ == '__main__':
app.run(debug=True)

BIN
docs/.DS_Store vendored Normal file

Binary file not shown.

19
docs/README.md Normal file
View File

@@ -0,0 +1,19 @@
# Project Documentation
This directory contains all the documentation for the Millionaire Quiz Game project.
## Structure
- [/roles](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/docs/roles) - Role-specific instructions and guidelines for team members
- [/technical-specs](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/docs/technical-specs) - Technical specifications and architecture documents
## Role Documentation
Each team member has their own instruction file:
- [Frontend Developer (Inna)](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/docs/roles/frontend-developer-inna.md)
- [Backend Developer (Dima)](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/docs/roles/backend-developer-dima.md)
- [Database Designer (Danil)](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/docs/roles/database-designer-danil.md)
- [Graphics Designer (Artyom)](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/docs/roles/graphics-designer-artyom.md)
These documents contain step-by-step instructions for implementing various parts of the application.

View File

@@ -0,0 +1,176 @@
DIMA - BACKEND DEVELOPER MISSION
Your Role: Game Brain Developer | Your File: app.py
💡 What You're Building: You're creating the "brain" of the game - all the rules, scoring, and game logic!
📋 LESSON 1-2: SETUP & PRIZE SYSTEM
Step 1: Fork and Clone (10 minutes)
1. Go to: https://gitea.techshare.cc/technolyceum/ai6-m2
2. Click the "Fork" button (creates your copy)
3. Copy your forked repository URL
4. Open Terminal and type:
git clone [YOUR-FORKED-URL-HERE]
cd ai6-m2
git checkout -b dima-backend-work
Step 2: Create the Prize Money System (20 minutes)
Open app.py and find these lines around line 13:
# Prize structure (15 levels)
PRIZE_LEVELS = [
100, 200, 300, 500, 1000,
2000, 4000, 8000, 16000, 32000,
64000, 125000, 250000, 500000, 1000000
]
This is already implemented! Notice how the prizes increase as the player progresses through the questions.
Step 3: Review Game Session Management (15 minutes)
Look at the [start_game](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/app.py#L42-L48) function (around line 42):
```python
@app.route('/start')
def start_game():
# Initialize game session
session['score'] = 0
session['current_question'] = 0
session['lifelines'] = ['fifty_fifty']
session['questions'] = random.sample(questions_data, min(15, len(questions_data)))
return render_template('game.html')
```
This function initializes the game session with:
- Starting score of 0
- Current question index of 0
- One lifeline available: fifty_fifty
- A random selection of up to 15 questions from the database
📋 LESSON 3-4: QUESTION RETRIEVAL & ANSWER VALIDATION
Step 4: Review Question Retrieval (15 minutes)
Check the [get_question](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/app.py#L50-L66) function (around line 50):
```python
@app.route('/get_question')
def get_question():
current_q_index = session.get('current_question', 0)
# Check if game is over
if current_q_index >= min(15, len(session.get('questions', []))):
return jsonify({
"game_over": True,
"final_score": session.get('score', 0)
})
question_data = session['questions'][current_q_index]
return jsonify({
"question_number": current_q_index + 1,
"question": question_data['question'],
"options": question_data['options'],
"current_prize": PRIZE_LEVELS[current_q_index] if current_q_index < len(PRIZE_LEVELS) else 1000000,
"game_over": False
})
```
This function retrieves the current question and formats it for the frontend.
Step 5: Review Answer Validation (20 minutes)
Look at the [check_answer](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/app.py#L68-L103) function (around line 68):
```python
@app.route('/answer', methods=['POST'])
def check_answer():
data = request.get_json()
answer = data.get('answer', '')
question_info = get_current_question()
if not question_info:
return jsonify({"error": "No more questions"})
question_data, current_q_index = question_info
correct = answer == question_data['correct_answer']
if correct:
session['current_question'] = current_q_index + 1
session['score'] = PRIZE_LEVELS[current_q_index] if current_q_index < len(PRIZE_LEVELS) else session.get('score', 0)
# Check if game is won (15th question answered correctly)
game_won = session['current_question'] >= min(15, len(session.get('questions', [])))
return jsonify({
"correct": True,
"correct_answer": question_data['correct_answer'],
"final_score": session['score'],
"game_over": game_won
})
else:
# Game over with last guaranteed prize
final_score = calculate_guaranteed_prize(current_q_index)
return jsonify({
"correct": False,
"correct_answer": question_data['correct_answer'],
"final_score": final_score,
"game_over": True
})
```
Notice the helper functions:
- [get_current_question()](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/app.py#L20-L28) - Gets the current question data from session
- [calculate_guaranteed_prize()](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/app.py#L30-L37) - Calculates prize based on guaranteed levels
📋 LESSON 5-6: LIFELINES & REFACTORING
Step 6: Review Lifeline Implementation (15 minutes)
Check the [use_lifeline](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/app.py#L105-L133) function (around line 105):
```python
@app.route('/lifeline/<lifeline_name>')
def use_lifeline(lifeline_name):
if lifeline_name != 'fifty_fifty':
return jsonify({"error": "Unknown lifeline"})
if 'fifty_fifty' not in session.get('lifelines', []):
return jsonify({"error": "Lifeline already used"})
question_info = get_current_question()
if not question_info:
return jsonify({"error": "No current question"})
# Remove the lifeline from available lifelines
session['lifelines'].remove('fifty_fifty')
question_data, _ = question_info
correct_answer = question_data['correct_answer']
options = question_data['options']
# Find indices of wrong answers to remove (we need to remove 2)
wrong_indices = [i for i, option in enumerate(options) if option != correct_answer]
# Randomly select 2 wrong indices to remove
indices_to_remove = random.sample(wrong_indices, min(2, len(wrong_indices)))
indices_to_remove.sort(reverse=True) # Sort in descending order for safe removal
return jsonify({
"remove_indices": indices_to_remove
})
```
Notice the improvements:
- Uses list comprehension for finding wrong indices
- Uses helper functions to reduce code duplication
- Has clear error handling
✅ DIMA'S COMPLETION CHECKLIST
☐ Understand the prize system structure
☐ Review game session initialization
☐ Understand question retrieval logic
☐ Review answer validation process
☐ Understand lifeline implementation
☐ Recognize the use of helper functions for DRY code
☐ All code pushed to your branch
☐ Created Pull Request for teacher to review
🎉 Congratulations Dima! You built the entire game backend!

View File

@@ -0,0 +1,83 @@
DANIL - DATABASE DESIGNER MISSION
Your Role: Question Master | Your File: questions.json
💡 What You're Building: You're creating all the quiz questions about Russian culture!
📋 LESSON 1-2: SETUP & BASIC QUESTIONS
Step 1: Fork and Clone (10 minutes)
1. Go to: https://gitea.techshare.cc/technolyceum/ai6-m2
2. Click the "Fork" button (creates your copy)
3. Copy your forked repository URL
4. Open Terminal and type:
git clone [YOUR-FORKED-URL-HERE]
cd ai6-m2
git checkout -b danil-database-work
Step 2: Review the Question Format (10 minutes)
Open questions.json and look at the example:
```json
[
{
"question": "What is the capital of Russia?",
"options": ["St. Petersburg", "Moscow", "Kazan", "Sochi"],
"correct_answer": "Moscow"
},
{
"question": "Which Russian author wrote 'War and Peace'?",
"options": ["Dostoevsky", "Tolstoy", "Pushkin", "Chekhov"],
"correct_answer": "Tolstoy"
}
]
```
Each question needs:
- question: The actual question text
- options: 4 possible answers (A, B, C, D)
- correct_answer: The right answer (must match exactly one of the options)
Step 3: Understand the Current Implementation (15 minutes)
Notice that the current implementation:
- Has properly formatted JSON (no comments)
- Has 5 sample questions about Russian culture
- Follows the correct structure for integration with the backend
📋 LESSON 3-4: EXPANDING THE DATABASE
Step 4: Add More Questions (30 minutes)
Add at least 10 more questions to reach a total of 15. Here are some examples:
```json
{
"question": "What is the traditional Russian soup made with beets?",
"options": ["Shchi", "Borscht", "Solyanka", "Ukha"],
"correct_answer": "Borscht"
},
{
"question": "Which Russian ruler was known as 'The Terrible'?",
"options": ["Peter I", "Catherine II", "Ivan IV", "Nicholas II"],
"correct_answer": "Ivan IV"
},
{
"question": "What is the name of the famous Russian ballet company?",
"options": ["Moscow Ballet", "St. Petersburg Ballet", "Bolshoi Ballet", "Russian National Ballet"],
"correct_answer": "Bolshoi Ballet"
}
```
Requirements for new questions:
- Make sure questions cover different aspects of Russian culture (history, literature, food, arts, geography)
- Ensure plausible wrong answers that are not obviously incorrect
- Verify that the correct_answer exactly matches one of the options
✅ DANIL'S COMPLETION CHECKLIST
☐ Understand the question format
☐ Review current implementation
☐ Add 10+ more questions about Russian culture
☐ Verify all questions follow the correct structure
☐ Check that correct_answer matches exactly one option
☐ All code pushed to your branch
☐ Created Pull Request for teacher to review
🎉 Congratulations Danil! You built the entire question database!

View File

@@ -0,0 +1,216 @@
INNA - FRONTEND DEVELOPER MISSION
Your Role: Game Interface Designer | Your Files: templates/ and static/script.js
💡 What You're Building: You're creating what players see and click on!
📋 LESSON 1-2: SETUP & BASIC GAME FLOW
Step 1: Fork and Clone (10 minutes)
1. Go to: https://gitea.techshare.cc/technolyceum/ai6-m2
2. Click the "Fork" button (creates your copy)
3. Copy your forked repository URL
4. Open Terminal and type:
git clone [YOUR-FORKED-URL-HERE]
cd ai6-m2
git checkout -b inna-frontend-work
Step 2: Review Question Loading (15 minutes)
Open static/script.js and look at the [loadQuestion](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/static/script.js#L9-L19) function:
```javascript
function loadQuestion() {
apiRequest('/get_question')
.then(data => {
if (data.game_over) {
endGame(data.final_score);
return;
}
currentQuestion = data;
displayQuestion(data);
})
.catch(error => console.error('Error:', error));
}
```
Notice how it uses the [apiRequest](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/static/script.js#L5-L12) utility function for cleaner code.
Step 3: Review Question Display (15 minutes)
Look at the [displayQuestion](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/static/script.js#L21-L41) function:
```javascript
function displayQuestion(data) {
updateElementText('q-number', data.question_number);
updateElementText('question-text', data.question);
updateElementText('prize', data.current_prize);
const optionsContainer = document.getElementById('options');
optionsContainer.innerHTML = '';
data.options.forEach((option, index) => {
const optionElement = document.createElement('div');
optionElement.className = 'option';
optionElement.textContent = option;
optionElement.onclick = () => selectAnswer(option);
optionsContainer.appendChild(optionElement);
});
// Reset result display
toggleElementVisibility('result', false);
const result = document.getElementById('result');
if (result) {
result.className = 'result';
}
}
```
Notice the utility functions:
- [updateElementText()](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/static/script.js#L14-L19) - Simplifies updating element text
- [toggleElementVisibility()](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/static/script.js#L21-L27) - Standardizes showing/hiding elements
📋 LESSON 3-4: ANSWER HANDLING & LIFELINES
Step 4: Review Answer Selection (15 minutes)
Check the [selectAnswer](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/static/script.js#L43-L72) function:
```javascript
function selectAnswer(answer) {
apiRequest('/answer', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ answer: answer })
})
.then(data => {
const result = document.getElementById('result');
if (result) {
result.style.display = 'block';
if (data.correct) {
result.textContent = 'Correct!';
result.className = 'result correct';
setTimeout(() => {
if (data.game_over) {
endGame(data.final_score);
} else {
loadQuestion();
}
}, 1500);
} else {
result.textContent = `Wrong! Correct answer: ${data.correct_answer}`;
result.className = 'result incorrect';
setTimeout(() => {
endGame(data.final_score);
}, 2000);
}
}
})
.catch(error => console.error('Error:', error));
}
```
Step 5: Review Lifeline Implementation (15 minutes)
Look at the [useFiftyFifty](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/static/script.js#L74-L100) function:
```javascript
function useFiftyFifty() {
const lifelineBtn = document.querySelector('.lifeline');
if (lifelineBtn) {
lifelineBtn.disabled = true;
}
apiRequest('/lifeline/fifty_fifty')
.then(data => {
if (data.error) {
alert(data.error);
if (lifelineBtn) {
lifelineBtn.disabled = false;
}
return;
}
// Hide two wrong options
const options = document.querySelectorAll('.option');
data.remove_indices.forEach(index => {
if (options[index]) {
options[index].style.display = 'none';
}
});
})
.catch(error => {
console.error('Error:', error);
if (lifelineBtn) {
lifelineBtn.disabled = false;
}
});
}
```
Notice the improvements:
- Uses the [apiRequest](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/static/script.js#L5-L12) utility function
- Has proper error handling with element checks
- Cleaner, more maintainable code
Step 6: Review Utility Functions (10 minutes)
At the top of script.js, notice the utility functions that make the code DRY:
```javascript
// Utility function for making API requests
function apiRequest(url, options = {}) {
return fetch(url, options)
.then(response => response.json())
.catch(error => {
console.error('Error:', error);
throw error;
});
}
// Utility function for updating element text content
function updateElementText(id, text) {
const element = document.getElementById(id);
if (element) {
element.textContent = text;
}
}
// Utility function for showing/hiding elements
function toggleElementVisibility(id, show = true) {
const element = document.getElementById(id);
if (element) {
element.style.display = show ? 'block' : 'none';
}
}
```
📋 LESSON 5-6: GAME FLOW COMPLETION
Step 7: Review Game End and Restart (10 minutes)
Look at the [endGame](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/static/script.js#L102-L108) and [restartGame](file:///Users/home/YandexDisk/TECHNOLYCEUM/ict_repos/ai6-m2/static/script.js#L110-L112) functions:
```javascript
function endGame(score) {
updateElementText('final-prize', score);
toggleElementVisibility('game-over', true);
toggleElementVisibility('question-box', false);
toggleElementVisibility('lifeline', false);
}
function restartGame() {
window.location.href = '/start';
}
```
Notice how they use the utility functions to simplify the code.
✅ INNA'S COMPLETION CHECKLIST
☐ Review question loading implementation
☐ Understand question display logic
☐ Review answer handling process
☐ Understand lifeline implementation
☐ Recognize utility functions for DRY code
☐ Review game flow completion
☐ All code pushed to your branch
☐ Created Pull Request for teacher to review
🎉 Congratulations Inna! You built the entire game interface!

View File

@@ -51,21 +51,21 @@ header {
TYPE THIS instead:
header {
text-align: center;
margin-bottom: 30px;
/* Keep container styling from current implementation */
.container {
background: rgba(255, 255, 255, 0.9);
color: #333;
padding: 20px;
background: linear-gradient(90deg, #1a2a6c, #b21f1f);
border-radius: 15px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
border: 2px solid #fdbb2d;
border-radius: 10px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
margin: 15px 0;
}
h1 {
font-size: 3rem;
margin-bottom: 10px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
color: #fdbb2d;
color: #1a237e;
text-align: center;
font-size: 2.5rem;
margin: 20px 0;
}
Save and push:
@@ -80,11 +80,20 @@ Find the question-container section.
DELETE these lines:
.question-container {
background: rgba(255, 255, 255, 0.1);
padding: 20px;
.question-box {
background: rgba(255, 255, 255, 0.9);
color: #333;
padding: 15px;
border-radius: 8px;
margin-bottom: 20px;
margin: 15px 0;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}
.question {
font-size: 1.4rem;
margin-bottom: 15px;
text-align: center;
font-weight: bold;
}
TYPE THIS instead:
@@ -122,17 +131,27 @@ Find the option styling.
DELETE these lines:
.option {
background: #fdbb2d;
color: #1a2a6c;
padding: 15px;
background: #2196f3;
color: white;
padding: 12px;
border-radius: 5px;
cursor: pointer;
text-align: center;
margin: 5px 0;
transition: background 0.3s;
font-weight: bold;
}
.option:hover {
background: #e6a923;
background: #1976d2;
}
.option.correct {
background: #4caf50;
}
.option.wrong {
background: #f44336;
}
TYPE THIS instead:
@@ -196,62 +215,42 @@ DELETE these lines:
TYPE THIS instead:
.lifelines {
background: rgba(255, 255, 255, 0.15);
padding: 20px;
border-radius: 15px;
border: 1px solid rgba(253, 187, 45, 0.3);
margin-top: 20px;
.result.correct {
background: #c8e6c9;
color: #2e7d32;
padding: 10px;
border-radius: 5px;
margin: 10px 0;
}
.lifelines h3 {
color: #fdbb2d;
text-align: center;
margin-bottom: 15px;
font-size: 1.3rem;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
.result.incorrect {
background: #ffcdd2;
color: #c62828;
padding: 10px;
border-radius: 5px;
margin: 10px 0;
}
.lifeline-buttons {
display: flex;
gap: 15px;
justify-content: center;
flex-wrap: wrap;
}
.lifeline-btn {
background: linear-gradient(135deg, #1a2a6c, #2a3a8c);
.lifeline {
background: #ff9800;
color: white;
border: none;
padding: 12px 20px;
border-radius: 25px;
border-radius: 5px;
cursor: pointer;
display: block;
margin: 15px auto;
font-weight: bold;
transition: all 0.3s ease;
border: 2px solid #fdbb2d;
min-width: 120px;
transition: background 0.3s;
}
.lifeline-btn:hover:not(:disabled) {
background: linear-gradient(135deg, #2a3a8c, #1a2a6c);
transform: translateY(-2px);
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
.lifeline:hover {
background: #f57c00;
}
.lifeline-btn:disabled {
background: #666;
.lifeline:disabled {
background: #ccc;
cursor: not-allowed;
opacity: 0.6;
}
.lifeline-result {
background: rgba(253, 187, 45, 0.2);
padding: 15px;
border-radius: 10px;
margin-top: 15px;
text-align: center;
border: 1px solid #fdbb2d;
font-style: italic;
}
Step 7: Make Game Over Screen Epic (20 minutes)
@@ -268,46 +267,38 @@ TYPE THIS instead:
.game-over-screen {
text-align: center;
padding: 40px;
background: rgba(255, 255, 255, 0.15);
border-radius: 20px;
border: 3px solid #fdbb2d;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
max-width: 500px;
margin: 0 auto;
padding: 30px;
background: white;
border-radius: 10px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
margin: 15px 0;
}
.game-over-screen h2 {
font-size: 3rem;
margin-bottom: 20px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
color: #d32f2f;
font-size: 2rem;
margin-bottom: 15px;
}
.game-over-screen p {
font-size: 1.3rem;
margin-bottom: 25px;
color: #fdbb2d;
font-weight: bold;
font-size: 1.2rem;
margin-bottom: 20px;
color: #333;
}
.game-over-screen button {
background: linear-gradient(135deg, #1a2a6c, #b21f1f);
background: #d32f2f;
color: white;
border: none;
padding: 15px 30px;
border-radius: 25px;
font-size: 1.2rem;
padding: 12px 24px;
border-radius: 5px;
font-size: 1rem;
cursor: pointer;
transition: all 0.3s ease;
border: 2px solid #fdbb2d;
font-weight: bold;
transition: background 0.3s;
}
.game-over-screen button:hover {
background: linear-gradient(135deg, #b21f1f, #1a2a6c);
transform: translateY(-3px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
background: #b71c1c;
}
Final push:

View File

@@ -0,0 +1,262 @@
# Teacher - Complete Project Manager Guide
## YOUR ROLES:
- Team Lead - Guide students through development
- Git Master - Manage repositories and merges
- User Tester - Verify all components work
- Integration Manager - Combine all student work
## PROJECT TIMELINE (6 Lessons)
=========================================
## LESSON 1-2: SETUP & FOUNDATION
=========================================
### STUDENT GOALS:
- Dima: Implement prize money system and game logic in app.py
- Danil: Create first 5 Russian culture questions
- Inna: Make basic question loading and display work
- Artyom: Start Russian color theme in CSS
### TEACHER TASKS:
✅ Setup Verification:
1. Ensure main repo is ready:
https://gitea.techshare.cc/technolyceum/ai6-m2
2. Verify all students have:
- Forked the repository
- Created their role-specific branch
- Made first commit
3. Quick Progress Check (Terminal):
```bash
# Check each student's fork manually in Gitea web interface
# Look for 4 branches:
# - dima-backend-work
# - inna-frontend-work
# - danil-database-work
# - artyom-graphics-work
```
✅ Individual Progress Checks:
```bash
# Temporary check for each student:
git clone [STUDENT-FORK-URL] temp-check
cd temp-check
git checkout [THEIR-BRANCH]
# Dima Check:
grep -A 15 "PRIZE_LEVELS" app.py
# Danil Check:
python3 -c "import json; print('Questions:', len(json.load(open('questions.json'))))"
# Inna Check:
grep -c "function" static/script.js
# Artyom Check:
grep -c "background" static/style.css
cd ..
rm -rf temp-check
```
=========================================
## LESSON 3-4: CORE DEVELOPMENT
=========================================
### STUDENT GOALS:
- Dima: Complete game session management and answer validation
- Danil: 10+ questions completed
- Inna: Answer handling system and lifelines
- Artyom: Enhanced question/option styling
### TEACHER TASKS:
✅ Code Review Workshop:
Show examples of DRY (Don't Repeat Yourself) principles:
**Before (repetitive code):**
```javascript
document.getElementById('q-number').textContent = data.question_number;
document.getElementById('question-text').textContent = data.question;
document.getElementById('prize').textContent = data.current_prize;
```
**After (DRY code with utility functions):**
```javascript
updateElementText('q-number', data.question_number);
updateElementText('question-text', data.question);
updateElementText('prize', data.current_prize);
```
✅ Git Workshop:
```bash
# Help students resolve merge conflicts:
git fetch origin
git checkout main
git pull origin main
git checkout [THEIR-BRANCH]
git merge main
# If conflicts occur:
# 1. Edit conflicted files
# 2. Remove conflict markers
# 3. git add .
# 4. git commit
```
=========================================
## LESSON 5-6: INTEGRATION & TESTING
=========================================
### STUDENT GOALS:
- Dima: Finalize lifelines and error handling
- Danil: Complete 15 questions with difficulty progression
- Inna: Complete game flow and end game screens
- Artyom: Polish all visual elements and animations
### FINAL INTEGRATION:
✅ Integration Steps:
1. Merge all branches to main:
```bash
# On main branch:
git merge dima-backend-work
git merge danil-database-work
git merge inna-frontend-work
git merge artyom-graphics-work
```
2. Resolve any conflicts
3. Test complete game flow:
- Start game from index.html
- Play through all questions
- Test lifelines
- Verify scoring system
- Check end game states
✅ Final Testing Checklist:
- [ ] All 15 questions load correctly
- [ ] Answer validation works
- [ ] Scoring system functions properly
- [ ] Lifelines function correctly
- [ ] Game over states work (win/lose)
- [ ] Restart functionality works
- [ ] Responsive design on different screens
- [ ] No console errors in browser
=========================================
## PROJECT ARCHITECTURE OVERVIEW
=========================================
### File Structure:
```
/ai6-m2
├── app.py # Flask backend (Dima)
├── questions.json # Question database (Danil)
├── static/
│ ├── script.js # Frontend logic (Inna)
│ └── style.css # Styling (Artyom)
├── templates/
│ ├── index.html # Landing page
│ └── game.html # Game interface
├── docs/
│ ├── roles/ # Role-specific instructions
│ └── technical-specs/ # Technical documentation
└── README.md # Project overview
```
### Technical Implementation:
**Backend (app.py):**
- Flask routes for game operations
- Session management for game state
- JSON data handling for questions
- Helper functions for DRY code
**Frontend (script.js):**
- API communication with backend
- DOM manipulation for game interface
- Utility functions for common operations
- Event handling for user interactions
**Database (questions.json):**
- JSON format for easy parsing
- Structured question data with options
- Correct answer validation
**Styling (style.css):**
- Responsive design principles
- Russian-themed color scheme
- Component-based styling approach
=========================================
## TROUBLESHOOTING GUIDE
=========================================
### Common Issues and Solutions:
1. **"TypeError: Cannot read properties of undefined"**
- Usually caused by API returning error instead of data
- Solution: Check backend implementation and JSON formatting
2. **Lifelines not working**
- Check session management for lifeline state
- Verify frontend-backend communication
3. **Scoring issues**
- Verify prize structure in backend
- Check guaranteed level calculations
4. **Git merge conflicts**
- Use systematic approach to resolve conflicts
- Communicate with team members about changes
### Verification Commands:
```bash
# Run the application
export FLASK_APP=app.py
python -m flask run
# Check for syntax errors
python -m py_compile app.py
npx eslint static/script.js
# Validate JSON
python -m json.tool questions.json
```
=========================================
## ASSESSMENT CRITERIA
=========================================
### Technical Skills:
- Code quality and organization (20%)
- Implementation of requirements (30%)
- Problem-solving and debugging (20%)
- Git usage and collaboration (15%)
- Documentation and comments (15%)
### Collaboration:
- Team communication
- Code review participation
- Helpfulness to teammates
- Integration contribution
### Final Product:
- Game functions without errors
- All features implemented
- Visually appealing interface
- Good user experience
🎉 Congratulations on completing the Russian Millionaire Quiz Game project!

36
gitea passwords.rtf Normal file
View File

@@ -0,0 +1,36 @@
{\rtf1\ansi\ansicpg1252\cocoartf2818
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 .SFNS-Regular_wdth_opsz110000_GRAD_wght2580000;}
{\colortbl;\red255\green255\blue255;\red19\green21\blue25;\red255\green255\blue255;}
{\*\expandedcolortbl;;\cssrgb\c9412\c10980\c12941;\cssrgb\c100000\c100000\c100000;}
\paperw11900\paperh16840\margl1440\margr1440\vieww11900\viewh14080\viewkind1
\deftab720
\pard\pardeftab720\partightenfactor0
\f0\b\fs32 \cf2 \cb3 \expnd0\expndtw0\kerning0
Inna\
ai6s4\
ai6s4@ict.ru\
\pard\pardeftab720\partightenfactor0
\cf2 Passwords: Student123!\
\
\cf2 \
\pard\pardeftab720\partightenfactor0
\cf2 Daniel\
ai6s3\
ai6s3@ict.ru\
\pard\pardeftab720\partightenfactor0
\cf2 Passwords: Student123!\cf2 \
\pard\pardeftab720\partightenfactor0
\cf2 \
\
Artyom\
ai6s2\
ai6s2@ict.ru\
\pard\pardeftab720\partightenfactor0
\cf2 Passwords: Student123!\cf2 \
\pard\pardeftab720\partightenfactor0
\cf2 \
Dima\
ai6s1\
ai6s1@ict.ru\
Passwords: Student123!}

View File

@@ -1,12 +1,27 @@
[
{
"question": "EXAMPLE: What is the capital of Russia?",
"question": "What is the capital of Russia?",
"options": ["St. Petersburg", "Moscow", "Kazan", "Sochi"],
"correct_answer": "Moscow"
},
{
"question": "TODO: Danil - Add Russian culture question here",
"options": ["Option A", "Option B", "Option C", "Option D"],
"correct_answer": "Correct Answer"
"question": "Which Russian author wrote 'War and Peace'?",
"options": ["Dostoevsky", "Tolstoy", "Pushkin", "Chekhov"],
"correct_answer": "Tolstoy"
},
{
"question": "What is the traditional Russian soup made with beets?",
"options": ["Shchi", "Borscht", "Solyanka", "Ukha"],
"correct_answer": "Borscht"
},
{
"question": "Which Russian ruler was known as 'The Terrible'?",
"options": ["Peter I", "Catherine II", "Ivan IV", "Nicholas II"],
"correct_answer": "Ivan IV"
},
{
"question": "What is the name of the famous Russian ballet company?",
"options": ["Moscow Ballet", "St. Petersburg Ballet", "Bolshoi Ballet", "Russian National Ballet"],
"correct_answer": "Bolshoi Ballet"
}
]

View File

@@ -1 +1,2 @@
# requirements.txt
Flask==2.3.3

View File

@@ -1,104 +1,149 @@
// TODO: Inna - Implement frontend game functionality
// script.js
let currentQuestion = null;
let gameState = {
currentQuestion: null,
optionsDisabled: false
};
// Utility function for making API requests
function apiRequest(url, options = {}) {
return fetch(url, options)
.then(response => response.json())
.catch(error => {
console.error('Error:', error);
throw error;
});
}
// Utility function for updating element text content
function updateElementText(id, text) {
const element = document.getElementById(id);
if (element) {
element.textContent = text;
}
}
// Utility function for showing/hiding elements
function toggleElementVisibility(id, show = true) {
const element = document.getElementById(id);
if (element) {
element.style.display = show ? 'block' : 'none';
}
}
function loadQuestion() {
fetch('/get_question')
.then(response => response.json())
apiRequest('/get_question')
.then(data => {
if (data.error) {
console.error(data.error);
return;
}
if (data.game_over) {
endGame(data.final_score);
return;
}
gameState.currentQuestion = data;
currentQuestion = data;
displayQuestion(data);
})
.catch(error => console.error('Error:', error));
}
function displayQuestion(questionData) {
document.getElementById('question-num').textContent = questionData.question_number;
document.getElementById('question-text').textContent = questionData.question;
function displayQuestion(data) {
updateElementText('q-number', data.question_number);
updateElementText('question-text', data.question);
updateElementText('prize', data.current_prize);
const optionsContainer = document.getElementById('options-container');
const optionsContainer = document.getElementById('options');
optionsContainer.innerHTML = '';
const optionLetters = ['A', 'B', 'C', 'D'];
questionData.options.forEach((option, index) => {
data.options.forEach((option, index) => {
const optionElement = document.createElement('div');
optionElement.className = 'option';
optionElement.textContent = `${optionLetters[index]}. ${option}`;
optionElement.textContent = option;
optionElement.onclick = () => selectAnswer(option);
optionsContainer.appendChild(optionElement);
});
document.getElementById('feedback').style.display = 'none';
gameState.optionsDisabled = false;
// Reset result display
toggleElementVisibility('result', false);
const result = document.getElementById('result');
if (result) {
result.className = 'result';
}
}
function selectAnswer(selectedAnswer) {
if (gameState.optionsDisabled) return;
gameState.optionsDisabled = true;
fetch('/answer', {
function selectAnswer(answer) {
apiRequest('/answer', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ answer: selectedAnswer })
body: JSON.stringify({ answer: answer })
})
.then(response => response.json())
.then(data => {
const feedback = document.getElementById('feedback');
feedback.style.display = 'block';
const result = document.getElementById('result');
if (result) {
result.style.display = 'block';
if (data.correct) {
feedback.textContent = 'Correct! 🎉';
feedback.className = 'feedback correct';
result.textContent = 'Correct!';
result.className = 'result correct';
setTimeout(() => {
if (data.next_question) loadQuestion();
else endGame(data.final_score, true);
if (data.game_over) {
endGame(data.final_score);
} else {
loadQuestion();
}
}, 1500);
} else {
feedback.textContent = `Incorrect! Correct answer: ${data.correct_answer}`;
feedback.className = 'feedback incorrect';
setTimeout(() => endGame(data.final_score), 2000);
result.textContent = `Wrong! Correct answer: ${data.correct_answer}`;
result.className = 'result incorrect';
setTimeout(() => {
endGame(data.final_score);
}, 2000);
}
}
})
.catch(error => console.error('Error:', error));
}
function useLifeline(lifelineName) {
fetch(`/lifeline/${lifelineName}`)
.then(response => response.json())
function useFiftyFifty() {
const lifelineBtn = document.querySelector('.lifeline');
if (lifelineBtn) {
lifelineBtn.disabled = true;
}
apiRequest('/lifeline/fifty_fifty')
.then(data => {
if (data.error) {
alert(data.error);
if (lifelineBtn) {
lifelineBtn.disabled = false;
}
return;
}
document.getElementById('lifeline-result').textContent =
data.hint || data.friend_says || 'Lifeline used!';
// Hide two wrong options
const options = document.querySelectorAll('.option');
data.remove_indices.forEach(index => {
if (options[index]) {
options[index].style.display = 'none';
}
});
})
.catch(error => console.error('Error:', error));
.catch(error => {
console.error('Error:', error);
if (lifelineBtn) {
lifelineBtn.disabled = false;
}
});
}
function endGame(finalScore, isWin = false) {
document.getElementById('final-prize').textContent = finalScore;
document.getElementById('game-over-screen').style.display = 'block';
document.querySelector('.game-area').style.display = 'none';
function endGame(score) {
updateElementText('final-prize', score);
toggleElementVisibility('game-over', true);
toggleElementVisibility('question-box', false);
toggleElementVisibility('lifeline', false);
}
function restartGame() {
window.location.href = '/start';
}
document.addEventListener('DOMContentLoaded', function() {
// Start the game when page loads
if (window.location.pathname === '/start') {
loadQuestion();
}
});

View File

@@ -1,105 +1,109 @@
/* TODO: Artyom - Enhance this CSS with Russian-themed design */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: Arial, sans-serif;
}
/* style.css */
body {
background: #1a2a6c;
color: white;
min-height: 100vh;
font-family: Arial, sans-serif;
max-width: 600px;
margin: 0 auto;
padding: 20px;
background: #f0f0f0;
}
.container {
max-width: 800px;
margin: 0 auto;
background: rgba(255, 255, 255, 0.1);
border-radius: 10px;
background: white;
padding: 20px;
}
header {
text-align: center;
margin-bottom: 20px;
padding: 15px;
background: #b21f1f;
border-radius: 8px;
border-radius: 10px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
h1 {
font-size: 2.5rem;
color: #1a237e;
text-align: center;
}
.score {
text-align: center;
font-size: 1.2em;
margin: 10px 0;
color: #d32f2f;
}
.question-box {
background: #e3f2fd;
padding: 15px;
border-radius: 8px;
margin: 15px 0;
}
.question-number {
font-weight: bold;
margin-bottom: 10px;
}
.question-container {
background: rgba(255, 255, 255, 0.1);
padding: 20px;
border-radius: 8px;
margin-bottom: 20px;
}
.question {
font-size: 1.3rem;
margin-bottom: 20px;
text-align: center;
font-size: 1.1em;
margin-bottom: 15px;
}
.options-container {
.options {
display: grid;
gap: 10px;
gap: 8px;
}
.option {
background: #fdbb2d;
color: #1a2a6c;
padding: 15px;
background: #2196f3;
color: white;
padding: 10px;
border-radius: 5px;
cursor: pointer;
text-align: center;
font-weight: bold;
}
.option:hover {
background: #e6a923;
background: #1976d2;
}
.lifelines {
background: rgba(255, 255, 255, 0.1);
padding: 15px;
border-radius: 8px;
.option.correct {
background: #4caf50;
}
.lifeline-buttons {
display: flex;
gap: 10px;
justify-content: center;
.option.wrong {
background: #f44336;
}
.lifeline-btn {
background: #1a2a6c;
.result {
margin-top: 10px;
padding: 10px;
border-radius: 5px;
text-align: center;
display: none;
}
.result.correct {
background: #c8e6c9;
color: #2e7d32;
}
.result.incorrect {
background: #ffcdd2;
color: #c62828;
}
.start-btn, .lifeline {
background: #ff9800;
color: white;
border: none;
padding: 10px 15px;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
}
.start-btn {
background: #fdbb2d;
color: #1a2a6c;
border: none;
padding: 15px 30px;
border-radius: 25px;
font-size: 1.2rem;
cursor: pointer;
display: block;
margin: 20px auto;
margin: 10px auto;
}
.game-over-screen {
text-align: center;
padding: 30px;
.lifeline:disabled {
background: #ccc;
cursor: not-allowed;
}
.game-over {
text-align: center;
padding: 20px;
}

View File

@@ -1,43 +1,33 @@
<!-- game.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Quizimoto - Game</title>
<title>Russian Quiz - Game</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<div class="container">
<header>
<h1>Quizimoto</h1>
<div class="score-display">Prize: <span id="current-prize">0</span></div>
</header>
<h1>Russian Quiz</h1>
<div class="score">Prize: <span id="prize">0</span></div>
<div class="game-area">
<div class="question-container">
<div class="question-number">Question <span id="question-num">1</span>/15</div>
<div class="question" id="question-text">Loading question...</div>
<div class="question-box">
<div class="question-number">Question <span id="q-number">1</span>/5</div>
<div class="question" id="question-text">Loading...</div>
<div class="options-container" id="options-container">
<!-- Options will be loaded by JavaScript -->
<div class="options" id="options">
<!-- Options go here -->
</div>
<div class="feedback" id="feedback"></div>
<div class="result" id="result"></div>
</div>
<div class="lifelines">
<h3>Lifelines</h3>
<div class="lifeline-buttons">
<button class="lifeline-btn" onclick="useLifeline('fifty_fifty')">50:50</button>
<button class="lifeline-btn" onclick="useLifeline('phone_friend')">Phone a Friend</button>
</div>
<div id="lifeline-result" class="lifeline-result"></div>
</div>
</div>
<button class="lifeline" onclick="useFiftyFifty()">50:50 Lifeline</button>
<div class="game-over-screen" id="game-over-screen" style="display: none;">
<div class="game-over" id="game-over" style="display: none;">
<h2>Game Over!</h2>
<p>Your final prize: <span id="final-prize">0</span></p>
<p>You won: <span id="final-prize">0</span></p>
<button onclick="restartGame()">Play Again</button>
</div>
</div>

View File

@@ -1,25 +1,18 @@
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Quizimoto - Russian Millionaire Quiz</title>
<title>Russian Quiz Game</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<div class="container">
<header>
<h1>Quizimoto</h1>
<p>Russian Millionaire Quiz Game</p>
</header>
<div class="welcome-content">
<h2>Welcome!</h2>
<p>Test your knowledge of Russian culture and win up to 1,000,000 ₽!</p>
<h1>Russian Quiz</h1>
<p>Answer questions about Russian culture!</p>
<button onclick="startGame()" class="start-btn">Start Game</button>
</div>
</div>
<script>
function startGame() {