Изменения:

1. Ошибка "WHERE game_sessions.user_id IS NULL"
+ игра получает user_id из бд после создания пользователя, авторизации
2. Провиль пользователя
+ отображается никнейм
3. Уровни
+ добавлена рамка с 100 уровнями
+ добавлена система смены цвета кнопки уровня в зависимости от состояния (пройден/не пройден)
4. Окно победы
+ добавлено отображение никнейма
This commit is contained in:
Xatiko 2024-12-03 02:23:50 +03:00
parent 9f5d36d1a1
commit 5d34162267
13 changed files with 5512 additions and 234 deletions

BIN
database/DogAcademy.db Normal file

Binary file not shown.

View file

@ -1,3 +1,4 @@
import logging
from sqlalchemy import func
from sqlalchemy.orm import joinedload
from database.db_session import get_session
@ -6,36 +7,50 @@ from sqlalchemy.exc import SQLAlchemyError
def get_user_by_id(user_id):
"""Получение данных пользователя по ID."""
"""Получение данных пользователя по ID с предварительной загрузкой связанных данных."""
session = get_session()
try:
user = session.query(Users).filter_by(user_id=user_id).first()
user = (
session.query(Users)
.options(joinedload(Users.game_sessions)) # Предзагрузка связанных игровых сессий
.filter_by(user_id=user_id)
.first()
)
return user
except SQLAlchemyError as e:
print(f"Ошибка при получении пользователя: {e}")
logging.error(f"Ошибка при получении пользователя: {e}")
return None
finally:
session.close()
def create_user(login, password, username):
"""Создание нового пользователя в базе данных."""
"""Регистрация нового пользователя."""
session = get_session()
# Проверяем, есть ли уже пользователь с таким логином
# Проверка, есть ли уже пользователь с таким логином
if session.query(Auth).filter_by(login=login).first():
return False, "Логин уже используется."
# Создаем новую запись в таблице Auth
# Создаём новую запись в таблице Auth
new_auth = Auth(login=login, password=password)
session.add(new_auth)
try:
session.commit() # Сохраняем изменения в таблице Auth
# Создаем новую запись в таблице Users, связывая с только что добавленным Auth
# Создаём новую запись в таблице Users, связываем с только что добавленным Auth
new_user = Users(user_id=new_auth.user_id, username=username)
session.add(new_user)
session.commit() # Сохраняем изменения в таблице Users
# Создаём новый игровой процесс для этого пользователя
new_game_session = GameSession(user_id=new_user.user_id, level=1) # Устанавливаем уровень по умолчанию
session.add(new_game_session)
session.commit() # Сохраняем данные в GameSession
print(f"Пользователь {username} успешно добавлен!")
return True, "Регистрация успешна."
except SQLAlchemyError as e:
session.rollback() # Откат изменений при ошибке
print(f"Ошибка при создании пользователя: {e}")
@ -43,28 +58,18 @@ def create_user(login, password, username):
finally:
session.close()
return True, "Регистрация успешна."
def check_user(login, password=None):
"""Проверка существования пользователя по логину и паролю (если передан)."""
session = get_session()
try:
print(f"Проверяем пользователя с логином: {login}")
# Фильтрация только по логину
query = session.query(Auth).filter_by(login=login)
# Если передан пароль, фильтруем и по паролю
if password:
query = query.filter_by(password=password)
user = query.first()
if user:
print(f"Пользователь найден: {user.user_id}")
return user.user_id # Возвращаем user_id пользователя
return user.user_id
else:
print("Пользователь не найден.")
return None
except SQLAlchemyError as e:
print(f"Ошибка при проверке пользователя: {e}")
@ -76,6 +81,8 @@ def save_progress(user_id, level, score, duration, health, hunger, sleepiness):
"""Сохранение игрового прогресса в базу данных."""
session = get_session()
try:
if not user_id:
raise ValueError("user_id не указан!")
session_data = GameSession(
user_id=user_id,
level=level,
@ -89,8 +96,10 @@ def save_progress(user_id, level, score, duration, health, hunger, sleepiness):
session.add(session_data)
session.commit()
except SQLAlchemyError as e:
print(f"Ошибка при сохранении прогресса: {e}")
logging.error(f"Ошибка при сохранении прогресса: {e}")
session.rollback()
except ValueError as e:
logging.error(e)
finally:
session.close()
@ -100,7 +109,7 @@ def get_user_progress(user_id):
try:
return session.query(GameSession).filter_by(user_id=user_id).all()
except Exception as e:
print(f"Ошибка при получении прогресса пользователя: {e}")
logging.error(f"Ошибка при получении прогресса пользователя: {e}")
return []
finally:
session.close()

View file

@ -1,3 +1,7 @@
import logging
from sqlalchemy.exc import SQLAlchemyError
from database.db_session import get_session
from database.models import Dogs
@ -47,21 +51,44 @@ DOG_CHARACTERS = {
}
def populate_dogs():
"""
Заполнение таблицы Dogs предустановленными данными.
"""
session = get_session()
try:
logging.info("Начинается заполнение таблицы Dogs.")
for breed, data in DOG_CHARACTERS.items():
dog = Dogs(
breed=breed,
characteristics=data['characteristics'],
behavior=data['behavior'],
care_info=data['care_info'],
admin_comments=data['admin_comments']
)
session.add(dog)
existing_dog = session.query(Dogs).filter_by(breed=breed).first()
if not existing_dog:
dog = Dogs(
breed=breed,
characteristics=data['characteristics'],
behavior=data['behavior'],
care_info=data['care_info'],
admin_comments=data['admin_comments']
)
session.add(dog)
session.commit()
print("Таблица Dogs успешно заполнена.")
except Exception as e:
logging.info("Таблица Dogs успешно заполнена.")
except SQLAlchemyError as e:
session.rollback()
print(f"Ошибка при заполнении Dogs: {e}")
logging.error(f"Ошибка при заполнении Dogs: {e}")
finally:
session.close()
def get_all_dogs():
"""
Получение списка всех пород собак из базы данных.
:return: Список объектов Dogs.
"""
session = get_session()
try:
dogs = session.query(Dogs).all()
return dogs
except SQLAlchemyError as e:
logging.error(f"Ошибка при получении списка собак: {e}")
return []
finally:
session.close()

View file

@ -1,34 +1,48 @@
import logging
from sqlalchemy import func
from database.db_events import get_user_progress
from database.db_session import get_session
from sqlalchemy.exc import SQLAlchemyError
from database.models import GameSession
def save_game_session(user_id, level, score, duration, health, hunger, sleepiness):
"""Сохранение игрового процесса в таблицу GameSessions."""
def save_game_session(user_id, level, score, steps, duration=0, health=100, hunger=0, sleepiness=0):
"""Сохранение игрового прогресса."""
session = get_session()
try:
# Создаем новый объект GameSession
game_session = GameSession(
session.add(GameSession(
user_id=user_id,
level=level,
score=score,
steps=steps,
duration=duration,
health=health,
hunger=hunger,
sleepiness=sleepiness,
)
session.add(game_session)
session.commit() # Сохраняем данные в таблице
print(f"Игровой процесс для пользователя {user_id} на уровне {level} успешно сохранен.")
except SQLAlchemyError as e:
sleepiness=sleepiness
))
session.commit()
logging.info(f"Сессия сохранена: user_id={user_id}, level={level}, score={score}")
except Exception as e:
session.rollback()
print(f"Ошибка при сохранении игрового процесса: {e}")
finally:
session.close()
logging.error(f"Ошибка при сохранении игровой сессии: {e}")
raise
def print_user_progress(user_id):
"""Печать прогресса пользователя из таблицы GameSessions."""
"""
Печать прогресса пользователя из таблицы GameSessions.
:param user_id: ID пользователя
"""
if not user_id:
logging.error("user_id отсутствует. Невозможно получить прогресс.")
return
progress = get_user_progress(user_id)
if not progress:
print(f"У пользователя с ID {user_id} нет сохраненного прогресса.")
return
print(f"Прогресс пользователя (user_id={user_id}):")
for session in progress:
print(f"Уровень: {session.level}, Очки: {session.score}, Время: {session.duration} секунд")
print(f"- Уровень: {session.level}, Очки: {session.score}, Время: {session.duration} сек")