Содержание курса Python · все модули
Мини-проект: Квиз с рейтингом — Python
Курсы Python Мини-проект: Квиз с рейтингом Мини-проект: Квиз с рейтингом Введение
Пора создать настоящую игру! В этом проекте мы построим интерактивный квиз с системой подсчёта очков и таблицей лидеров. Игроки будут отвечать на вопросы, зарабатывать баллы и соревноваться за место в рейтинге.
Этот проект объединяет: списки, словари, циклы, условия и работу с данными.
Цель проекта
Создать программу, которая:
Хранит банк вопросов в структурированном виде.
Задаёт вопросы игроку и проверяет ответы.
Ведёт подсчёт очков.
Поддерживает таблицу лидеров с именами и результатами.
Использует меню для навигации.
Что понадобится
Списки и словари для хранения вопросов и рейтинга.
Циклы for и while для прохождения квиза.
Условия if / elif / else для проверки ответов.
Словари для таблицы лидеров.
Собственные функции (def) для организации меню и логики игры.
Кратко о функциях (def)
Чтобы код квиза был понятнее, мы оформим части программы в функции — именованные блоки кода. Синтаксис:
def имя_функции ():
# код с отступом
print ( "Действие" )
# Вызов функции
имя_функции ()
Функции show_menu(), play_quiz() и show_leaderboard() помогают разделить логику: меню, прохождение квиза и показ рейтинга. Подробнее о функциях — в модулях 22–26 .
Этап 1. Банк вопросов
Начнём с создания структуры данных для хранения вопросов. Каждый вопрос будет словарём с полями: текст вопроса, варианты ответов и правильный ответ.
# Банк вопросов
questions = [
{
"question" : "Сколько планет в Солнечной системе?" ,
"options" : [ "7" , "8" , "9" , "10" ] ,
"correct" : "8"
} ,
{
"question" : "Какая столица Франции?" ,
"options" : [ "Лондон" , "Берлин" , "Париж" , "Мадрид" ] ,
"correct"
Этап 2. Задаём вопросы в цикле
Теперь создадим цикл, который будет задавать вопросы по очереди и получать ответы от игрока.
questions = [
{
"question" : "Сколько планет в Солнечной системе?" ,
"options" : [ "7" , "8" , "9" , "10" ] ,
"correct" : "8"
} ,
{
"question" : "Какая столица Франции?" ,
"options" : [ "Лондон" , "Берлин" , "Париж" , "Мадрид" ] ,
"correct" : "Париж"
Этап 3. Система подсчёта очков
Добавим подсчёт правильных ответов и вывод итогового результата.
questions = [
{
"question" : "Сколько планет в Солнечной системе?" ,
"options" : [ "7" , "8" , "9" , "10" ] ,
"correct" : "8"
} ,
{
"question" : "Какая столица Франции?" ,
"options" : [ "Лондон" , "Берлин" , "Париж" , "Мадрид" ] ,
"correct" : "Париж"
Этап 4. Таблица лидеров
Теперь добавим систему рейтинга, которая сохраняет имена игроков и их результаты.
# Таблица лидеров
leaderboard = {}
questions = [
{
"question" : "Сколько планет в Солнечной системе?" ,
"options" : [ "7" , "8" , "9" , "10" ] ,
"correct" : "8"
} ,
{
"question" : "Какая столица Франции?" ,
"options" : [ "Лондон" , "Берлин" , "Париж" , "Мадрид"
Этап 5. Меню навигации
Добавим главное меню, чтобы игрок мог выбрать действие: начать квиз, посмотреть рейтинг или выйти.
# Таблица лидеров
leaderboard = {}
questions = [
{
"question" : "Сколько планет в Солнечной системе?" ,
"options" : [ "7" , "8" , "9" , "10" ] ,
"correct" : "8"
} ,
{
"question" : "Какая столица Франции?" ,
"options" : [ "Лондон" , "Берлин" , "Париж" , "Мадрид"
Полный код проекта
# === КВИЗ С РЕЙТИНГОМ ===
# Таблица лидеров
leaderboard = {}
# Банк вопросов
questions = [
{
"question" : "Сколько планет в Солнечной системе?" ,
"options" : [ "7" , "8" , "9" , "10" ] ,
"correct" : "8"
} ,
{
"question" : "Какая столица Франции?" ,
"options" : [ "Лондон" ,
Задания для расширения проекта
Базовые улучшения
Добавь ещё 5–10 вопросов в банк.
Добавь разные категории вопросов (математика, география, программирование).
Добавь систему уровней сложности (лёгкий, средний, сложный).
Продвинутые улучшения
Сохраняй таблицу лидеров в файл, чтобы она не терялась при перезапуске программы.
Добавь систему подсказок (50/50, помощь друга) с уменьшением очков за использование.
Реализуй случайный порядок вопросов и вариантов ответов.
Подведём итоги
Поздравляю! Ты создал полноценную игру-квиз с системой рейтинга. Ты научился:
Структурировать данные с помощью списков и словарей.
Использовать циклы для обработки коллекций данных.
Создавать интерактивные меню.
Реализовывать систему подсчёта очков.
Работать с таблицей лидеров.
Этот проект можно расширять бесконечно — добавляй новые вопросы, категории, режимы игры!
Домашнее задание
Упражнение №1. Расширение банка вопросов
Добавь в проект ещё 5–10 вопросов на разные темы:
Математика (2–3 вопроса)
География (2–3 вопроса)
Программирование (2–3 вопроса)
Общие знания (2–3 вопроса)
Упражнение №2. Категории вопросов
Добавь категории к вопросам. Каждый вопрос должен иметь поле "category":
"математика"
"география"
"программирование"
"общие"
Добавь в меню возможность выбрать категорию перед началом квиза.
Упражнение №3. Уровни сложности
Добавь поле "difficulty" к каждому вопросу:
"лёгкий" — 1 балл
"средний" — 2 балла
"сложный" — 3 балла
Измени систему подсчёта очков так, чтобы за правильный ответ на сложный вопрос давалось больше баллов.
Упражнение №4. Случайный порядок
Используй модуль random для:
Перемешивания порядка вопросов
Перемешивания порядка вариантов ответов
Импортируй модуль: import random
Используй: random.shuffle(список) для перемешивания.
Упражнение №5. Подсказки
Добавь систему подсказок:
Подсказка "50/50" — убирает 2 неправильных варианта (стоит 1 балл)
Подсказка "Помощь друга" — показывает правильный ответ (стоит 2 балла)
Игрок может использовать подсказку перед ответом на вопрос. Если использует подсказку, очки за вопрос уменьшаются.
Упражнение №6. Сохранение рейтинга
Сохраняй таблицу лидеров в файл leaderboard.txt:
При завершении программы сохраняй рейтинг
При запуске программы загружай рейтинг из файла
Используй:
open("leaderboard.txt", "w") для записи
open("leaderboard.txt", "r") для чтения
Упражнение №7 Таймер
Добавь ограничение по времени на каждый вопрос:
У игрока есть 30 секунд на ответ
Если время истекло, вопрос считается неправильным
Показывай оставшееся время
Используй модуль time: import time
Упражнение №8 Статистика
Добавь в таблицу лидеров дополнительную информацию:
Количество сыгранных квизов
Лучший результат
Средний результат
Процент правильных ответов за всё время
Храни статистику в словаре с вложенными данными.
Упражнение №9. Импорт вопросов из файла БОНУС
Реализуй загрузку вопросов из текстового файла. Формат: каждая строка — «вопрос|вариант1|вариант2|вариант3|вариант4|правильный». Парси файл и заполняй список questions при запуске программы.
Упражнение №10. Режим «Марафон» БОНУС
Добавь режим «Марафон»: бесконечный поток вопросов до первой ошибки. Подсчитывай серию правильных ответов подряд. При ошибке — выведи результат и предложи сыграть снова.
:
"Париж"
} ,
{
"question" : "2 + 2 * 2 = ?" ,
"options" : [ "6" , "8" , "4" , "10" ] ,
"correct" : "6"
} ,
{
"question" : "Какой язык программирования мы изучаем?" ,
"options" : [ "Java" , "Python" , "C++" , "JavaScript" ] ,
"correct" : "Python"
} ,
{
"question" : "Сколько будет 10 // 3?" ,
"options" : [ "3" , "3.33" , "4" , "2" ] ,
"correct" : "3"
}
]
print ( f "В банке { len ( questions ) } вопросов" )
} ,
{
"question" : "2 + 2 * 2 = ?" ,
"options" : [ "6" , "8" , "4" , "10" ] ,
"correct" : "6"
}
]
print ( "=== КВИЗ ===" )
print ()
# Задаём вопросы
for i , q in enumerate ( questions , 1 ) :
print ( f "Вопрос { i } : { q [ 'question' ] } " )
print ()
# Выводим варианты ответов
for j , option in enumerate ( q [ 'options' ] , 1 ) :
print ( f " { j } . { option } " )
print ()
answer = input ( "Твой ответ (номер варианта): " )
# Проверяем ответ
if answer == q [ 'correct' ] :
print ( "✅ Правильно!" )
else :
print ( f "❌ Неправильно. Правильный ответ: { q [ 'correct' ] } " )
print ()
print ( "-" * 40 )
print ()
} ,
{
"question" : "2 + 2 * 2 = ?" ,
"options" : [ "6" , "8" , "4" , "10" ] ,
"correct" : "6"
}
]
print ( "=== КВИЗ ===" )
print ()
score = 0
total = len ( questions )
# Задаём вопросы
for i , q in enumerate ( questions , 1 ) :
print ( f "Вопрос { i } / { total } : { q [ 'question' ] } " )
print ()
# Выводим варианты ответов
for j , option in enumerate ( q [ 'options' ] , 1 ) :
print ( f " { j } . { option } " )
print ()
answer = input ( "Твой ответ (номер варианта): " )
# Проверяем ответ
if answer == q [ 'correct' ] :
print ( "✅ Правильно!" )
score += 1
else :
print ( f "❌ Неправильно. Правильный ответ: { q [ 'correct' ] } " )
print ()
print ( "-" * 40 )
print ()
# Итоговый результат
print ( "=" * 40 )
print ( "РЕЗУЛЬТАТЫ" )
print ( "=" * 40 )
print ( f "Правильных ответов: { score } из { total } " )
print ( f "Процент правильных: { score * 100 // total } %" )
]
,
"correct" : "Париж"
} ,
{
"question" : "2 + 2 * 2 = ?" ,
"options" : [ "6" , "8" , "4" , "10" ] ,
"correct" : "6"
}
]
print ( "=== КВИЗ ===" )
print ()
# Получаем имя игрока
player_name = input ( "Введите ваше имя: " )
print ()
score = 0
total = len ( questions )
# Задаём вопросы
for i , q in enumerate ( questions , 1 ) :
print ( f "Вопрос { i } / { total } : { q [ 'question' ] } " )
print ()
for j , option in enumerate ( q [ 'options' ] , 1 ) :
print ( f " { j } . { option } " )
print ()
answer = input ( "Твой ответ (номер варианта): " )
if answer == q [ 'correct' ] :
print ( "✅ Правильно!" )
score += 1
else :
print ( f "❌ Неправильно. Правильный ответ: { q [ 'correct' ] } " )
print ()
print ( "-" * 40 )
print ()
# Сохраняем результат
leaderboard [ player_name ] = score
# Выводим таблицу лидеров
print ( "=" * 40 )
print ( "ТАБЛИЦА ЛИДЕРОВ" )
print ( "=" * 40 )
for name , points in leaderboard . items () :
print ( f " { name } : { points } баллов" )
print ()
print ( f "Ваш результат: { score } из { total } " )
]
,
"correct" : "Париж"
} ,
{
"question" : "2 + 2 * 2 = ?" ,
"options" : [ "6" , "8" , "4" , "10" ] ,
"correct" : "6"
}
]
def show_menu ():
"""Показывает главное меню"""
print ( "=" * 40 )
print ( "=== КВИЗ С РЕЙТИНГОМ ===" )
print ( "=" * 40 )
print ()
print ( "1. Начать квиз" )
print ( "2. Показать таблицу лидеров" )
print ( "0. Выход" )
print ()
def play_quiz ():
"""Запускает квиз"""
print ()
print ( "=== НАЧАЛО КВИЗА ===" )
print ()
player_name = input ( "Введите ваше имя: " )
print ()
score = 0
total = len ( questions )
for i , q in enumerate ( questions , 1 ) :
print ( f "Вопрос { i } / { total } : { q [ 'question' ] } " )
print ()
for j , option in enumerate ( q [ 'options' ] , 1 ) :
print ( f " { j } . { option } " )
print ()
answer = input ( "Твой ответ (номер варианта): " )
if answer == q [ 'correct' ] :
print ( "✅ Правильно!" )
score += 1
else :
print ( f "❌ Неправильно. Правильный ответ: { q [ 'correct' ] } " )
print ()
print ( "-" * 40 )
print ()
# Сохраняем результат
leaderboard [ player_name ] = score
print ( "=" * 40 )
print ( "РЕЗУЛЬТАТЫ" )
print ( "=" * 40 )
print ( f "Правильных ответов: { score } из { total } " )
print ( f "Процент правильных: { score * 100 // total } %" )
print ()
def show_leaderboard ():
"""Показывает таблицу лидеров"""
print ()
print ( "=" * 40 )
print ( "ТАБЛИЦА ЛИДЕРОВ" )
print ( "=" * 40 )
if not leaderboard :
print ( "Пока нет результатов." )
else :
# Сортируем по убыванию очков
sorted_players = sorted ( leaderboard . items () , key = lambda x : x [ 1 ] , reverse = True )
for i , ( name , points ) in enumerate ( sorted_players , 1 ) :
print ( f " { i } . { name } : { points } баллов" )
print ()
# Главный цикл программы
while True :
show_menu ()
choice = input ( "Выберите действие: " )
print ()
if choice == "1" :
play_quiz ()
elif choice == "2" :
show_leaderboard ()
elif choice == "0" :
print ( "До свидания!" )
break
else :
print ( "Неверный выбор. Попробуйте снова." )
print ()
"Берлин"
,
"Париж"
,
"Мадрид"
]
,
"correct" : "Париж"
} ,
{
"question" : "2 + 2 * 2 = ?" ,
"options" : [ "6" , "8" , "4" , "10" ] ,
"correct" : "6"
} ,
{
"question" : "Какой язык программирования мы изучаем?" ,
"options" : [ "Java" , "Python" , "C++" , "JavaScript" ] ,
"correct" : "Python"
} ,
{
"question" : "Сколько будет 10 // 3?" ,
"options" : [ "3" , "3.33" , "4" , "2" ] ,
"correct" : "3"
}
]
def show_menu ():
"""Показывает главное меню"""
print ( "=" * 40 )
print ( "=== КВИЗ С РЕЙТИНГОМ ===" )
print ( "=" * 40 )
print ()
print ( "1. Начать квиз" )
print ( "2. Показать таблицу лидеров" )
print ( "0. Выход" )
print ()
def play_quiz ():
"""Запускает квиз"""
print ()
print ( "=== НАЧАЛО КВИЗА ===" )
print ()
player_name = input ( "Введите ваше имя: " )
print ()
score = 0
total = len ( questions )
for i , q in enumerate ( questions , 1 ) :
print ( f "Вопрос { i } / { total } : { q [ 'question' ] } " )
print ()
for j , option in enumerate ( q [ 'options' ] , 1 ) :
print ( f " { j } . { option } " )
print ()
answer = input ( "Твой ответ (номер варианта): " )
if answer == q [ 'correct' ] :
print ( "✅ Правильно!" )
score += 1
else :
print ( f "❌ Неправильно. Правильный ответ: { q [ 'correct' ] } " )
print ()
print ( "-" * 40 )
print ()
# Сохраняем результат
leaderboard [ player_name ] = score
print ( "=" * 40 )
print ( "РЕЗУЛЬТАТЫ" )
print ( "=" * 40 )
print ( f "Правильных ответов: { score } из { total } " )
print ( f "Процент правильных: { score * 100 // total } %" )
print ()
def show_leaderboard ():
"""Показывает таблицу лидеров"""
print ()
print ( "=" * 40 )
print ( "ТАБЛИЦА ЛИДЕРОВ" )
print ( "=" * 40 )
if not leaderboard :
print ( "Пока нет результатов." )
else :
# Сортируем по убыванию очков
sorted_players = sorted ( leaderboard . items () , key = lambda x : x [ 1 ] , reverse = True )
for i , ( name , points ) in enumerate ( sorted_players , 1 ) :
print ( f " { i } . { name } : { points } баллов" )
print ()
# Главный цикл программы
while True :
show_menu ()
choice = input ( "Выберите действие: " )
print ()
if choice == "1" :
play_quiz ()
elif choice == "2" :
show_leaderboard ()
elif choice == "0" :
print ( "До свидания!" )
break
else :
print ( "Неверный выбор. Попробуйте снова." )
print ()