Tischtennissimulation

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
insi
User
Beiträge: 2
Registriert: Dienstag 8. Dezember 2020, 18:17

Hallo an Alle,
ich lerne seit kurzem Python und sollte ein einfaches Programm schreiben, welches zwei Spieler mit Unterschiedlicher Gewinnchance gegeneinander Tischtennis spielen lässt.

Ein Satz ist gewonnen, wenn ein Spieler mindestens 11 Punkte und 2 Punkte mehr als der Gegner erzielt hat. Ich habe einen Satzsieg nun mit einer 'unendlichen' Schleife gelöst, welche vorzeitig beendet wird, sollten die genannten Bedingungen eintreten. Allerdings finde ich diese Lösung alles andere als elegant. Gibt es eine einfache Möglichkeit die Schleife eleganter zu gestalten? Hier ist mein bisheriger Code:


# Tischtennisspiel 60:40

from random import randint

Spielstand_Spieler_1 = 0
Spielstand_Spieler_1 = int(Spielstand_Spieler_1)

Spielstand_Spieler_2 = 0
Spielstand_Spieler_2 = int(Spielstand_Spieler_2)

unendlich=1

while unendlich > 0:

punkt_sieg = randint(1,100)


if punkt_sieg < 61:
Spielstand_Spieler_1 = Spielstand_Spieler_1 + 1


if punkt_sieg > 60:
Spielstand_Spieler_2 = Spielstand_Spieler_2 + 1


if (Spielstand_Spieler_1 >= 11) and ((Spielstand_Spieler_2 + 2) <= Spielstand_Spieler_1):
break

if (Spielstand_Spieler_2 >= 11) and ((Spielstand_Spieler_1 + 2) <= Spielstand_Spieler_2):
break


Satz = [
[['Spieler_1'], Spielstand_Spieler_1],
[['Spieler_2'], Spielstand_Spieler_2],
[['Ergebnis'], Spielstand_Spieler_1, ':', Spielstand_Spieler_2]
]


print('Das Ergebnis des Satzes lautet:', Satz[2])


Viele Grüße
insi
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Mit Spielstand_Spieler_1 = 0 ist die Variable schon vom Typ int. Das nochmal umzuwandeln ist unnötig.
Seit wann hat unendlich den Wert 1. Für eine Endlosschleife benutzt man einfach while True.
Wenn man eine if-Bedingung hat, die genau das Gegenteil der vorangegangenen if-Bedingung ist, dann benutzt man else.
Was soll diese Listen von Listen von Listen in Satz? Man speichert Daten in Listen, nicht halb vorformatierte Strings.
insi
User
Beiträge: 2
Registriert: Dienstag 8. Dezember 2020, 18:17

Danke erstmal für die Verbesserungsvorschläge, hab das dementsprechend nochmal überarbeitet. Bei dem int muss ich mir echt an den Kopf fassen :oops:
Und das mit den Listen ist nichts endgültiges, war nur meine anfängliche Überlegung die einzelnen Ergebnisse irgendwie übersichtlich abzurufen.

Grüße
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Beim Programmieren will man möglichst generell anwendbare Funktionen schreiben.
Hier mal eine Variante, die man einfach auf 100 gleichzeitig gegeneinander spielende Tennisspieler erweitern kann:

Code: Alles auswählen

from random import choices

SCORE_WEIGHTS = [60, 40]

def main():
    player_scores = [0] * len(SCORE_WEIGHTS)
    while True:
        print(player_scores)
        choice = choices(range(len(SCORE_WEIGHTS)), weights=SCORE_WEIGHTS)[0]
        player_scores[choice] += 1
        best_score, second_best_score = sorted(player_scores, reverse=True)[:2]
        if best_score >= max(11, second_best_score + 2):
            break
    print('Das Ergebnis des Satzes lautet:', ':'.join(map(str, player_scores)))

if __name__ == '__main__':
    main()
Antworten