#Dieses Python-Programm erstellt eine Teilnehmerliste und ruft das Spiel ZickZack10 für jeden Teilnehmer auf. 
#Am Ende werden die Ergebnisse aller Teilnehmer und der beste Teilnehmer ausgegeben.
import random

class ZickZack_10:
    def __init__(self):
        self.zeitvorgabe = 30
        self.entfernungstabelle_einlesen()
        self.pneuro_liste_einlesen()

        self.alleStationen = "Start"
        self.stationsliste = []
        self.zeit = 0
        self.pneuro = 0

        print("\n-------------Starte dein Rennen!_________________")
        print("")

    def wuerfle_und_fahre(self):
        if len(self.stationsliste) == 0:
            self.aktStation = 0
            self.stationsliste.append(self.aktStation)

        self.nextStation = random.randint(1, 10)
        self.entfernungswert_finden()

        print("___________________ Du hast gewürfelt__________________\n")
        if self.zeitvorgabe - self.zeit > 0:
            print(f"Von Nr. {self.aktStation} --> Nr. {self.nextStation}\nZeit: {self.entfernung} ZE.")
            print(f"Restzeit {self.zeitvorgabe - self.zeit} ZE.\n")
            self.aktStation = self.nextStation
            self.stationsliste.append(self.nextStation)

            self.wuerfle_und_fahre()
        else:
            print("Deine nächste Station überschreitet das Zeitlimit.\nDein Rennen ist beendet.\n")
            self.fertig()

    def stationen_eingeben_pneuro_ausgabe(self):
        self.stationsliste.clear()
        e = input("Stationsliste mit Leerzeichen eingeben: ")
        stations = e.split()
        for s in stations:
            self.stationsliste.append(int(s))
        self.fertig()

    def fertig(self):
        #pneuro = 0
        for z in self.stationsliste[1:]:
            self.pneuro += self.pnrfeld[z-1][1]
            self.alleStationen += f" -> {z}"

        print("Deine Stationen: ", " -> ".join(map(str, self.stationsliste)) + " -> Ziel!")
        print(f"Du hast {self.pneuro} Pneuros gewonnen.")
        self.stationsliste.clear()
        self.zeit = 0

    def entfernungstabelle_einlesen(self):
        try:
            with open("entfernung.csv", "r") as file:
                self.feld = [list(map(int, line.strip().split(";"))) for line in file]
        except FileNotFoundError:
            print("Textdatei nicht gefunden!")

    def pneuro_liste_einlesen(self):
        try:
            with open("pneuros.csv", "r") as file:
                self.pnrfeld = [[i+1, int(value)] for i, value in enumerate(file.readline().strip().split(";"))]
        except FileNotFoundError:
            print("Textdatei nicht gefunden!")

    def entfernungswert_finden(self):
        self.entfernung = self.feld[self.aktStation + 1][self.nextStation + 1]
        self.zeit += self.entfernung

    def pneuro_tabelle_ausgeben(self):
        for row in self.pnrfeld:
            print(" | ".join(map(lambda x: f"{x:>2}", row)))

    def entfernungstabelle_ausgeben(self):
        for row in self.feld:
            print(" | ".join(map(lambda x: f"{x:>2}", row)))
            
class TeilnehmerListe:
    def __init__(self, a):
        self.a = a
        self.tnListe = [["" for _ in range(a)] for _ in range(2)]
        self.bester = ZickZack_10()
        self.score = 0

        for i in range(a):
            teilnehmer = ZickZack_10()
            teilnehmer.wuerfle_und_fahre()

            if self.score < teilnehmer.pneuro:
                self.score = teilnehmer.pneuro
                self.bester = teilnehmer

            self.tnListe[0][i] = str(teilnehmer.pneuro)
            self.tnListe[1][i] = teilnehmer.alleStationen

    def ausgabe_alle(self):
        print("")
        print("____________________________________________________________")
        for i in range(self.a):
            print(f"Tnr.: {i + 1} Pneuro: {self.tnListe[0][i]}     Stationen: {self.tnListe[1][i]}")

    def ausgabe_bester(self):
        print(f"Bester Teilnehmer:  Pneuro: {self.bester.pneuro}     Stationen: {self.bester.alleStationen}")

spiel = ZickZack_10()
spiel.wuerfle_und_fahre()
# Annahme: ZickZack10 Klasse ist bereits in Python implementiert
liste = TeilnehmerListe(10)
liste.ausgabe_alle()
liste.ausgabe_bester()
