Pot: Python: Eingabe wird verworfen

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

-*- coding: utf-8 -*-

Ein kleines Spiel gegen den Computer

Copyright (c) 2007 Remo Wenger

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

--
For Windows-Problems -> reboot
For Linux-Problems -> be root!
  1. 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";

    1. 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 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.

      Die Schleife hab ich nur eingebaut damit es wieder "zurückspickt" falls eine falsche Zahl angegeben wurde.

      echo "$verabschiedung $name";

      print 'tschuess', name

      --
      For Windows-Problems -> reboot
      For Linux-Problems -> be root!