Python Forum

Full Version: i want to shorten a working section
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
i have a working little number guessing game but there is one long repetitiv section that i dont know how to shorten (the section is beneth the line "if durchschnitt2"(line 118) (the hole code is in german if thats a problen i will translate it))
import random
werte = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
durchschnitt2 = False
def deutsch():
    runig = True
    while runig:
        while True:
            while True:
                try:
                    runden = int(input("wie viele runden wilst du speilen?:"))
                except ValueError:
                    print ("ungültiger wert. versuche es noch einmal")
                    print ("----------------------------------")
                else:
                    break
            if runden > 15:
                print ("maximal 15 runden")
            else:
                break

        for runde in range (runden):
            runde = runde + 1
            print ("----------------------------------")
            print (f"runde {runde}")
            while True:
                while True:
                    while True:
                        try:
                            low = int(input("was soll das minimum sein?:"))
                        except ValueError:
                            print ("ungültiger wert. versuche es noch einmal")
                            print ("----------------------------------")
                        else:
                            break
                    if low < -500000:
                        print ("minimal -500,000")
                    else:
                        break
                print ("----------------------------------")
                while True:
                    while True:
                        try:
                            high = int(input("was soll das maximum sein?:"))
                        except ValueError:
                            print ("ungültiger wert. versuche es noch einmal")
                            print ("----------------------------------")
                        else:
                            break
                    if high > 500000:
                        print ("maximal 500,000")
                    else:
                        break
                if low > high:
                    print ("----------------------------------")
                    print("das minimum kann nicht mehr als das maximum sein")
                    print ("----------------------------------")
                else:
                    break
            print ("----------------------------------")
            number = random.randint(low,high)
            if not durchschnitt2:
                guesses = 0
                while True:
                    while True:
                        try:
                            guessesnuber = int(input("wie viele versuch wilst du haben?:"))                    
                        except ValueError:
                            print ("ungültiger wert. versuche es noch einmal")
                            print ("----------------------------------")
                        else:
                            break
                        
                    if guessesnuber > 100:
                        print("maximal 100 versuche")
                    else:
                        break
                print ("----------------------------------")
                print (f"du hast {guessesnuber} versuche")
            else:
                guesses = 0
                guessesnuber = 9999999999999999999999999999
                print ("----------------------------------")
                print (f"du hast {guessesnuber} versuche")
            while True:
                while True:
                    try:
                        guess = int(input(f"nummer zwischen ({low} - {high}):"))
                    except ValueError:
                        print ("ungültiger wert. versuche es noch einmal")
                        print ("----------------------------------")
                    else:
                        break
                guesses = guesses+1
            
                if guess > high:
                    print (f"das ist mehr als {high}")
                elif guess < low:
                    print(f"das ist weniger als {low}")
                elif guess > number:
                    print (f"{guess} ist zu viel")
                elif guess < number:
                    print (f"{guess} ist zu wenig") 
                else:
                    print (f"{guess} ist richtig!")
                    break
                if guesses == guessesnuber:
                    print (f"du hast zu viele versuche gebraucht")
                    break
                else:
                    print (f"du hast noch {guessesnuber-guesses} versuche")
                if guess < number and not guess < low:
                   low = guess
                elif guess > number and not guess > high:
                    high = guess
                print ("----------------------------------")
            if guess == number:
                print (f"du hast {guesses} versuche gebraucht")
                if durchschnitt2:
                    if runde == 1:
                        werte[0] = guesses
                        durchschnitt1 = werte[0]
                    elif runde == 2:
                        werte[1] = guesses
                        durchschnitt1 = durchschnitt1+werte[1]
                    elif runde == 3:
                        werte[2] = guesses
                        durchschnitt1 = durchschnitt1+werte[2]
                    elif runde == 4:
                        werte[3] = guesses
                        durchschnitt1 = durchschnitt1+werte[3]
                    elif runde == 5:
                        werte[4] = guesses
                        durchschnitt1 = durchschnitt1+werte[4]
                    elif runde == 6:
                        werte[5] = guesses
                        durchschnitt1 = durchschnitt1+werte[5]
                    elif runde == 7:
                        werte[6] = guesses
                        durchschnitt1 = durchschnitt1+werte[6]
                    elif runde == 8:
                        werte[7] = guesses
                        durchschnitt1 = durchschnitt1+werte[7]
                    elif runde == 9:
                        werte[8] = guesses
                        durchschnitt1 = durchschnitt1+werte[8]
                    elif runde == 10:
                        werte[9] = guesses
                        durchschnitt1 = durchschnitt1+werte[9]
                    elif runde == 11:
                        werte[10] = guesses
                        durchschnitt1 = durchschnitt1+werte[10]
                    elif runde == 12:
                        werte[11] = guesses
                        durchschnitt1 = durchschnitt1+werte[11]
                    elif runde == 13:
                        werte[12] = guesses
                        durchschnitt1 = durchschnitt1+werte[12]
                    elif runde == 14:
                        werte[13] = guesses
                        durchschnitt1 = durchschnitt1+werte[13]
                    elif runde == 15:
                        werte[14] = guesses
                        durchschnitt1 = durchschnitt1+werte[14]
                    
            elif guesses == guessesnuber:
                print (f"du hast es nicht eraten die numer war {number}")
        if durchschnitt2:
            durchschnitt = durchschnitt1/runden    
            print (f"dein durchschnitt ist {durchschnitt}")
        if not input ("nochmal spielen? (ja/nein):").lower() == "ja":
            runig = False
        else:
            print ("----------------------------------")
(sorry for the long code.)
the section is to calculate the average of how many trys it took you to find the number.
You could do
if 1 <= runde <= 15:
    werte[runde-1] = guesses
    if runde == 1:
        durchschnitt1 = guesses
    else:
        durchschnitt1 += guesses
You repeat this pattern in your code:
            while True:
                try:
                    runden = int(input("wie viele runden wilst du speilen?:"))
                except ValueError:
                    print ("ungültiger wert. versuche es noch einmal")
                    print ("----------------------------------")
                else:
                    break
            if runden > 15:
                print ("maximal 15 runden")
            else:
                break
Only write code once and reuse.
def int_input(prompt, max_value=None, min_value=None):
    while True:
        try:
            value = int(input(prompt))
            if max_value is not None and value > max_value:
                print(f"maximal {max_value} runden")
            elif min_value is not None and value < min_value:
                print(f"minimal {min_value} runden")
            else:
                return value
        except ValueError:
            print("ungültiger wert. versuche es noch einmal")
            print("----------------------------------")


runden = int_input("wie viele runden wilst du speilen?: ", max_value=15)
low = int_input("was soll das minimum sein?: ", min_value=-500000)
high = int_input("was soll das maximum sein?: ", max_value=500000)
print(runden, low, high)
Combined with the suggestion from Gribouillis you can get some substantial code reduction. This is untested:
import random


durchschnitt2 = False


def int_input(prompt, max_value=None, min_value=None):
    while True:
        try:
            value = int(input(prompt))
            if max_value is not None and value > max_value:
                print(f"maximal {max_value} runden")
            elif min_value is not None and value < min_value:
                print(f"minimal {min_value} runden")
            else:
                return value
        except ValueError:
            print("ungültiger wert. versuche es noch einmal")
            print("----------------------------------")


def deutsch():
    while True:
        runden = int_input("wie viele runden wilst du speilen?:", max_value=15)

        for runde in range(1, runden + 1):
            print("----------------------------------")
            print(f"runde {runde}")
            while True:
                low = int_input("was soll das minimum sein?:", min_value=-500000)
                high = int_input("was soll das maximum sein?:", max_value=500000)
                if low > high:
                    print("----------------------------------")
                    print("das minimum kann nicht mehr als das maximum sein")
                    print("----------------------------------")
                else:
                    break
            print("----------------------------------")
            number = random.randint(low, high)
            if not durchschnitt2:
                guesses = 0
                guessesnuber = int_input("wie viele versuch wilst du haben?:", max_value=100)
                print("----------------------------------")
                print(f"du hast {guessesnuber} versuche")
            else:
                guesses = 0
                guessesnuber = 9999999999999999999999999999
                print("----------------------------------")
                print(f"du hast {guessesnuber} versuche")

            for guesses in range(guessesnuber):
                guess = int_input(f"nummer zwischen ({low} - {high}):", min_value=low, max_value=high)
                if guess == number:
                    print(f"{guess} ist richtig!")
                    break
                if guess > number:
                    print(f"{guess} ist zu viel")
                    high = guess
                else:
                    print(f"{guess} ist zu wenig")
                    low = guess
                print(f"du hast noch {guessesnuber-guesses} versuche")
                print("----------------------------------")

            if guesses < guessesnuber:
                print(f"du hast {guesses} versuche gebraucht")
                if durchschnitt2:
                    if runde == 1:
                        durchschnitt1 = guesses
                    else:
                        durchschnitt1 += guesses
            else:
                print(f"du hast zu viele versuche gebraucht")
                print(f"du hast es nicht eraten die numer war {number}")
        if durchschnitt2:
            durchschnitt = durchschnitt1 / runden
            print(f"dein durchschnitt ist {durchschnitt}")
        if not input("nochmal spielen? (ja/nein):").lower() == "ja":
            return
        print("----------------------------------")


deutsch()
thaks for the help but the untested code is not that good but still this helpt a lot so thx
the flaw is that not ewrything is a "runde" so a rund to play
but you probebly did this in 1 min so im not mad or smt like that
you are way better at coding than me and the fact that it is untested is also impresiv
i woudnt be able to do smt like that without testing so thank you werry much
(sorry for bad spelling)
i ficst my problem with it :
def int_input(prompt, type, max_value=None, min_value=None):
    while True:
        try:
            value = int(input(prompt))
            if max_value is not None and value > max_value:
                print(f"maximal {max_value} {type}")
            elif min_value is not None and value < min_value:
                print(f"minimal {min_value} {type}")
            else:
                return value
        except ValueError:
            print("ungültiger wert. versuche es noch einmal")
            print("----------------------------------")
 
 
runden = int_input("wie viele runden wilst du speilen?: ", "runden", max_value=15)
low = int_input("was soll das minimum sein?: ", "" , min_value=-500000)
high = int_input("was soll das maximum sein?: ", "" ,max_value=500000)
print(runden, low, high)
I think I understand the program better now, but I could be wrong.
import random


def int_input(prompt, value_type="", max_value=None, min_value=None):
    while True:
        try:
            value = int(input(prompt))
            if max_value is not None and value > max_value:
                print(f"maximal {max_value}{value_type}")
            elif min_value is not None and value < min_value:
                print(f"minimal {min_value}{value_type}")
            else:
                return value
        except ValueError:
            print("ungültiger wert. versuche es noch einmal")
            print("----------------------------------")


def deutsch(durchschnitt=False):
    count = 0
    runden = int_input("wie viele runden wilst du speilen?: ", " rundden", max_value=15)
    for runde in range(1, runden + 1):
        print("----------------------------------")
        print(f"runde {runde}")
        while True:
            low = int_input("was soll das minimum sein?: ", min_value=-500000)
            high = int_input("was soll das maximum sein?: ", max_value=500000)
            if low > high:
                print("----------------------------------")
                print("das minimum kann nicht mehr als das maximum sein")
                print("----------------------------------")
            else:
                break
        print("----------------------------------")
        number = random.randint(low, high)
        if durchschnitt:
            guessesnuber = None  # Unlimited guesses
        else:
            guessesnuber = int_input("wie viele versuch wilst du haben?: ", max_value=min(100, high-low))

        guesses = 0
        while True:
            guesses += 1
            guess = int_input(f"nummer zwischen ({low} - {high}): ", min_value=low, max_value=high)
            if guess == number:
                print(f"{guess} ist richtig!")
                print(f"du hast {guesses} versuche gebraucht")
                if durchschnitt:
                    count += guesses
                else:
                    count += 1
                break
            if guess > number:
                print(f"{guess} ist zu viel")
                high = guess
            else:
                print(f"{guess} ist zu wenig")
                low = guess
            if guessesnuber is not None:
                if guesses >= guessesnuber:
                    print(f"du hast zu viele versuche gebraucht")
                    print(f"du hast es nicht eraten die numer war {number}")
                    break
                print(f"du hast noch {guessesnuber-guesses} versuche")
            print("----------------------------------")

    if durchschnitt:
        print(f"dein durchschnitt ist {count / runden}")
    else:
        print(f"{count} von {runden} versuchen erfolgreich absolviert.")


while True:
    deutsch()
    print("----------------------------------")
    if input("nochmal spielen? (ja/nein): ").lower() != "ja":
        break
I split the replay loop out of deutch() (strange name for a guessing game). Try to make functions that does something you can describe in a few short sentences. I pass durchschnitt in as a variable because global variables are bad and should be avoided.
deutsch in german for german
i have the game in 3 difrent langues
i did the value_type thing two on my own yay


heres the entire thing i have now
import random
werte = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
durchschnitt2 = False
def int_input_de(prompt, type, max_value=None, min_value=None):
    while True:
        try:
            value = int(input(prompt))
            if max_value is not None and value > max_value:
                print(f"maximal {max_value} {type}")
            elif min_value is not None and value < min_value:
                print(f"minimal {min_value} {type}")
            else:
                return value
        except ValueError:
            print("ungültiger wert. versuche es noch einmal")
            print("----------------------------------")

def deutsch():
    runig = True
    while runig:
        runden = int_input_de("wie viele runden wilst du speilen?:", "runden", max_value=15)
        for runde in range (runden):
            runde = runde + 1
            print ("----------------------------------")
            print (f"runde {runde}")
            while True:
                low = int_input_de("was soll das minimum sein?:", "", max_value=None, min_value=-500000)
                print ("----------------------------------")
                high = int_input_de("was soll das maximum sein?:", "", max_value=500000)
                if low > high:
                    print ("----------------------------------")
                    print("das minimum kann nicht mehr als das maximum sein")
                    print ("----------------------------------")
                else:
                    break
            print ("----------------------------------")
            number = random.randint(low,high)
            if not durchschnitt2:
                guesses = 0
                guessesnuber = int_input_de("wie viele versuch wilst du haben?:", "versuche", max_value=100)                    
                print ("----------------------------------")
                print (f"du hast {guessesnuber} versuche")
            else:
                guesses = 0
                guessesnuber = 9999999999999999999999999999
                print ("----------------------------------")
                print (f"du hast {guessesnuber} versuche")
            while True:
                guess = int_input_de(f"nummer zwischen ({low} - {high}):", "")

                guesses = guesses+1
            
                if guess > high:
                    print (f"das ist mehr als {high}")
                elif guess < low:
                    print(f"das ist weniger als {low}")
                elif guess > number:
                    print (f"{guess} ist zu viel")
                elif guess < number:
                    print (f"{guess} ist zu wenig") 
                else:
                    print (f"{guess} ist richtig!")
                    break
                if guesses == guessesnuber:
                    print (f"du hast zu viele versuche gebraucht")
                    break
                else:
                    print (f"du hast noch {guessesnuber-guesses} versuche")
                if guess < number and not guess < low:
                   low = guess
                elif guess > number and not guess > high:
                    high = guess
                print ("----------------------------------")
            if guess == number:
                print (f"du hast {guesses} versuche gebraucht")
                if durchschnitt2:
                    if 1 <= runde <= 15:
                        werte[runde-1] = guesses
                        if runde == 1:
                            durchschnitt1 = guesses
                        else:
                            durchschnitt1 += guesses
                    
            elif guesses == guessesnuber:
                print (f"du hast es nicht eraten die numer war {number}")
        if durchschnitt2:
            durchschnitt = durchschnitt1/runden    
            print (f"dein durchschnitt ist {durchschnitt}")
        if not input ("nochmal spielen? (ja/nein):").lower() == "ja":
            runig = False
        else:
            print ("----------------------------------")
def englisch():
    runig = True
    while runig:
        runden = int_input("how many rounds woud you like to play?:", "rounds", max_value=15)
        for runde in range (runden):
            runde = runde + 1
            print ("----------------------------------")
            print (f"round {runde}")
            while True:
                low = int_input("waht woud you like to be the minimum?:", "", max_value=None, min_value=-500000)
                print ("----------------------------------")
                high = int_input("waht woud you like to be the maximum?:", "", max_value=500000)
                if low > high:
                    print ("----------------------------------")
                    print("das minimum kann nicht mehr als das maximum sein")
                    print ("----------------------------------")
                elif high < low:
                    break
            print ("----------------------------------")
            number = random.randint(low,high)
            if not durchschnitt2:
                guesses = 0
                guessesnuber = int_input("wie viele versuch wilst du haben?:", "versuche", max_value=100)                    
                print ("----------------------------------")
                print (f"du hast {guessesnuber} versuche")
            else:
                guesses = 0
                guessesnuber = 9999999999999999999999999999
                print ("----------------------------------")
                print (f"du hast {guessesnuber} versuche")
            while True:
                guess = int_input(f"nummer zwischen ({low} - {high}):", "")

                guesses = guesses+1
            
                if guess > high:
                    print (f"das ist mehr als {high}")
                elif guess < low:
                    print(f"das ist weniger als {low}")
                elif guess > number:
                    print (f"{guess} ist zu viel")
                elif guess < number:
                    print (f"{guess} ist zu wenig") 
                else:
                    print (f"{guess} ist richtig!")
                    break
                if guesses == guessesnuber:
                    print (f"du hast zu viele versuche gebraucht")
                    break
                else:
                    print (f"du hast noch {guessesnuber-guesses} versuche")
                if guess < number and not guess < low:
                   low = guess
                elif guess > number and not guess > high:
                    high = guess
                print ("----------------------------------")
            if guess == number:
                print (f"du hast {guesses} versuche gebraucht")
                if durchschnitt2:
                    if 1 <= runde <= 15:
                        werte[runde-1] = guesses
                        if runde == 1:
                            durchschnitt1 = guesses
                        else:
                            durchschnitt1 += guesses
                    
            elif guesses == guessesnuber:
                print (f"du hast es nicht eraten die numer war {number}")
        if durchschnitt2:
            durchschnitt = durchschnitt1/runden    
            print (f"dein durchschnitt ist {durchschnitt}")
        if not input ("nochmal spielen? (ja/nein):").lower() == "ja":
            runig = False
        else:
            print ("----------------------------------")
def italienisch():
    runig = True
    while runig:
        while True:
            runden = int(input("quanti giri vuoi fare?:"))
            if runden > 20:
                print ("20 giri massimo")
            else:
                break

        for runde in range (runden):
            runde = runde + 1
            print ("----------------------------------")
            print (f"giro {runde}")
            while True:
                while True:
                    low = int(input("Quanto vuoi mettere per il minimo?:"))
                    if low < -500000:
                        print ("al minimo -500,000")
                    else:
                        break
                print ("----------------------------------")
                while True:    
                    high = int(input("quanto vuoi mettere come il massimo?:"))
                    if high > 500000:
                        print ("massimo 500,000")
                    else:
                        break
                if low > high:
                    print ("----------------------------------")
                    print("il minimo non può essere più che il massimo")
                    print ("----------------------------------")
                else:
                    break
            print ("----------------------------------")
            guesses = 0
            number = random.randint(low,high)
            guessesnuber = int(input("quanti tentativi vuoi avere?:"))
            print ("----------------------------------")
            print (f"hai {guessesnuber} tentativi")
            while True:
                guess = int(input(f"numero fra ({low} - {high}):"))
                guesses = guesses+1
        
                if guess > high:
                    print (f"è più che {high}")
                elif guess < low:
                    print(f"è meno che  {low}")
                elif guess > number:
                    print (f"{guess} è troppo alto")
                elif guess < number:
                    print (f"{guess} è troppo basso") 
                else:
                    print (f"{guess} è giusto!")
                    break
                if guesses == guessesnuber:
                    print (f"hai fatto troppi tentativi")
                    break
                else:
                    print (f"hai ancora {guessesnuber-guesses} tentativi")
                if guess < number and not guess < low:
                    low = guess
                elif guess > number and not guess > high:
                    high = guess
                print ("----------------------------------")
            if guess == number:
                print (f"in questo giro hai avuto bisogno di {guesses} tentativi")
            elif guesses == guessesnuber:
                print (f"non l'hai indovinato, il numero era: {number}") 
        if not input ("gioca di nuovo? (sì/no):").lower() == "si":
            runig = False
        else:
            print ("----------------------------------")
while True:
    sprache = input("language?(eng/de/it):").lower()
    if sprache == "eng":
        print ("the game is now in english")
        if input ("do you want to calculate an average? (you will have infinite trys)(yes/no):").lower() == "yes":
            durchschnitt2 = True   
        englisch()
        break
    elif sprache == "de":
        print ("das spiel is jetzt auf deutsch")
        if input ("wilst du einen durchschnitt berechnen? (du wirst unendlich viele versuche haben)(ja/nein):").lower() == "ja":
            durchschnitt2 = True 
        deutsch()
        break
    elif sprache == "it":
        print ("il gioco continua in italiano")
        italienisch()
        break
    else:
        print('please enter a valid language')
        print ("---------------------------") 
NOT DONE
Pages: 1 2