r/learnpython 1d ago

Python practice problem.

‎Hi everyone, I'm new to python and I'm building a project to hone my skill, and I came to a halt in this part. When I do if user_input == 'q':, it works and breaks the loop just fine, since i dont wanna make the exit just single letter so even if the user input words like 'quit' 'q' or 'QUIT' it will exit the loop, I tried a different approach like doing user_input == ['q', 'quit']: and another approach where i declared a variable first exit_word = ['q', 'quit'] then

‎user_input == exit_word: none of this breaks the loop it just goes back to the input prompt heres my work below:

import random

user = 0

computer = 0

options = ["rock" , "paper", "scissors"]

while True:

user_input = input("Rock/Paper/Scissors and Q for Quit: ").lower()

if user_input == 'q'

break

if user_input not in options:

continue

random_num = random.randint(0, 2)

computer_pick = options[random_num]

print('Computer picked', computer_pick + ".")

if user_input == 'rock' and computer_pick == 'scissors':

print('You won!')

user += 1

elif user_input == 'paper' and computer_pick == 'rock':

print('You won!')

user += 1

elif user_input == 'scissors' and computer_pick == 'paper':

print('You won!')

user += 1

else:

print('You lost!')

computer += 1

print("The user won", user, "times")

print("The computer won", computer, "times")

print('Goodbye!')

Upvotes

11 comments sorted by

u/kalgynirae 3.9 1d ago

user_input == ["q", "quit"] will always be false because user_input is a string and ["q", "quit"] is a list — no matter the content of the string or the list, a string and a list will never be considered equal.

You probably want to check if the user_input is one of the values in the list, which is written like this: user_input in ["q", "quit"]

u/johnpeters42 1d ago

There's a colon missing after 'q'

More to the point, I don't think "x == [y, z]" works the way you want. Try "x in [y, z]" (I don't use Python that often, so this may still be wrong)

u/davideogameman 1d ago

You are correct, they want the in operator, not ==.

u/tropicusForBr 1d ago

This is because when you need to check if a string (user_input) is in a list (exit_words), you can just write if user_input in exit_words:

u/Moikle 1d ago

Put 4 spaces before each line when you post code to reddit.

Look at your post, it has lost the indents, 4 extra spaces fixes that

u/lakseol 1d ago edited 1d ago

Try getting just the first character of the user response and test that:

if user_input[:1] == "q":   // NOT user_input[0]

Using [:1] instead of [0] means your code won't crash when the user presses ENTER without typing anything else.

Of course, entering "quick" will also break out of the loop, but that is probably fine for a game. That may not be a bad idea for the other possible responses either, as it's quicker to type "S" instead of "scissors", etc.

Edit: fixed spelling, added final comment.

u/centurion236 1d ago

    user_input().lower().startswith('q')

u/lakseol 1d ago

I think it's better to extract just the single first character if your code is going to recognize only "q", "r", "p", etc. That way you do:

user_input = input(...).lower()
cmd = user_input[:1] 
if cmd == "q":
    break
if cmd == "r":
    #etc

instead of repeated calls to .startswith():

user_input = input(...).lower()
if user_input.startswith("q"):
    break
if user_input.startswith("r"):
    #etc

u/Fast-Station1106 23h ago

Prüfe ob die eingabe UNGLEICH deiner user_int liste ist (also den 3 möglichen) und breche ab, quit the game erst danach bzw. Nachvsieg, loose, Ob er nochmal spielen will

u/Bright_Mix_773 21h ago

Separate from the in question that's already answered: there's a scoring bug sitting underneath it.

Rock against rock falls through all three elif branches into the else, prints "You lost!" and hands the computer a point. Ties are being scored as losses. Since the computer picks uniformly from three options, that's a third of your games credited to the wrong side.

Checking the draw first fixes it, and it also shrinks the rest, because once draws are gone the three winning pairs are the only thing left:

wins = {'rock': 'scissors', 'paper': 'rock', 'scissors': 'paper'}
if user_input == computer_pick:
    print("Draw!")
elif wins[user_input] == computer_pick:
    print("You won!")
    user += 1
else:
    print("You lost!")
    computer += 1

That's safe to index without a .get only because your if user_input not in options: continue above it has already thrown out anything that isn't one of the three keys. Worth knowing the two lines depend on each other, since deleting the guard later would turn a typo into a KeyError.

One smaller thing: random.choice(options) does what randint(0, 2) plus the index does, and the 2 stops being a number that has to stay in step with the length of the list.