Also mal ein paar Anmerkungen:
- In Zeile 11 hast Du ein Klammerpaar zu viel
- `return` ist in Python ein Statement und keine Funktion; also solltest Du das nicht klammern (Zeilen 12 & 17)
- Operatoren sollten immer durch Leerzeichen getrennt werden (außer innerhalb von Funktionsaufrufen):
Code: Alles auswählen
# falsch
score['human']+=1
# richtig
score['human'] += 1
- die Funktion `get_computerinput` kann man einfacher fomulieren:
Das Binden an eine lokale Variable ist hier unnötig, da der Name nur für das return-Statement aufgegriffen wird. Faustregel ist dabei (imho), dass man Objekte nur dann an Namen bindet, wenn man diesen Namen auch wirklich benötigt.
- in der Funktion `get_userinput` fände ich eine Fehlermeldung gut, wenn der Benutzer ein falsches Zeichen eingibt.
- Du verwendest `allowed_input` nicht konsequent (`get_computerinput`); damit ist der Vorteil einer globalen Definition quasi dahin
- in `show_winner` empfinde ich die Leerzeilen als störend.
- Shebang und Kodierungsangabe fehlen - muss natürlich nicht sein, aber bei einem "kompletten" Script gehört das imho dazu.
- Den Code ab Zeile 46 würde ich von Modulebene wegnehmen und in eine Funktion packen. Diese kann man dann über eine `main`-Funktion aufrufen.
Code: Alles auswählen
def main_loop():
win_score = get_winscore()
# ...
def main():
# sys.args parsen o.ä.
main_loop()
if __name__ == "__main__":
main()
Darüber hinaus würde ich als nächsten Schritt weg vom statischen Mensch vs. Computer und die Funktionen aus der neuen `main`-Funktion an die `main_loop`-Funktion übergeben. Damit hast Du einfach zwei Funktionen, die die Entscheidung eines Spielers ermitteln - ob das nun ein Mensch ist, oder der PC oder eben zwei Menschen ist ja für das Spiel (also die Auswertung, das Scoring usw) egal.
Falls Du das noch nicht gesehen hast, verweise ich noch mal auf meinen obigen Post und das dort verlinkte Script. Du kannst Funktionen - wie jedes Objekt in Python - an einen Namen binden oder als Parameter übergeben.
Code: Alles auswählen
In [11]: def foo():
....: print "Hallo"
....:
....:
In [12]: def bar():
....: print "Ciao"
....:
....:
In [13]: def logic(func):
....: func()
....:
....:
In [14]: logic(foo)
Hallo
In [15]: logic(bar)
Ciao
In [16]: f = foo
In [17]: f()
Hallo
Du brauchst also keine komplizierte Logik, um zu prüfen, welche Funktion Du für einen Spieler aufrufen musst, sondern übergibst einfach die gewünschte(n) Funktion(en) an Deine Spiellogik-Funktion und gut ist.
Die Namen `user_input` und `computer_input` passen dann natürlich nicht mehr; könnte man dann neutral `user_a` und `user_b` nennen¹ oder in eine Liste / Dict verpacken. Da Du ja bereits ein `score`-Dict hast, könnte man das um die Funktion erweitern? Ich würde dann noch `argparse` nutzen, um den `winscore` optional übergeben zu können und vor allem die Funktionen, welche die beiden Spielereingaben bestimmen.