Home > Software design >  Multiplication guessing game in Python | if wrong guess until it is correct
Multiplication guessing game in Python | if wrong guess until it is correct

Time:12-27

I am trying to write a program as follows:

  1. Python generates random multiplications (factors are random numbers from 1 to 9) and asks to the users to provide the result
  2. The user can quit the program if they input "q" (stats will be calculated and printed)
  3. If the user provides the wrong answer, they should be able to try again until they give the correct answer
  4. if the user responds with a string (e.g. "dog"), Python should return an error and ask for an integer instead

It seems I was able to perform 1) and 2). However I am not able to do 3) and 4). When a user gives the wrong answer, a new random multiplication is generated.

Can please somebody help me out?

Thanks!

import random

counter_attempt = -1
counter_win = 0
counter_loss = 0

while True:
    counter_attempt  = 1
    num_1 = random.randint(1, 9)
    num_2 = random.randint(1, 9)
    result = str(num_1 * num_2)
    guess = input(f"How much is {num_1} * {num_2}?: ")
    if guess == "q":
        print(f"Thank you for playing, you guessed {counter_win} times, you gave the wrong answer {counter_loss} times, on a total of {counter_attempt} guesses!!!")
        break
    elif guess == result:
        print("Congratulations, you got it!")
        counter_win  = 1
    elif guess != result:
        print("Wrong! Please try again...")
        counter_loss  = 1

CodePudding user response:

Hi my Idea is to put the solving part in a function:

    import random

counter_attempt = -1
counter_win = 0
counter_loss = 0


def ask(num1, num2, attempt, loss, win):
    result = str(num1 * num2)
    guess = input(f"How much is {num1} * {num2}?: ")
    if guess == "q":
        print(f"Thank you for playing, you guessed {win} times, you gave the wrong answer {loss} times, on a total of {attempt} guesses!!!")
        return attempt, loss, win, True
    try:
        int(guess)
    except TypeError:
        print("Please insert int.")
        guess = input(f"How much is {num1} * {num2}?: ")
    if guess == result:
        print("Congratulations, you got it!")
        win  = 1
        return attempt, loss, win, False
    elif guess != result:
        print("Wrong! Please try again...")
        loss  = 1
        attempt  = 1
        return ask(num1, num2, attempt, loss, win)


while True:
    num_1 = random.randint(1, 9)
    num_2 = random.randint(1, 9)
    counter_attempt, counter_loss, counter_win, escape = ask(num_1, num_2, counter_attempt, counter_loss, counter_win)
    if escape:
        break

Is that what you asked for?

CodePudding user response:

Note that everything withing your while loop happens every single iteration. Specifically, that includes:

 num_1 = random.randint(1, 9)
 num_2 = random.randint(1, 9)

So you are, indeed, generating new random numbers every time (and then announcing their generation to the user with guess = input(f"How much is {num_1} * {num_2}?: "), which is also within the loop).

Assuming you only intend to generate one pair of random numbers, and only print the "how much is...?" message once, you should avoid placing those within the loop (barring the actual input call, of course: you do wish to repeat that, presumably, otherwise you would only take input from the user once).

I strongly recommend "mentally running the code": just go line-by-line with your finger and a pen and paper at hand to write down the values of variables, and make sure that you understand what happens to each variable & after every instruction at any given moment; you'll see for yourself why this happens and get a feel for it soon enough.
Once that is done, you can run it with a debugger attached to see that it goes as you had imagined. (I personally think there's merit in doing it "manually" as I've described in the first few times, just to make sure that you do follow the logic.)

CodePudding user response:

You are generating a new random number every time the user is wrong, because the

    num_1 = random.randint(1, 9)
    num_2 = random.randint(1, 9)
    result = str(num_1 * num_2)

Is in the while True loop.

Here is the fixed Code:

import random

counter_attempt = 0
counter_win = 0
counter_loss = 0

while True:
    num_1 = random.randint(1, 9)
    num_2 = random.randint(1, 9)
    result = str(num_1 * num_2)
    while True:
        guess = input(f"How much is {num_1} * {num_2}?: ")
        if guess == "q":
            print(f"Thank you for playing, you guessed {counter_win} times, you gave the wrong answer {counter_loss} times, on a total of {counter_attempt} guesses!!!")
            input()
            quit() 
        elif guess == result:
            print("Congratulations, you got it!")
            counter_win  = 1
            break
        elif guess != result:
            print("Wrong! Please try again...")
            counter_loss  = 1

  • Related