Seite 1 von 1

befehl zum beenden eines programms

Verfasst: Dienstag 8. November 2011, 20:43
von ericwolf08
hallo,

hab mal ne frage und zwar müssen wir ein spiel in python programmieren, und im quellcode integrieren.
der befehl soll erreichen, dass das programm jederzeit beendet werden kann. das spiel wird in der console ausgegeben.
hat jemand ne idee??

gruß
Eric

Re: befehl zum beenden eines programms

Verfasst: Dienstag 8. November 2011, 21:11
von Hyperion
ericwolf08 hat geschrieben: hab mal ne frage und zwar müssen wir ein spiel in python programmieren, und im quellcode integrieren.
der befehl soll erreichen, dass das programm jederzeit beendet werden kann. das spiel wird in der console ausgegeben.
Und wo ist hier die Frage? ;-)
ericwolf08 hat geschrieben: hat jemand ne idee??
Ah... da! Aber keine präzise :-D

Du suchst einen "Befehl" zum Beenden eines Programms? Den gibt es nicht - Python kennt in dem Sinne kaum "Befehle", sondern nur Schlüsselwörter oder Funktionen (und Methoden).

``sys.exit`` wäre evtl. eine passende Funktion.

Solltest Du etwas anderes suchen, musst Du das noch mal genauer beschreiben!

Re: befehl zum beenden eines programms

Verfasst: Dienstag 8. November 2011, 21:27
von ericwolf08
Entwickeln Sie ein einfach zu bedienende Benutzungsschnittstelle auf Konsolenebene
die sich durch Tastatureingaben bedienen lässt. Das Interface soll dem
Anwender mindestens die folgende Möglichkeiten geben:
1. mit dem Beginn eines neuen Spieles zwischen den Optionen Computergegener
oder Menschlichergegner zu wäahlen,
2. für menschliche Spieler seinen Name einzugeben,
3. die nächsten Züge abzufragen, bis ein Spieler gewonnen hat,
4. dem Benutzer des Spieles die Möglichkeit bieten, das Spiel jederzeit zu Beenden
oder nach Ablauf eines Spieles eine Neue Runde zu starten.

Das ist die Aufgabenstellung.

Das hab ich bisher gemacht:

Code: Alles auswählen

def choose_enemy():
    x = str(input("Wollen sie einen Computergegner? (y/n):"))
    if x == "y":        # if input is y then play against computer
        print("Sie spielen gegen den Computer!")
        global p        # globae Variable für Spielernamen
        p = input("Bitte Namen eingeben: ")
    elif x == "n":      # if input is n then play against each other
        print("Sie spielen gegeneinandner!")
        global p_1      # globae Variable für Spielernamen
        p_1 = input("Bitte Namen von Spieler 1 eingeben: ")
        global p_2      # globae Variable für Spielernamen
        p_2 = input("Bitte Namen von Spieler 2 eingeben: ")
    else:
        print("Bitte Y oder N eingeben!")
        return choose_enemy()

    zug = input("Reset zum Neustarten. \nWas ist ihr nächster Zug?: ")
    if zug == "reset":
        choose_enemy()

        
choose_enemy()
ich muss also jeder zeit durch knopfdruck das spiel beenden können, egal wann.
Evtl. eine Funktion. die jedes mal überprüft ob die Taste gedrückt wurde und das spiel beendet wird.
Allerdings muss diese Funktion in allen anderen integriert werden...
bin noch anfänger in python, weiß nicht wie ich es besser ausdrücken kann sry ;)

Gruß
Eric

Re: befehl zum beenden eines programms

Verfasst: Dienstag 8. November 2011, 21:49
von Hyperion
Du musst den Code in Python-Code-Tags posten. Ansonsten geht die Einrückung flöten und man kann die Semantik kaum nachvollziehen.

Globale Variablen solltest Du vermeiden.

Namen, für deren Bedeutung Du einen Kommentar benötigst, sind schlecht. Wähle Namen so aussagekräftig, dass Du ihnen ohne Kommentar eine Bedeutung zuordnen kannst.

Laut Aufgabenstellung reicht es doch, dass Du Dir eine universelle Input-Funktion schreibst und in dieser ein Schlüsselwort testest, nach welchem Du dann das Programm per oben genannten ``sys.exit`` verlässt.

Re: befehl zum beenden eines programms

Verfasst: Dienstag 8. November 2011, 21:58
von BlackJack
@ericwolf08: Das ist kein guter Code. Zum einen solltest Du vergessen dass es ``global`` gibt, das verwendet man nicht, wenn man nicht recht schnell den Überblick verlieren möchte wie die einzelnen Teile eines Programms zusammenhängen. Und der andere im Grunde echte Fehler ist der rekursive Aufruf von `choose_enemy()`. Das wird früher oder später zu einem Programmabbruch führen. Python optimiert keine „tail calls“, das heisst mit jedem rekursiven Aufruf der nicht wieder zurück kehrt wächst der Speicher für den Aufrufstapel. CPython hat deswegen eine Begrenzung, die wenn sie erreicht wird, das Programm mit einem ``RuntimeError: maximum recursion depth exceeded`` abbricht.

Ich würde das „jederzeit“ auch nicht so streng auslegen wie Du. Es dürfte völlig ausreichen beim Zug halt neben den Spielzügen auch eine Eingabe vorzusehen, mit der man das Spiel abbrechen kann. Und da vielleicht auch erst einmal nur das Spiel und nicht gleich das Programm, und den Programmabbruch mit in die Frage integrieren ob man noch eine Runde spielen möchte. Wenn nicht, dann ist das Programm ja offensichtlich am Ende. Auf diese Weise braucht man auch keine Funktion die das Programm beendet.

Re: befehl zum beenden eines programms

Verfasst: Dienstag 8. November 2011, 22:06
von ericwolf08
@ Hyperion: falls ich die globale varible lösche, wie kann ich dann außerhalb der funktion auf die namen zugreifen?
und die input-funktion kann ich dann immer am ende von einer eingabe aufrufen lassen mit funktion() oder wie?

@BlackJack: wenn ich das aber nicht rekursiv mache, wie gestalte ich es dann, dass das programm nicht abbricht, wenn man nicht y oder n eingibt.
denn das programm soll nicht abstürzen sondern einfach wieder erneut fragen, und das geht mit meinem wissen nur durch das rekursive ;)
aber ich lass mich gerne belehren!

Gruß und vielen dank
eric

Re: befehl zum beenden eines programms

Verfasst: Dienstag 8. November 2011, 22:32
von Hyperion
ericwolf08 hat geschrieben:@ Hyperion: falls ich die globale varible lösche, wie kann ich dann außerhalb der funktion auf die namen zugreifen?
Sinnvoller Weise gar nicht!
ericwolf08 hat geschrieben:und die input-funktion kann ich dann immer am ende von einer eingabe aufrufen lassen mit funktion() oder wie?
Nein. Du kannst Dir doch eine Funktion schreiben, die neben der eigentlichen Eingabe auch immer auf ein spezielles Abbruchkommando lauscht. Wenn das eingegeben wurde, brichst Du das Programm einfach ab. Aber BlackJack hatte Dir ja auch schon gesagt, dass man es ggf. auch weniger strikt interpretieren kann und das einfach nur in der Haupt-Schleife testet.
ericwolf08 hat geschrieben: @BlackJack: wenn ich das aber nicht rekursiv mache, wie gestalte ich es dann, dass das programm nicht abbricht, wenn man nicht y oder n eingibt.
denn das programm soll nicht abstürzen sondern einfach wieder erneut fragen, und das geht mit meinem wissen nur durch das rekursive ;)
aber ich lass mich gerne belehren!
Indem Du eine Endlosschleife benutzt:

Code: Alles auswählen

while True:
    do_something
    if abbruch:
        break

Re: befehl zum beenden eines programms

Verfasst: Dienstag 8. November 2011, 22:33
von BlackJack
@ericwolf08: Auf lokale Namen kann man von aussen nicht zugreifen, aber man kann Objekte zurückgeben. Werte/Objekte die keine Konstanten sind, sollten Funktionen als Argumente betreten und als Rückgabewerte verlassen und nicht einfach innerhalb der Funktion „von irgend woher“ kommen beziehungsweise sollte eine Funktion nicht Namen ausserhalb an neue Werte binden.

Das kann man sich relativ einfach angewöhnen wenn man auf Modulebene erst gar keine Namen hat, die nicht an konstante Objekte gebunden sind. Den „Hauptcode“ der vielleicht bei Dir noch auf Modulebene steht, steckt man dafür auch in eine Funktion. Oft `main()` genannt und dann mit folgendem Idiom aufgerufen:

Code: Alles auswählen

if __name__ == '__main__':
    main()
Dann wird die Funktion nur aufgerufen wenn man das Modul als Programm startet, aber *nicht* wenn man es in einer Python-Shell oder in einem anderen Modul importiert. So kann man beispielsweise Funktionen in anderen Modulen wieder verwenden oder Funktionen interaktiv testen, zum Beispiel bei der Fehlersuche.

Jede Rekursion lässt sich auch mit Schleifen schreiben. Umgekehrt gilt das theoretisch auch, aber das sollte man nur mit Programmiersprachen machen, die das auch explizit durch Optimierungen unterstützen, denn sonst hat man dort immer das Problem dass der Aufrufstapel irgendwann „überläuft“. Also die Antwort ist: Eine Schleife die solange ausgeführt wird wie eine Bedingung wahr ist, beziehungsweise eine die „endlos“ ausgeführt wird und beim eintreten einer bestimmten Bedingung mit ``break`` verlassen wird.

Edit: Da war Hyperion schneller. :-)

Re: befehl zum beenden eines programms

Verfasst: Dienstag 8. November 2011, 23:24
von ericwolf08
Nein. Du kannst Dir doch eine Funktion schreiben, die neben der eigentlichen Eingabe auch immer auf ein spezielles Abbruchkommando lauscht. Wenn das eingegeben wurde, brichst Du das Programm einfach ab.
wie sieht so ein abbruchkommando aus? bzw. wie kann ich eine funktion die ganze zeit nebenher laufen lassen ohne input befehl, die reagiert wenn ich eine taste drücke?
Werte/Objekte die keine Konstanten sind, sollten Funktionen als Argumente betreten und als Rückgabewerte verlassen
und die rückgabewerte kann ich mit "return" ausgeben lassen?

Aber mit einer While-Schleife lass ich dem Benutzer ja keine möglichkeit seine eingabe erneut zu machen?!
Oder geht das noch?

Gruß
Eric

Re: befehl zum beenden eines programms

Verfasst: Dienstag 8. November 2011, 23:59
von BlackJack
@ericwolf08: Wie das Kommando zum Abbrechen aussieht was der Benutzer eingibt bestimmst Du selbst. Das mit der Funktion die nebenher auf einen Tastendruck wartet, vergisst Du am besten gleich wieder. So etwas wäre sehr stark von der Umgebung abhängig, und nicht wirklich einfach bei Textprogrammen zu lösen.

Rückgabewerte werden mit ``return`` nicht *aus-* sondern *zurück*gegeben. An den Aufrufer der Funktion. Und der kann dann etwas damit machen. Entweder direkt, oder den oder die Werte an Namen binden.

Wieso hat der Benutzer bei einer ``while``-Schleife keine Möglichkeit seine Eingabe erneut zu machen? Der Zweck von Schleifen ist es Code wiederholt auszuführen. Also zum Beispiel Code der den Benutzer nach einer Eingabe fragt.

Re: befehl zum beenden eines programms

Verfasst: Mittwoch 9. November 2011, 12:37
von ericwolf08
Oke, danke euch beiden für die Hilfe habs erledigt =)