Изменён пользовательский интерфейс main_menu.py, game_ui.py. Настроен вызов функций для запуска игрового процесса: после нажатия кнопки 'играть' открывается выбор собаки, а затем выбор уровня. Обновлена структура базы данных. Удалены не нужные файлы для проекта.

This commit is contained in:
Xatiko 2024-11-26 23:02:04 +03:00
parent 989a9056e7
commit c08cf51998
46 changed files with 804 additions and 111 deletions

View file

@ -1,12 +1,18 @@
from sqlalchemy import func
from sqlalchemy.orm import joinedload
from database.db_session import get_session
from database.models import Auth, Notifications, Users
from database.models import Auth, Notifications, Users, GameSession, Dogs, Questions
from sqlalchemy.exc import SQLAlchemyError
def create_user(login, password):
def create_user(login, password, username):
"""Создание нового пользователя в базе данных."""
session = get_session()
try:
new_user = Auth(login=login, password=password)
new_user_auth = Auth(login=login, password=password)
session.add(new_user_auth)
session.commit()
new_user = Users(username=username, auth=new_user_auth)
session.add(new_user)
session.commit()
except SQLAlchemyError as e:
@ -20,9 +26,111 @@ def check_user(login, password):
session = get_session()
try:
user = session.query(Auth).filter_by(login=login, password=password).first()
return user is not None
if user:
return user.user_id
return None
except SQLAlchemyError as e:
print(f"Ошибка при проверке пользователя: {e}")
return False
return None
finally:
session.close()
session.close()
def save_progress(user_id, level, score, duration, health, hunger, sleepiness):
"""Сохраняет прогресс пользователя в базу данных."""
session = get_session()
try:
session_data = GameSession(
user_id=user_id,
level=level,
score=score,
duration=duration,
health=health,
hunger=hunger,
sleepiness=sleepiness,
end_time=func.now()
)
session.add(session_data)
session.commit()
except SQLAlchemyError as e:
print(f"Ошибка при сохранении прогресса: {e}")
session.rollback()
finally:
session.close()
def get_user_progress(user_id):
"""Получение прогресса пользователя по его ID."""
session = get_session()
try:
progress = session.query(GameSession).filter_by(user_id=user_id).all()
return progress
except SQLAlchemyError as e:
print(f"Ошибка при получении прогресса: {e}")
return []
finally:
session.close()
def create_notification(user_id, message):
"""Создание уведомления для пользователя."""
session = get_session()
try:
notification = Notifications(user_id=user_id, message=message)
session.add(notification)
session.commit()
except SQLAlchemyError as e:
print(f"Ошибка при создании уведомления: {e}")
session.rollback()
finally:
session.close()
def get_notifications(user_id):
"""Получение уведомлений для пользователя."""
session = get_session()
try:
notifications = session.query(Notifications).filter_by(user_id=user_id).all()
return notifications
except SQLAlchemyError as e:
print(f"Ошибка при получении уведомлений: {e}")
return []
finally:
session.close()
def get_knowledge_base():
"""Получение базы знаний (статей о собаках)."""
session = get_session()
try:
dogs = session.query(Dogs).all()
return dogs # Список объектов Dogs
except SQLAlchemyError as e:
print(f"Ошибка при получении базы знаний: {e}")
return []
finally:
session.close()
def get_dogs():
"""Получение списка пород собак."""
session = get_session()
try:
dogs = session.query(Dogs).all()
return dogs # Список объектов Dogs
except SQLAlchemyError as e:
print(f"Ошибка при получении списка собак: {e}")
return []
finally:
session.close()
def update_user_dog(user_id, dog_id):
"""Обновление выбранной пользователем породы собаки."""
session = get_session()
try:
user = session.query(Users).filter_by(user_id=user_id).first()
if user:
user.dog_id = dog_id
session.commit()
print(f"Порода пользователя обновлена на {dog_id}")
else:
print("Пользователь не найден.")
except SQLAlchemyError as e:
print(f"Ошибка при обновлении породы собаки: {e}")
session.rollback()
finally:
session.close()

View file

@ -13,7 +13,6 @@ Session = sessionmaker(bind=engine)
# Переменная для хранения текущей сессии
current_session = None
def init_db(refresh=False):
"""
Инициализация базы данных: создание файла и таблиц.
@ -33,18 +32,14 @@ def init_db(refresh=False):
# Инициализация сессии при запуске
current_session = get_session()
def get_session():
"""Возвращает сессию для работы с базой данных."""
return Session()
def close_sessions():
"""Закрытие всех сессий перед выходом из программы."""
global current_session
if current_session is not None:
if current_session:
print("Закрытие сессии...")
current_session.close() # Закрываем текущую сессию базы данных
current_session = None
current_session.close()
else:
print("Нет активной сессии для закрытия.")

View file

@ -1,11 +1,10 @@
from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime
from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, UniqueConstraint, Boolean
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Auth(Base):
__tablename__ = 'auth'
user_id = Column(Integer, primary_key=True)
@ -50,7 +49,7 @@ class Questions(Base):
__tablename__ = 'questions'
question_id = Column(Integer, primary_key=True)
dog_id = Column(Integer, ForeignKey('dogs.dog_id'))
question_text = Column(Text, nullable=False) # Исправлено поле
question_text = Column(Text, nullable=False)
image_url = Column(String)
helpful_info = Column(Text)
incorrect_attempts = Column(Integer, default=0)
@ -61,24 +60,31 @@ class Questions(Base):
class GameSession(Base):
__tablename__ = 'game_sessions'
__table_args__ = (
UniqueConstraint('user_id', 'level', name='uix_user_level'),
)
session_id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.user_id'))
level = Column(Integer, nullable=False)
score = Column(Integer, default=0)
duration = Column(Integer) # Время игры в секундах
start_time = Column(DateTime, default=func.now()) # Исправлено
start_time = Column(DateTime, default=func.now())
end_time = Column(DateTime, nullable=True)
health = Column(Integer, default=100) # Здоровье
hunger = Column(Integer, default=0) # Голод
sleepiness = Column(Integer, default=0) # Сонливость
# Связь с таблицей Users
user = relationship("Users", back_populates="game_sessions")
class Notifications(Base):
__tablename__ = 'notifications'
notification_id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.user_id'))
message = Column(Text, nullable=False)
timestamp = Column(DateTime, default=func.now())
is_read = Column(Integer, default=0) # 0 - не прочитано, 1 - прочитано
is_read = Column(Boolean, default=False) # Булевый тип для read
# Связь с таблицей Users
user = relationship("Users", back_populates="notifications")