Script komplett neu starten lassen

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
Cruise
User
Beiträge: 2
Registriert: Samstag 9. Dezember 2023, 14:36

Hi zusammen,

ich habe jetzt schon seit einer Stunde gesucht und auch einiges probiert aber klappt irgendwie alles nicht so richtig.

Ich lerne seit gestern erst Python, vorher keine Berührung damit gehabt.

Ich möchte folgendes Script ausführen und ganz unten möchte ich anbinden:

Neustart ? J / N

wenn man J drückt, soll das ganze Script neu ausgeführt werden damit eine neue Random zahl erzeugt wird, bei N soll sich das Programme einfach schließen.

Vielen Dank im Voraus für Hilfe

Code: Alles auswählen


import random

print("Hallo, ich bin der erste Versuch eines eigenen Programms")
print()

name = input("Wie ist dein Name ? ")
value1 = random.randint(0, 100)
counter = 0

print("Freut mich dich kennen zu lernen " + name)
print()

print("Ich habe mir soeben eine Zahl zwischen 1 und 100 ausgedacht, schaffst du diese zu erraten in 7 Versuche ?")
print()
value2 = None

while value2 != value1 and counter < 7:
    value2 = int(input("Gebe eine Zahl als Tipp ab: "))
    counter += 1
    if value2 < value1:
        print("Deine eingegebene Zahl ist kleiner als die gesuchte Zahl")
        print()
    elif value2 > value1:
        print("Deine eingegebene Zahl ist größer als die gesuchte Zahl")
        print()
    else:
        print()
        print(str("Herzlichen Glückwunsch, du hast die Korrekte Zahl in ") + str(counter) + str(" Versuche herausgefunden !!"))

if counter == 7:
    print()
    print()
    print("Die 7 versuche sind voll aufgebraucht")
    print("Die gesuchte Zahl war: ** " + str(value1) + " **")

print()
print("Danke das Du mitgemacht hast " + name)
print()
print()
print()
input("Möchtest Du neu starten ? ( J / N )")



Sirius3
User
Beiträge: 17777
Registriert: Sonntag 21. Oktober 2012, 17:20

while-Schleifen kennst Du ja schon, Du brauchst also nur eine große Schleife um das gesamte Programm.
Namen sollten aussagekräftig sein, value1 und value2 sind das nicht. Das eine ist die Geheimzahl, das andere der Rateversuch, also `secret` und `guess`.
Wenn man eine Variable mit einem Dummy-Wert belegen muß, nur damit die Schleife losläuft, ist das ein Zeichen dafür, dass man eigentlich eine while-True-Schleife hat, bei der die Bedingung im Schleifenkörper geprüft wird, und die mit break verlassen wird. Hier bei Dir hast Du noch einen zusätzlichen Zähler, den man über eine for-Schleife abbilden könnte.
Strings stückelt man nicht mit + zusammen, vor allem wandelt man keine Strings per str wieder in einen String um. Statt dessen benutzt man Formatstrings.
Die Aussage, dass die Zahle zwischen 1 und 100 liegt, ist falsch. Bei exakt sieben Versuchen wird sowohl "Herzlichen Glückwunsch" als auch "die gesucht Zahl war ..." ausgegeben.

Das ganze könnte also ungefähr so aussehen:

Code: Alles auswählen

import random


while True:
    print("Hallo, ich bin der erste Versuch eines eigenen Programms")
    print()

    name = input("Wie ist dein Name ? ")
    print(f"Freut mich dich kennen zu lernen {name}")
    print()

    secret = random.randint(1, 100)
    print("Ich habe mir soeben eine Zahl zwischen 1 und 100 ausgedacht, schaffst du diese zu erraten in 7 Versuche ?")
    print()
    for counter in range(1, 8):
        guess = int(input("Gebe eine Zahl als Tipp ab: "))
        if guess < secret:
            print("Deine eingegebene Zahl ist kleiner als die gesuchte Zahl")
            print()
        elif guess > secret:
            print("Deine eingegebene Zahl ist größer als die gesuchte Zahl")
            print()
        else:
            print()
            print(f"Herzlichen Glückwunsch, du hast die Korrekte Zahl in {counter} Versuche herausgefunden !!")

    if counter == 7:
        print()
        print()
        print("Die 7 versuche sind voll aufgebraucht")
        print(f"Die gesuchte Zahl war: ** {secret} **")

    print()
    print(f"Danke das Du mitgemacht hast {name}")
    print()
    print()
    print()
    again = input("Möchtest Du neu starten ? ( J / N )")
    if again.upper() != 'J':
        break
Benutzeravatar
__blackjack__
User
Beiträge: 13151
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Cruise: Ergänzend zur Antwort von Sirius3: Das die Textausgaben nicht mit den intern verwendeten Zahlen übereinstimmen, verhindert man in dem es für solche Werte nur eine „Quelle der Wahrheit“ gibt: entsprechende Konstanten. Also statt 1 und 100 sowohl in dem Funktionsaufruf als auch im Text zu wiederholen, definiert man für Unter- und Obergrenze je eine Konstante, und verwendet die beim Aufruf und in der Textausgabe. Dann stimmt beides immer überein, und wenn man da mal etwas ändert, muss man das nur an einer Stelle im Quelltext tun.

Das gleiche gilt zum Beispiel auch für die Anzahl der Versuche.

Im Beispiel von Sirius3 fehlt der Abbruch der Schleife wenn die Zahl erraten wurde. Und an der Stelle kann man sich dann auch mal ``else`` zu einer Schleife anschauen, denn so lässt sich auch einfach die Ausgabe vom Erfolgsfall *und* dem letzten Rateversuch verhindern.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import random

LOWER_LIMIT = 1
UPPER_LIMIT = 100
TRIAL_COUNT = 7


def main():
    while True:
        print("Hallo, ich bin der erste Versuch eines eigenen Programms.")
        print()

        name = input("Wie ist dein Name? ")
        print(f"Freut mich dich kennen zu lernen {name}.")
        print()

        secret = random.randint(LOWER_LIMIT, UPPER_LIMIT)
        print(
            f"Ich habe mir soeben eine Zahl zwischen {LOWER_LIMIT} und"
            f" {UPPER_LIMIT} ausgedacht, schaffst du diese zu erraten in"
            f" {TRIAL_COUNT} Versuchen?"
        )
        print()
        for counter in range(1, TRIAL_COUNT + 1):
            guess = int(input("Gebe eine Zahl als Tipp ab: "))
            if guess < secret:
                print(
                    "Deine eingegebene Zahl ist kleiner als die gesuchte Zahl."
                )
                print()
            elif guess > secret:
                print(
                    "Deine eingegebene Zahl ist größer als die gesuchte Zahl."
                )
                print()
            else:
                print()
                print(
                    f"Herzlichen Glückwunsch, du hast die korrekte Zahl in"
                    f" {counter} Versuche(n) herausgefunden!"
                )
                break
        else:
            print()
            print()
            print("Die {TRIAL_COUNT} Versuche sind voll aufgebraucht.")
            print(f"Die gesuchte Zahl war: ** {secret} **.")

        print()
        print(f"Danke das Du mitgemacht hast {name}.")
        print()
        print()
        print()
        if input("Möchtest Du neu starten ? ( J / N )") != "J":
            break


if __name__ == "__main__":
    main()
Das bei jeder Runde der Name neu erfragt wird, ist IMHO ein logischer Fehler. Der ändert sich ja nicht jedes mal wenn man eine weiteres mal spielt.

Der nächste sinnvolle Schritt wäre es das Programm gegen Fehleingaben abzusichern, so dass es nicht mehr mit einer Ausnahme beendet wird, wenn der Benutzer bei der Zahl etwas eingibt, was sich nicht umwandeln lässt.

Und auch wenn dieser Code nur an einer Stelle im Programm vorkommt, und man den da direkt hin schreiben könnte, ist das *jetzt* schon etwas sehr lang und komplex für eine einzelne Funktion.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Cruise
User
Beiträge: 2
Registriert: Samstag 9. Dezember 2023, 14:36

Vielen Dank euch für die Antworten und die nützlichen Tipps.
ich versuche das in Zukunft zu beachten,

Vielen DANK !
Benutzeravatar
DeaD_EyE
User
Beiträge: 1025
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Ich würde die Eingabe des Nutzers noch in Kleinbuchstaben umwandeln.
Hier der alte Code:

Code: Alles auswählen

if input("Möchtest Du neu starten ? ( J / N )") != "J":

Änderung:

Code: Alles auswählen

if input("Möchtest Du neu starten ? ( J / N )").lower() != "j":
Das hat den Vorteil, dass man als Nutzer J und j als Antwort eingeben kann.
Jede andere Eingabe führt zum Abbruch der Schleife.
Also auch ein X würde das Programm beenden.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten