Я создал игру «камень, ножницы, бумага», в которой пользователь играет против компьютера. Прямо сейчас он застрял в бесконечном цикле, и, поскольку я новичок в python, я не знаю, как завершить цикл. Я добавил пример ниже того, как я хочу, чтобы это было. Любая помощь будет оценена по достоинству! :)

import random

print("Welcome to the game of rock, paper, scissors!")  

newLi = ["Rock", "Paper", "Scissors"]  
numRandom = newLi[random.randint(0, 3)]
user = False 

while not user:
    user = input("Rock, Paper, Scissors? \nAnswer: ") 
    if user == numRandom: 
        print("It's a tie! Please try again.")  
    elif user == "Rock" or user == "rock":
        if numRandom == "Paper":  
            print("Aw! You lost. Try again!", numRandom, "covers", user)
        else :
            print("Good job! You're the winner!", user, "smashes", numRandom)
    elif user == "Paper" or user == "paper":
        if numRandom == "Scissors":
            print("Aw! You lost. Try again!", numRandom, "cuts", user)
        else :
            print("Good job! You're the winner!", user, "covers", numRandom)
    elif user == "Scissors" or user == "scissors":
        if numRandom == "Rock":
            print("Aw! You lost. Try again!", numRandom, "smashes", user)
        else :
            print("Good job! You're the winner!", user, "cuts", numRandom)
    else:
        print("Invalid answer! Try again.")  

endGame = input("Would you like to keep playing? Y or N\nAnswer: ")

if endGame == "Y"
    KEEP PLAYING
else:
    STOP PLAYING
0
pythonNewbie2 16 Янв 2022 в 09:18
Почему бы просто не создать переменную для хранения счета и решить, что когда счет достигнет этого числа (либо для игрока, либо для компьютера), игра закончится?
 – 
tomerpacific
16 Янв 2022 в 09:21
 – 
Urmzd
16 Янв 2022 в 09:23
Вы можете использовать оператор break для остановки циклов. Просто немного погуглите, вы найдете массу информации об этом
 – 
reisgoldmanX
16 Янв 2022 в 09:25

6 ответов

Вы застряли в цикле, потому что Python рассматривает блоки кода на основе отступов. В вашем коде

import random

print("Welcome to the game of rock, paper, scissors!")  

newLi = ["Rock", "Paper", "Scissors"]  
numRandom = newLi[random.randint(0, 3)]
user = False 

while not user:
    user = input("Rock, Paper, Scissors? \nAnswer: ") 
    if user == numRandom: 
        print("It's a tie! Please try again.")  
    ...  

endGame = input("Would you like to keep playing? Y or N\nAnswer: ")

if endGame == "Y"
    KEEP PLAYING
else:
    STOP PLAYING

Если вы заметили, endGame = ..., if endGame и ваши операторы else находятся на том же уровне отступа, что и ваш первоначальный цикл while. Это означает, что они на самом деле не являются частью вашего цикла, а вместо этого будут выполняться только после закрытия цикла.

Шаг 1 — сделать отступ для всего, что должно быть включено в блок кода.

Шаг 2 — переключить KEEP PLAYING на continue и STOP PLAYING на break.

Если вы делаете это, вы можете просто изменить цикл while на while True.

Вот хорошая ссылка для управления потоком циклов.


Не имеет отношения к вопросу, но, поскольку мы здесь, чтобы помочь, вы столкнетесь с некоторыми проблемами сравнения, если позволите пользователю вводить ответ с заглавной или строчной буквы.

Загляните в .lower() и рассмотрите возможность использования строчных букв для всего в этом сценарии.


Конечный код должен выглядеть так:

import random

print("Welcome to the game of rock, paper, scissors!")  

newLi = ["Rock", "Paper", "Scissors"]  
numRandom = newLi[random.randint(0, 3)]
user = False 

while True:
    user = input("Rock, Paper, Scissors? \nAnswer: ") 
    if user == numRandom: 
        print("It's a tie! Please try again.")  
    elif user == "Rock" or user == "rock":
        if numRandom == "Paper":  
            print("Aw! You lost. Try again!", numRandom, "covers", user)
        else :
            print("Good job! You're the winner!", user, "smashes", numRandom)
    elif user == "Paper" or user == "paper":
        if numRandom == "Scissors":
            print("Aw! You lost. Try again!", numRandom, "cuts", user)
        else :
            print("Good job! You're the winner!", user, "covers", numRandom)
    elif user == "Scissors" or user == "scissors":
        if numRandom == "Rock":
            print("Aw! You lost. Try again!", numRandom, "smashes", user)
        else :
            print("Good job! You're the winner!", user, "cuts", numRandom)
    else:
        print("Invalid answer! Try again.")  

    endGame = input("Would you like to keep playing? Y or N\nAnswer: ")

    if endGame == "Y"
        continue
    else:
        break
0
CVerica 16 Янв 2022 в 09:38

Основываясь на вашем вопросе, я пришел к выводу, что вы хотите создать «игру» в стиле «камень-ножницы-бумага» на питоне, которая будет продолжаться до тех пор, пока endGame = 'Y', поэтому определите user = False поверх вашего кода. не обязательно.

Сначала вам нужно определить endGame как 'Y'. Также нет необходимости добавлять какой-либо дополнительный флаг.

Для ясности я изменил переменную endGame на continueGame.

Поэтому такой должен быть алгоритм/механизм игры по шагам:

  1. Дайте определение камню, ножницам и бумаге.

  2. Получить выбор пользователя

  3. Выберите случайным образом среди камней, ножниц и бумаги.

  4. Распечатать ответ

  5. Спросите пользователя, хочет ли он продолжить игру:

    • Если Y, вернитесь к шагу 2.
    • Если N, завершить выполнение.

Таким образом, вам нужно посчитать рандом внутри цикла. В противном случае результат всегда был бы одинаковым каждый раз, когда пользователь хочет играть в игру снова и снова.

Вы можете очистить регистр, чтобы упростить проверку, например, используя .lower() для нижнего регистра пользовательского ввода.

import random

print("Welcome to the game of rock, paper, scissors!")

newLi = ["rock", "paper", "scissors"]
continueGame = 'Y'

while continueGame = 'Y':
    user = input("Rock, Paper, Scissors? \nAnswer: ")
    numRandom = newLi[random.randint(0,3)]
    if user.lower() == numRandom:
        print("It's a tie! Please try again.")
    elif user.lower() == "rock":
        if numRandom == "Paper":
            print("Aw! You lost. Try again!", numRandom, "covers", user)
        else :
            print("Good job! You're the winner!", user, "smashes", numRandom)
    elif user.lower() == "paper":
        if numRandom == "Scissors":
            print("Aw! You lost. Try again!", numRandom, "cuts", user)
        else :
            print("Good job! You're the winner!", user, "covers", numRandom)
    elif user.lower() == "scissors":
        if numRandom == "Rock":
            print("Aw! You lost. Try again!", numRandom, "smashes", user)
        else :
            print("Good job! You're the winner!", user, "cuts", numRandom)
    else:
        print("Invalid answer! Try again.")

    continueGame = input("Would you like to keep playing? Y or N\nAnswer: ")
0
Dhana D. 16 Янв 2022 в 09:55

Вы инициализируете user значением False, но user впоследствии никогда не устанавливается на True. Таким образом, условие оператора while, которое равно not user, всегда оценивается как True. Это вызывает бесконечный цикл, так как цикл while выполняет код, пока тестовое условие равно True.

В зависимости от того, как устроена игра (формат до трех побед, формат одной игры и т. д.), вы должны изменить условия завершения. Вы можете, например, увеличить счетчик (num_games) и завершить цикл, как только этот счетчик достигнет некоторого фиксированного значения.

Кроме того, вы можете использовать операторы break или return. Оператор break завершает цикл while. return завершит метод (и, следовательно, также завершит ваш цикл while).

0
Maya Nayak 16 Янв 2022 в 09:58

Добавлен дополнительный флаг «цикл», который завершает цикл, когда пользователь говорит «N», чтобы продолжить. Если пользователь скажет «Y», чтобы продолжить, он установит для пользователя значение False, чтобы попасть в другой цикл while.

import random

print("Welcome to the game of rock, paper, scissors!")  

newLi = ["Rock", "Paper", "Scissors"]  
numRandom = newLi[random.randint(0, 3)]
user = False 
loop = True

while(loop):
    while not user:
        user = input("Rock, Paper, Scissors? \nAnswer: ") 
        if user == numRandom: 
            print("It's a tie! Please try again.")  
        elif user == "Rock" or user == "rock":
            if numRandom == "Paper":  
                print("Aw! You lost. Try again!", numRandom, "covers", user)
            else :
                print("Good job! You're the winner!", user, "smashes", numRandom)
        elif user == "Paper" or user == "paper":
            if numRandom == "Scissors":
                print("Aw! You lost. Try again!", numRandom, "cuts", user)
            else :
                print("Good job! You're the winner!", user, "covers", numRandom)
        elif user == "Scissors" or user == "scissors":
            if numRandom == "Rock":
                print("Aw! You lost. Try again!", numRandom, "smashes", user)
            else :
                print("Good job! You're the winner!", user, "cuts", numRandom)
        else:
            print("Invalid answer! Try again.")  

    endGame = input("Would you like to keep playing? Y or N\nAnswer: ")

    if endGame == "N":
        loop=False
    else:
        user=False
-1
Vishal 16 Янв 2022 в 09:44
Этот ответ требует уточнения. Почему это ответ? Что он делает по-другому? Как это различие или различия приводят к желаемому результату?
 – 
Chris
16 Янв 2022 в 09:27
Добавлен дополнительный флаг для разрыва цикла, если пользователь отказывается продолжать.
 – 
Vishal
16 Янв 2022 в 09:29
1
Вы также изменили отступ, что в Python имеет большое значение. Пожалуйста, отредактируйте сообщение, чтобы добавить уточнение.
 – 
Chris
16 Янв 2022 в 09:32

Я добавил переменную пользовательского ввода rounds_to_play, которая спрашивает пользователя, сколько раундов он хотел бы сыграть, эта переменная будет уменьшаться с каждым раундом, пока игра не будет завершена. Вы также можете добавить логическое значение is_playing и сказать while is_playing, а затем установить для логического значения значение false, когда игра закончится.

import random

print("Welcome to the game of rock, paper, scissors!")

new_lst = ["Rock", "Paper", "Scissors"]
num_random = new_lst[random.randint(0, 3)]
rounds_to_play = int(input("How many rounds would you like to play: "))

while rounds_to_play > 0:
    user_input = input("Rock, Paper, Scissors? \nAnswer: ")
    if user_input == num_random:
        print("It's a tie! Please try again.")
    elif user_input == "Rock" or user_input == "rock":
        if num_random == "Paper":
            print("Aw! You lost. Try again!", num_random, "covers", user_input)
        else:
            print("Good job! You're the winner!",
                  user_input, "smashes", num_random)
    elif user_input == "Paper" or user_input == "paper":
        if num_random == "Scissors":
            print("Aw! You lost. Try again!", num_random, "cuts", user_input)
        else:
            print("Good job! You're the winner!",
                  user_input, "covers", num_random)
    elif user_input == "Scissors" or user_input == "scissors":
        if num_random == "Rock":
            print("Aw! You lost. Try again!",
                  num_random, "smashes", user_input)
        else:
            print("Good job! You're the winner!",
                  user_input, "cuts", num_random)
    else:
        print("Invalid answer! Try again.")
        rounds_to_play += 1

    rounds_to_play -= 1
0
Anton Christiansen 16 Янв 2022 в 09:37

Сначала вам нужно будет получить эндшпиль и цикл if else внутри цикла while. Затем вы можете использовать переменную флага для запуска и остановки цикла while.

import random

print("Welcome to the game of rock, paper, scissors!")

newLi = ["Rock", "Paper", "Scissors"]
numRandom = newLi[random.randint(0, 3)]
flag = True
while flag:
    user = input("Rock, Paper, Scissors? \nAnswer: ")
    if user == numRandom:
        print("It's a tie! Please try again.")
    elif user == "Rock" or user == "rock":
        if numRandom == "Paper":
            print("Aw! You lost. Try again!", numRandom, "covers", user)
        else :
            print("Good job! You're the winner!", user, "smashes", numRandom)
    elif user == "Paper" or user == "paper":
        if numRandom == "Scissors":
            print("Aw! You lost. Try again!", numRandom, "cuts", user)
        else :
            print("Good job! You're the winner!", user, "covers", numRandom)
    elif user == "Scissors" or user == "scissors":
        if numRandom == "Rock":
            print("Aw! You lost. Try again!", numRandom, "smashes", user)
        else :
            print("Good job! You're the winner!", user, "cuts", numRandom)
    else:
        print("Invalid answer! Try again.")

    endGame = input("Would you like to keep playing? Y or N\nAnswer: ")

    if endGame == "Y":
        flag =True
    else:
        flag = False
0
Piyush Pranjal 16 Янв 2022 в 09:46