Python: Eingabe wird verworfen
Pot
- programmiertechnik
Salut,
habe mich vor einigen Tagen an python rangewagt und nun dank einer Erinnerung eines C++-Tutorials ein kleines Spielchen geschrieben.
Leider steh ich zur Zeit total an.
Sobald der Benutzer "t" eintippt, sollte ein Tipp kommen, nach dem Tipp kann er wieder das normale Spiel fortsetzen. Ab diesem Moment ist seine Eingabe einfach "none". Habe lange gepröbelt und das Script auf den Kopf gestellt, komme leider einfach nicht weiter.
[code=python]#!/usr/bin/env python
import sys
def main():
muenz = int(raw_input('Wieviele Münzen liegen auf dem Tisch? '))
def human(muenz):
print 'Sie [%d]: ' % (muenz),
abziehen = raw_input()
if abziehen == 't':
tipp = muenz % 4
if tipp == 0:
tipp = 1
print tipp
human(muenz)
else:
abziehen = int(abziehen)
while abziehen in range(1, 4):
return 100
break
else:
print 'Schiedsrichter [%d]: Du darfst nur eine, zwei oder drei Münzen entfernen' % muenz
return muenz
def computer(muenz):
abziehen = muenz % 4
if abziehen == 0:
abziehen = 1
print 'Computer [%d]: %d' % (muenz, abziehen)
return muenz - abziehen
while muenz > 0:
muenz = human(muenz)
print muenz
if muenz <= 0:
print 'Mensch hat gewonnen!'
sys.exit()
muenz = computer(muenz)
if muenz <= 0:
print 'Maschine hat gewonnen!'
sys.exit()
if __name__ == "__main__":
main()[/code]
Mit freundlichen Gruessen,
Pot
echo $begrüßung;
habe mich vor einigen Tagen an python rangewagt und nun dank einer Erinnerung eines C++-Tutorials ein kleines Spielchen geschrieben.
Du solltest deine C/C++-Kenntnisse beiseite legen, wenn du Python programmierst. Das sieht nicht besonders gut aus, was du da hingezaubert hast.
Sobald der Benutzer "t" eintippt, sollte ein Tipp kommen, nach dem Tipp kann er wieder das normale Spiel fortsetzen. Ab diesem Moment ist seine Eingabe einfach "none".
Du setzt nicht das normale Spiel fort, du rufst nach dem "t" die Funktion human rekursiv auf. Wenn darin kein "t" eingegeben wurde, landest du im else-Zweig von if abziehen == 't'. Duort gibst du mit return etwas zurück. Damit kehrst du wieder in den ursprünglichen Aufruf von human() zurüch und da dort keine weitere Anweisung auszuführen ist, beendet sich human(), und gibt dabei nichts zurück ...
Soweit dazu. Gestattest du noch ein paar allgemeine Bemerkungen?
if __name__ == "__main__":
main()[/code]
Hast du vor, das als eingebundenes Modul laufen lassen zu können? Dann solltest du aber auch auf Dinge wie sys.exit() verzichten. Wenn nicht, kannst du das Hauptprogramm auch direkt und ohne main() laufen lassen (denn das ist typisch C und unter Python nicht nötig).
Es besteht auch keine Notwendigkeit, die Funktionen human() und computer() innerhalb von main() anzusiedeln.
while abziehen in range(1, 4):
return 100
break
else:
print 'Schiedsrichter [%d]: Du darfst nur eine, zwei oder drei Münzen entfernen' % muenz
return 100
Hier reicht zum einen ein einfaches if statt einer Schleife. Die Schleife bricht sowieso im ersten Durchlauf ab, indem die Funktion ganz verlassen wird und auch der else veranlasst ein Verlassen der Funktion. Außerdem ist das break überflüssig, da es wegen des vorangehenden return niemals ausgeführt wird.
echo "$verabschiedung $name";
echo $begrüßung;
print 'guten tag'
Du setzt nicht das normale Spiel fort, du rufst nach dem "t" die Funktion human rekursiv auf. Wenn darin kein "t" eingegeben wurde, landest du im else-Zweig von if abziehen == 't'. Duort gibst du mit return etwas zurück. Damit kehrst du wieder in den ursprünglichen Aufruf von human() zurüch und da dort keine weitere Anweisung auszuführen ist, beendet sich human(), und gibt dabei nichts zurück
Das erklärt einiges.
Soweit dazu. Gestattest du noch ein paar allgemeine Bemerkungen?
Immer her damit!
if __name__ == "__main__":
main()
Hast du vor, das als eingebundenes Modul laufen lassen zu können? Dann solltest du aber auch auf Dinge wie sys.exit() verzichten. Wenn nicht, kannst du das Hauptprogramm auch direkt und ohne main() laufen lassen (denn das ist typisch C und unter Python nicht nötig).
Nein eigentlich nicht. Diese Weise hat mir jemand empfohlen, falls es einfach dazu kommen sollte, es als Modul zu benutzen.
Es besteht auch keine Notwendigkeit, die Funktionen human() und computer() innerhalb von main() anzusiedeln.
Ok.
while abziehen in range(1, 4):
return 100
break
else:
print 'Schiedsrichter [%d]: Du darfst nur eine, zwei oder drei Münzen entfernen' % muenz
return 100Hier reicht zum einen ein einfaches if statt einer Schleife. Die Schleife bricht sowieso im ersten Durchlauf ab, indem die Funktion ganz verlassen wird und auch der else veranlasst ein Verlassen der Funktion. Außerdem ist das break überflüssig, da es wegen des vorangehenden return niemals ausgeführt wird.
Die Schleife hab ich nur eingebaut damit es wieder "zurückspickt" falls eine falsche Zahl angegeben wurde.
echo "$verabschiedung $name";
print 'tschuess', name