update stats end game

This commit is contained in:
Zikil 2024-12-21 23:12:17 +07:00
parent 3dca1bd9e3
commit bff71a1360

View File

@ -74,53 +74,75 @@ async def handle_webapp_data(message: types.Message):
db.end_game(game_id)
logger.info(f"Game {game_id} completed with {len(throws)} throws")
# Обновляем подсчет статистики
# Анализ комбинаций
combinations = {}
for throw in throws:
dice = sorted([throw['dice'][0], throw['dice'][1]])
key = f"{dice[0]}-{dice[1]}"
combinations[key] = combinations.get(key, 0) + 1
# Сортируем комбинации по частоте
sorted_combinations = sorted(
combinations.items(),
key=lambda x: (-x[1], x[0]) # Сортировка по убыванию частоты, потом по комбинации
)
# Подсчет статистики
total_throws = len(throws)
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)
# Обновляем подсчет статистики
total_throws = len(throws)
avg_sum = total_base_sum / total_throws if total_throws > 0 else 0
avg_sum_with_minus = total_final_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])
# Формируем сообщение
response = "🎯 Игра завершена!\n\n"
response += f"📊 Статистика игры:\n"
response += f"Всего бросков: {total_throws}\n"
response += f"• Общая сумма: {total_final_sum}\n"
response = "🎲 Итоги игры\n\n"
# Основная статистика
response += "📊 Общая статистика:\n"
response += f"• Бросков: {total_throws}\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_base_sum})\n"
response += f"• Неиспользовано: {unused_sum} очков\n"
response += f"• Эффективность: {(total_final_sum / total_base_sum * 100):.1f}%\n"
response += f"• Средняя сумма: {avg_sum_with_minus:.1f} \n"
response += f" (без минусов: {avg_sum:.1f})\n"
else:
response += "\n"
response += f"• Средняя сумма: {avg_sum:.1f}\n"
response += f"• Дублей выпало: {doubles}\n"
response += f"• Дублей: {doubles} ({(doubles/total_throws*100):.1f}%)\n"
# Средние значения
response += "\n📈 Средние значения:\n"
response += f"За бросок: {avg_sum_with_minus:.1f}"
if total_base_sum != total_final_sum:
response += f" (макс. {avg_sum:.1f})\n"
else:
response += "\n"
# Добавляем последние броски
# Топ комбинаций
response += "\n🎯 Частые комбинации:\n"
for combo, count in sorted_combinations[:5]: # Показываем топ-5 комбинаций
percentage = (count / total_throws) * 100
is_double = combo[0] == combo[2] # Проверяем, дубль ли это
response += f"{combo} {'🎯' if is_double else ''}: {count}x ({percentage:.1f}%)\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]
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 is_double:
response += " 🎯"
if unused > 0:
response += f" = {sum_value} (-{unused})"
else: