Elo System funktioniert. QA Test mit Marian!
This commit is contained in:
parent
b10a1508f2
commit
80071e2b57
|
|
@ -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"}
|
{"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"}
|
||||||
|
|
@ -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
|
# Wenn wir was finden, machen wir ein Dictionary draus, ansonsten geben wir None zurück
|
||||||
if row:
|
if row:
|
||||||
return dict(row)
|
return dict(row)
|
||||||
|
logger.log("data_api/Get Player Data", "get_player_system_stats returned None. New player?")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
# Button Funktionen. Akzeptieren oder Rejecten. Der Reject Button löscht das Match aus der DB.
|
||||||
def reject_match(m_id):
|
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.notify("Spiel abgelehnt und gelöscht!", color="warning")
|
||||||
ui.navigate.reload() # Lädt die Seite neu, um die Karte zu aktualisieren
|
ui.navigate.reload() # Lädt die Seite neu, um die Karte zu aktualisieren
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
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 (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?
|
# Zuordnen: Welcher Change gehört zu P1 und welcher zu P2?
|
||||||
if winner_id == p1_id:
|
if winner_id == p1_id:
|
||||||
|
|
|
||||||
|
|
@ -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
|
# 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.
|
# 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):
|
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):
|
def get_rust_dampener(days_ago):
|
||||||
"""Berechnet den Dämpfungsfaktor basierend auf den vergangen Tagen."""
|
"""Berechnet den Dämpfungsfaktor basierend auf den vergangen Tagen."""
|
||||||
if days_ago <= 30:
|
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)
|
gamesystem_id = data_api.get_gamesystem_id_by_name(systemname)
|
||||||
|
|
||||||
# 1. Die aktuellen MMR-Punkte holen
|
# 1. Die aktuellen MMR-Punkte holen
|
||||||
w_stat = data_api.get_player_system_stats(winner_id, gamesystem_id)
|
w_stat = data_api.get_player_system_stats(winner_id, systemname)
|
||||||
l_stat = data_api.get_player_system_stats(looser_id, gamesystem_id)
|
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
|
# 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
|
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
|
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)
|
expected_win = 1 / (1 + 10 ** ((l_mmr - w_mmr)/400))
|
||||||
# Berechnet die Siegwahrscheinlichkeit des Gewinners (Wert zwischen 0.0 und 1.0)
|
|
||||||
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:
|
if match_is_draw:
|
||||||
# Bei einem Draw (0.5) gewinnt der Schwächere leicht Punkte, der Stärkere verliert leicht.
|
# Bei einem Draw (0.5) gewinnt der Schwächere leicht Punkte, der Stärkere verliert leicht.
|
||||||
base_change = K_FACTOR * (0.5 - expected_win)
|
base_change = K_FACTOR * (0.5 - expected_win)
|
||||||
|
logger.log("MATCH CALC", "Draw")
|
||||||
else:
|
else:
|
||||||
# Sieg (1.0). Gewinnt der Favorit, gibt es wenig Punkte. Gewinnt der Underdog, gibt es viele!
|
# Sieg (1.0). Gewinnt der Favorit, gibt es wenig Punkte. Gewinnt der Underdog, gibt es viele!
|
||||||
base_change = K_FACTOR * (1.0 - expected_win)
|
base_change = K_FACTOR * (1.0 - expected_win)
|
||||||
|
|
@ -52,15 +51,15 @@ def calc_mmr_change(systemname, winner_id, looser_id, winner_points, looser_poin
|
||||||
rust_factor = get_rust_dampener(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.
|
# Wenn Das Match ein Draw ist, können keine Slaanesh Punkte auftreten.
|
||||||
if match_is_draw:
|
if match_is_draw:
|
||||||
winner_final_mmr_change = int(w_mmr_change + wrath_of_khorne(winner_id)* rust_factor)
|
winner_final_mmr_change = int(base_change + wrath_of_khorne(winner_id)* rust_factor)
|
||||||
looser_final_mmr_change = int(l_mmr_change + wrath_of_khorne(looser_id)* rust_factor)
|
looser_final_mmr_change = int(base_change + wrath_of_khorne(looser_id)* rust_factor)
|
||||||
else:
|
else:
|
||||||
winner_final_mmr_change = int((base_change + wrath_of_khorne(winner_id) + sla_points) * rust_factor)
|
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
|
return winner_final_mmr_change, looser_final_mmr_change
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user