From 80071e2b5724f15a38d575f89192872a0f7e44b8 Mon Sep 17 00:00:00 2001 From: Daniel Nagel Date: Fri, 13 Mar 2026 10:29:01 +0000 Subject: [PATCH] Elo System funktioniert. QA Test mit Marian! --- ...-21d6fdd4-43d2-4625-8dc2-9282b6aa433f.json | 2 +- data/data_api.py | 1 + gui/main_gui.py | 2 +- match_calculations/calc_match.py | 2 +- match_calculations/calc_mmr_change.py | 27 +++++++++---------- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.nicegui/storage-user-21d6fdd4-43d2-4625-8dc2-9282b6aa433f.json b/.nicegui/storage-user-21d6fdd4-43d2-4625-8dc2-9282b6aa433f.json index 719b094..e85e364 100644 --- a/.nicegui/storage-user-21d6fdd4-43d2-4625-8dc2-9282b6aa433f.json +++ b/.nicegui/storage-user-21d6fdd4-43d2-4625-8dc2-9282b6aa433f.json @@ -1 +1 @@ -{"authenticated":true,"discord_id":"277898241750859776","discord_name":"mrteels","db_id":2,"display_name":"Stolpernder Guardmen","discord_avatar_url":"https://cdn.discordapp.com/avatars/277898241750859776/7c3446bb51fafd72b1b4c21124b4994f.png"} \ No newline at end of file +{"authenticated":true,"discord_id":"277898241750859776","discord_name":"mrteels","db_id":2,"display_name":"Schwitzender Klebschnüffler","discord_avatar_url":"https://cdn.discordapp.com/avatars/277898241750859776/7c3446bb51fafd72b1b4c21124b4994f.png"} \ No newline at end of file diff --git a/data/data_api.py b/data/data_api.py index a66d8b1..071bb70 100644 --- a/data/data_api.py +++ b/data/data_api.py @@ -326,6 +326,7 @@ def get_player_system_stats(player_id, system_name): # Wenn wir was finden, machen wir ein Dictionary draus, ansonsten geben wir None zurück if row: return dict(row) + logger.log("data_api/Get Player Data", "get_player_system_stats returned None. New player?") return None diff --git a/gui/main_gui.py b/gui/main_gui.py index 77de795..97f7d57 100644 --- a/gui/main_gui.py +++ b/gui/main_gui.py @@ -121,7 +121,7 @@ def setup_routes(admin_discord_id): # Button Funktionen. Akzeptieren oder Rejecten. Der Reject Button löscht das Match aus der DB. def reject_match(m_id): - data_api.delete_match(m_id) + data_api.delete_match(m_id, player_id) ui.notify("Spiel abgelehnt und gelöscht!", color="warning") ui.navigate.reload() # Lädt die Seite neu, um die Karte zu aktualisieren diff --git a/match_calculations/calc_match.py b/match_calculations/calc_match.py index 06fe0f8..bd46d48 100644 --- a/match_calculations/calc_match.py +++ b/match_calculations/calc_match.py @@ -61,7 +61,7 @@ def calculate_match (match_id): mmr_change_winner, mmr_change_looser = calc_mmr_change.calc_mmr_change(sys_name, winner_id, looser_id, winner_score, looser_score, match_is_draw) data_api.apply_match_to_player_statistic (winner_id, sys_id, mmr_change_winner, winner_score) - data_api.apply_match_to_player_statistic (looser_id, sys_id, mmr_change_looser, looser_score) + data_api.apply_match_to_player_statistic (looser_id, sys_id, -mmr_change_looser, looser_score) # Zuordnen: Welcher Change gehört zu P1 und welcher zu P2? if winner_id == p1_id: diff --git a/match_calculations/calc_mmr_change.py b/match_calculations/calc_mmr_change.py index 9f66ac7..a394589 100644 --- a/match_calculations/calc_mmr_change.py +++ b/match_calculations/calc_mmr_change.py @@ -3,13 +3,11 @@ from wood import logger # Faktor für die Punkte Inflation. Um diesen Wert verliert der Verlierer weniger Punkte als der Sieger bekommt. Über Kurz oder Lang werden # die meisten Spieler über 1000MMR sein. Sprich: Neueinsteiger, oder leute die weniger spielen sind eher im unteren Ende als in der Mitte. -point_inflation = 0.7 # => entspricht % ! z.B. 0.7 = 70% +point_inflation = 0.7 # => entspricht % +K_FACTOR = 40 # Die "Border" (Maximalpunkte) die ein Sieg gibt. def calc_mmr_change(systemname, winner_id, looser_id, winner_points, looser_points, match_is_draw): - point_inflation = 0.7 # Verlierer verliert nur 70% der Punkte - K_FACTOR = 40 # Die "Border" (Maximalpunkte) die ein Sieg gibt. - def get_rust_dampener(days_ago): """Berechnet den Dämpfungsfaktor basierend auf den vergangen Tagen.""" if days_ago <= 30: @@ -25,20 +23,21 @@ def calc_mmr_change(systemname, winner_id, looser_id, winner_points, looser_poin gamesystem_id = data_api.get_gamesystem_id_by_name(systemname) # 1. Die aktuellen MMR-Punkte holen - w_stat = data_api.get_player_system_stats(winner_id, gamesystem_id) - l_stat = data_api.get_player_system_stats(looser_id, gamesystem_id) + w_stat = data_api.get_player_system_stats(winner_id, systemname) + l_stat = data_api.get_player_system_stats(looser_id, systemname) # Wenn ein Spieler noch keine keine Stats hat wird None zurück gegeben. Fallback für diesen Fall w_mmr = w_stat['mmr'] if w_stat and w_stat['mmr'] is not None else 1000 l_mmr = l_stat['mmr'] if l_stat and l_stat['mmr'] is not None else 1000 - # 2. Die fließende Elo-Mathematik (Ersetzt die JSON Datei) - # Berechnet die Siegwahrscheinlichkeit des Gewinners (Wert zwischen 0.0 und 1.0) - expected_win = 1 / (1 + 10 ** ((l_mmr - w_mmr) / 400)) + expected_win = 1 / (1 + 10 ** ((l_mmr - w_mmr)/400)) + + logger.log("MATCH CALC", f"1 / (1 + 10 ** (({l_mmr} - {w_mmr})/400))") if match_is_draw: # Bei einem Draw (0.5) gewinnt der Schwächere leicht Punkte, der Stärkere verliert leicht. base_change = K_FACTOR * (0.5 - expected_win) + logger.log("MATCH CALC", "Draw") else: # Sieg (1.0). Gewinnt der Favorit, gibt es wenig Punkte. Gewinnt der Underdog, gibt es viele! base_change = K_FACTOR * (1.0 - expected_win) @@ -50,17 +49,17 @@ def calc_mmr_change(systemname, winner_id, looser_id, winner_points, looser_poin days = max(w_days, l_days) rust_factor = get_rust_dampener(days) - sla_points = 0 #slaanesh_delight(winner_points, looser_points) + sla_points = 0 #slaanesh_delight(winner_points, looser_points) - logger.log(f"MATCH CALC", f"Base Change {base_change}, Rost Faktor {rust_factor}, EloFaktor {expected_win}") + logger.log(f"MATCH CALC", f"Base Change: {base_change}, Rost Faktor: {rust_factor}, EloFaktor: {expected_win}") # Wenn Das Match ein Draw ist, können keine Slaanesh Punkte auftreten. if match_is_draw: - winner_final_mmr_change = int(w_mmr_change + wrath_of_khorne(winner_id)* rust_factor) - looser_final_mmr_change = int(l_mmr_change + wrath_of_khorne(looser_id)* rust_factor) + winner_final_mmr_change = int(base_change + wrath_of_khorne(winner_id)* rust_factor) + looser_final_mmr_change = int(base_change + wrath_of_khorne(looser_id)* rust_factor) else: winner_final_mmr_change = int((base_change + wrath_of_khorne(winner_id) + sla_points) * rust_factor) - looser_final_mmr_change = int((base_change + wrath_of_khorne(winner_id) - sla_points) * rust_factor) + looser_final_mmr_change = int(((base_change + wrath_of_khorne(winner_id) - sla_points) * rust_factor)* point_inflation) return winner_final_mmr_change, looser_final_mmr_change