add minus in dices

This commit is contained in:
Zikil 2024-12-18 22:37:42 +07:00
parent 8b48220f36
commit f92f547169
3 changed files with 71 additions and 34 deletions

View File

@ -32,14 +32,14 @@ class Database:
conn.commit()
return cursor.lastrowid
def add_throw(self, game_id: int, dice1: int, dice2: int):
"""Добавление броска"""
def add_throw(self, game_id: int, dice1: int, dice2: int, unused_points: int = 0):
"""Добавление броска с учетом неиспользованных очков"""
with self._get_connection() as conn:
cursor = conn.cursor()
cursor.execute('''
INSERT INTO throws (game_id, dice1, dice2)
VALUES (?, ?, ?)
''', (game_id, dice1, dice2))
INSERT INTO throws (game_id, dice1, dice2, unused_points)
VALUES (?, ?, ?, ?)
''', (game_id, dice1, dice2, unused_points))
conn.commit()
def get_active_game(self, user_id: int):
@ -70,14 +70,22 @@ class Database:
conn.commit()
def get_statistics(self, user_id: int):
"""Получение статистики пользователя"""
"""Получение статистики пользователя с учетом неиспользованных очков"""
with self._get_connection() as conn:
cursor = conn.cursor()
stats = cursor.execute('''
SELECT
COUNT(*) as total_throws,
AVG(dice1 + dice2) as avg_sum,
COUNT(DISTINCT game_id) as total_games
SUM(CASE
WHEN dice1 = dice2 THEN (dice1 + dice2) * 2
ELSE dice1 + dice2
END) as total_base_sum,
SUM(CASE
WHEN dice1 = dice2 THEN (dice1 + dice2) * 2 - unused_points
ELSE dice1 + dice2 - unused_points
END) as total_final_sum,
COUNT(DISTINCT game_id) as total_games,
SUM(unused_points) as total_unused
FROM throws t
JOIN games g ON t.game_id = g.id
WHERE g.user_id = ?
@ -86,11 +94,11 @@ class Database:
return dict(stats)
def get_game_throws(self, game_id: int):
"""Получение всех бросков игры"""
"""Получение всех бросков игры с учетом неиспользованных очков"""
with self._get_connection() as conn:
cursor = conn.cursor()
throws = cursor.execute('''
SELECT dice1, dice2, throw_time
SELECT dice1, dice2, unused_points, throw_time
FROM throws
WHERE game_id = ?
ORDER BY throw_time DESC

View File

@ -44,9 +44,8 @@ async def start_command(message: types.Message):
# Обновляем функцию подсчета статистики в handle_webapp_data
def calculate_throw_sum(throw):
dice1, dice2 = throw['dice']
if dice1 == dice2:
return (dice1 + dice2) * 2
return dice1 + dice2
base_sum = (dice1 + dice2) * 2 if dice1 == dice2 else dice1 + dice2
return base_sum - (throw.get('unusedPoints', 0))
@dp.message(F.web_app_data)
async def handle_webapp_data(message: types.Message):
@ -67,7 +66,8 @@ async def handle_webapp_data(message: types.Message):
db.add_throw(
game_id,
throw['dice'][0],
throw['dice'][1]
throw['dice'][1],
throw.get('unusedPoints', 0)
)
# Завершаем игру
@ -76,32 +76,39 @@ async def handle_webapp_data(message: types.Message):
# Обновляем подсчет статистики
total_throws = len(throws)
total_sum = sum(calculate_throw_sum(t) for t in throws)
avg_sum = total_sum / total_throws if total_throws > 0 else 0
doubles = sum(1 for t in throws if t['dice'][0] == t['dice'][1])
# Находим максимальный и минимальный броски с учетом дублей
throws_with_sums = [(t, calculate_throw_sum(t)) for t in throws]
max_throw = max(throws_with_sums, key=lambda x: x[1])
min_throw = min(throws_with_sums, key=lambda x: x[1])
total_base_sum = sum((t['dice'][0] + t['dice'][1]) * 2 if t['dice'][0] == t['dice'][1] else t['dice'][0] + t['dice'][1] for t in throws)
total_final_sum = sum(calculate_throw_sum(t) for t in throws)
# Формируем сообщение
response = "🎯 Игра завершена!\n\n"
response += f"📊 Статистика игры:\n"
response += f"Всего бросков: {total_throws}\n"
response += f"• Общая сумма: {total_sum}\n"
response += f"• Средняя сумма: {avg_sum:.1f}\n"
response += f"• Дублей выпало: {doubles}\n"
response += f"• Максимальный бросок: {max_throw[0]['dice'][0]}-{max_throw[0]['dice'][1]} (сумма: {max_throw[1]})\n"
response += f"• Минимальный бросок: {min_throw[0]['dice'][0]}-{min_throw[0]['dice'][1]} (сумма: {min_throw[1]})\n\n"
response += f"• Общая сумма: {total_final_sum}"
if total_base_sum != total_final_sum:
unused_sum = total_base_sum - total_final_sum
response += f" (без минусов: {total_base_sum})\n"
response += f"• Неиспользовано: {unused_sum}\n"
response += f"• Эффективность: {(total_final_sum / total_base_sum * 100):.1f}%\n"
else:
response += "\n"
# Добавляем последние броски с учетом дублей
response += "🎲 Последние броски:\n"
# Добавляем последние броски
response += "\n🎲 Последние броски:\n"
for i, throw in enumerate(throws[:5]):
sum_value = calculate_throw_sum(throw)
is_double = throw['dice'][0] == throw['dice'][1]
response += f"{i+1}. {throw['dice'][0]}-{throw['dice'][1]} {'🎯' if is_double else ''} (сумма: {sum_value})\n"
unused = throw.get('unusedPoints', 0)
base_sum = (throw['dice'][0] + throw['dice'][1]) * 2 if is_double else throw['dice'][0] + throw['dice'][1]
response += f"{i+1}. {throw['dice'][0]}-{throw['dice'][1]}"
response += f" {'🎯' if is_double else ''}"
if unused > 0:
response += f" = {sum_value} (-{unused})"
else:
response += f" = {sum_value}"
response += "\n"
if total_throws > 5:
response += f"... и ещё {total_throws - 5} бросков"
@ -120,14 +127,35 @@ async def statistics_command(message: types.Message):
stats = db.get_statistics(user_id)
response = "📊 Общая статистика:\n\n"
response = "📊 Подробная статистика:\n\n"
if stats['total_throws']:
total_base_sum = stats['total_base_sum'] or 0
total_final_sum = stats['total_final_sum'] or 0
total_unused = stats['total_unused'] or 0
avg_sum = total_final_sum / stats['total_throws']
response += (
f"Всего игр: {stats['total_games']}\n"
f"🎲 Броски:\n"
f"Всего бросков: {stats['total_throws']}\n"
f"• Средняя сумма: {stats['avg_sum']:.1f}\n"
f"• Количество игр: {stats['total_games']}\n"
f"• Среднее бросков за игру: {stats['total_throws'] / stats['total_games']:.1f}\n\n"
f"🎯 Очки:\n"
f"• Общая сумма: {total_final_sum}\n"
f"• Сумма без минусов: {total_base_sum}\n"
f"• Средняя сумма за бросок: {avg_sum:.1f}\n"
f"• Эффективность: {(total_final_sum / total_base_sum * 100):.1f}%\n\n"
)
if total_unused > 0:
avg_unused = total_unused / stats['total_throws']
response += (
f"❌ Неиспользованные очки:\n"
f"Всего неиспользовано: {total_unused}\n"
f"В среднем за бросок: {avg_unused:.1f}\n"
f"• Процент потерь: {(total_unused / total_base_sum * 100):.1f}%\n"
)
else:
response += "У вас пока нет записанных бросков."

View File

@ -12,6 +12,7 @@ CREATE TABLE IF NOT EXISTS throws (
game_id INTEGER,
dice1 INTEGER NOT NULL,
dice2 INTEGER NOT NULL,
unused_points INTEGER DEFAULT 0,
throw_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (game_id) REFERENCES games(id)
);