Изменения:
1. Ошибка "WHERE game_sessions.user_id IS NULL" + игра получает user_id из бд после создания пользователя, авторизации 2. Провиль пользователя + отображается никнейм 3. Уровни + добавлена рамка с 100 уровнями + добавлена система смены цвета кнопки уровня в зависимости от состояния (пройден/не пройден) 4. Окно победы + добавлено отображение никнейма
This commit is contained in:
parent
9f5d36d1a1
commit
5d34162267
13 changed files with 5512 additions and 234 deletions
BIN
database/DogAcademy.db
Normal file
BIN
database/DogAcademy.db
Normal file
Binary file not shown.
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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} сек")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue