Bundesliga-Simulator

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Kurtosis
User
Beiträge: 55
Registriert: Samstag 11. Dezember 2010, 14:32

Hallo,

ich versuche gerade einen Bundesliga-Simulator zu programmieren, der komplett im Terminal ablaufen soll. Angriffs- und Defensivstärke der Mannschaften habe ich berechnet, so dass ich die Erwartungswerte für die verschiedenen Partien berechnen kann. Nun möchte ich das Programm aber noch um die Punkteverteilung erweitern und die macht mir derzeit noch Probleme.
Ich habe eingangs für jeden Verein eine jeweilige Punktevariable definiert und gleich Null gesetzt. In einer for-Schleife geht das Programm nun alle 9 Partien pro Spieltag durch und überprüft in einer darin enthaltenen if-elif-else-Struktur, ob die Heimmannschaft gewonnen oder verloren hat oder ob ein Unentschieden gespielt wurde.
Jede Partie ist eine Liste, die die Tore, Gegentore, die Punktevariablen für beide Mannschaften und die Namen der beiden Mannschaften enthält. Die for-Schleife wird also mit den Partien gefüttert und danach werden die entsprechenden Daten aus der Liste gezogen und ausgewertet.
Ich hätte es nun gerne so, dass für den Fall, dass die Heimmannschaft gewinnt, die Punktevariable dieses Teams um 3 erhöht wird und danach global "abgespeichert" wird, damit für den nächsten Spieltag der Zähler nicht wieder bei Null startet. Nur leider klappt das momentan nicht und ich habe gedacht, dass das eventuell mit return funktioniert, aber leider wird dann die komplette for-Schleife nach der ersten Partie direkt abgebrochen.
Beim Schreiben fällt mir gerade ein, dass die Punkteverteilungsfunktion als Argument natürlich die Punktevariablen einlesen muss, um diese zu verändern. Leider sehe ich momentan nur noch nicht, wie ich diese for-Schleife möglichst kompakt programmieren kann, um nicht für jeden Verein eine if-elif-else Struktur zu programmieren, die dann den Code nur mega in die Länge ziehen würde. Das wäre natürlich irgendwie möglich, aber mega umständlich und hässlich.
Meine Idee bzw. Vorstellung von dieser Punktefunktion ist, dass die for-Schleife von 1 bis 9 zählt - jeweils ein Durchlauf pro Partie - und dann für jede Partie checkt, ob die Heimmannschaft gewonnen oder verloren hat oder unentschieden gespielt hat - das läuft dann über die Erwartungswerte der Tore bzw. Gegentore der Heimmannschaft. Je nach Bedingung werden dann die Punktevariablen der Teams, die in der Partie-Liste - 9 Listen pro Spieltag - enthalten sind, um 3, 1 oder 0 erhöht und abgespeichert, so dass in der Partie-Liste vom nächsten Spieltag die bearbeiteten Punktevariablen enthalten sind. Nach der Bearbeitung und Abspeicherung der Punktevariable wird der Zähler der for-Schleife um 1 erhöht.
Nun, ich hoffe, dass ihr mir weiterhelfen könnt und wisst, wie ich mir das vorstelle und das gerne programmieren würde.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kurtosis: wenn Du eine Funktion hast, die als Parameter eine Liste mit 9 Partien erwartet, dann ist das Ergebnis ja auch wieder eine Liste mit 9 Spielergebnissen oder ein Wörterbuch mit den Vereinen und ihren Punktgewinnen, oder was auch immer Du für sinnvoll hältst. Egal wie, Du mußt das Ergebnis für jeden Schleifendurchgang sammeln und erst nach der Schleife per return zurückgeben. Aber am besten zeigst Du mal Dein Programm, einer umgangssprachlichen Beschreibung kann man nur schwer folgen.
Benutzeravatar
Kurtosis
User
Beiträge: 55
Registriert: Samstag 11. Dezember 2010, 14:32

Also die Variablen der einzelnen Partien sind Listen und haben die folgende Gestalt:

Code: Alles auswählen

P_i = [int(Erwartungswert für Tore), int(Erwartungswert für Gegentore), TeamAPunkte, TeamBPunkte, "Team A", "Team B"]
Davon gibt es nun 9 Stück.

Die for-Schleife sieht nun folgendermaßen aus:

Code: Alles auswählen

def Punkteverteilung (x):
     for i in x:
          if i[0] > i[1]:
                  i[2] += 3
                  i[3] += 0
          elif i[0] < i[1]:
                  i[2] += 0
                  i[3] += 3
          else:
                  i[2] += 1
                  i[3] += 1

Punkteverteilung([P_1, P_2, P_3, P_4, P_5, P_6, P_7, P_8, P_9])
Ich habe schon bisschen was ausprobiert, aber leider ist es mir bisher noch nicht gelungen, die Punktevariablen korrekt zu bearbeiten.
BlackJack

@Kurtosis: Also erstmal hoffe ich das Du nicht wirklich neun Listen hast die an durchnummerierte Namen gebunden sind. Und dann solltest Du aufhören Listen für Werte zu verwenden die unterschiedliche Bedeutungen haben. Dafür sind Klassen besser geeignet weil man den Quelltext dann auch tatsächlich lesen und verstehen kann ohne dauernd überlegen zu müssen was die magischen Indexwerte bedeuten und Du hättest Dir vermutlich die Erklärung sparen können wie so eine Partie-Liste aufgebaut ist.

Die Aufteilung ist auch schlecht. Die Punkte eines Teams sollten in einer Datenstruktur für das Team gespeichert sein und nicht in einer die eine Partie repräsentiert. Denn ansonsten müsste man ja irgendwann noch einen Schritt einbauen der die Punkte aus den Partien für die verschiedenen Teams zusammenaddiert.
Antworten