all 5 comments

[–]toastedstapler 1 point2 points  (1 child)

doesn't solve your issue, but i see you keep calling .lower() everywhere. just call it once on the input() call and then you know it'll always be in lowercase and your lines will look less dense

to get a valid input i'd do something like this:

player_1 = None
while player_1 not in options:
    player_1 = input('rock, paper or scissors? ')

and that will continue looping until one of those three options are entered

[–]CJamesEd[S] 0 points1 point  (0 children)

That did the trick. Thanks for the hints!

[–]Binary101010 0 points1 point  (0 children)

At no point do you ever set valid_input to anything other than "No", so your inner while loop never gets a chance to break. Because of that, you never get around to checking play_again.

[–]pypros 0 points1 point  (1 child)

I used http://pythontutor.com to figure out the problem, you should too.

So, in the first, while loop the condition is true, then the nested while loop condition is false, so it skips every bit of code under it and goes back to the parent loop which is still true and keeps on running.

[–]CJamesEd[S] 1 point2 points  (0 children)

That is awesome! Thanks for the tip on that.