Цикл управления для угадайки чисел в Python - PullRequest
0 голосов
/ 10 января 2012

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

def guessingGame():
    import random
    n = random.random()
    input = raw_input("Guess what integer I'm thinking of.")
    if int(input) == n:
        print "Correct!"
    elif int(input) < n:
        print "Too low."
        guessingGame()
    elif int(input) > n:
        print "Too high."
        guessingGame()
    else:
        print "Huh?"
        guessingGame()

Как можно сделать псевдослучайное число локально неизменным, чтобы после неправильного предположения число не изменилось?

Ответы [ 5 ]

3 голосов
/ 10 января 2012

Хотя циклы здесь, вероятно, лучший способ сделать это, вот как вы можете реализовать их рекурсивно с минимальными изменениями в вашем коде:

def guessingGame(n=None):
    if n is None:
        import random
        n = random.randint(1, 10)
    input = raw_input("Guess what integer I'm thinking of.")
    if int(input) == n:
        print "Correct!"
    elif int(input) < n:
        print "Too low."
        guessingGame(n)
    elif int(input) > n:
        print "Too high."
        guessingGame(n)
    else:
        print "Huh?"
        guessingGame(n)

Предоставляя необязательный параметр для guessingGame(), вы можете получить желаемое поведение. Если параметр не указан, то это начальный вызов, и вам нужно случайным образом выбрать n, в любое время после того, как текущий n будет передан в вызов, поэтому вы не создадите новый.

Обратите внимание, что вызов random() был заменен на randint(), поскольку random() возвращает число с плавающей точкой от 0 до 1, и ваш код выглядит как ожидаемое и целое.

1 голос
/ 10 января 2012
from random import randint

def guessingGame():
    n = randint(1, 10)
    correct = False
    while not correct:
        raw = raw_input("Guess what integer I'm thinking of.") 
        if int(i) == n:
            print "Correct!"
            correct = True
        elif int(i) < n:
            print "Too low."
        elif int(i) > n:
            print "Too high."
        else:
            print "Huh?"

guessingGame()
0 голосов
/ 05 мая 2017

Импортировать случайные и генерировать случайные числа вне вашей функции?Вы также можете установить диапазон для сгенерированных целых чисел, например, n = random.randint(1,max) Вы можете даже настроить пользователя на максимальное значение

.
0 голосов
/ 10 января 2012

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

from random import randint

class GuessingGame (object):

    n = randint(1,10)

    def prompt_input(self):
        input = raw_input("Guess what integer I'm thinking of: ")
        self.validate_input(input)

    def validate_input(self, input):
        try:
            input = int(input)
            self.evaluate_input(input)

        except ValueError:
            print "Sorry, but you need to input an integer"
            self.prompt_input()

    def evaluate_input(self, input):
        if input == self.n:
            print "Correct!"
        elif input < self.n:
            print "Too low."
            self.prompt_input()
        elif input > self.n:
            print "Too high."
            self.prompt_input()
        else:
            print "Huh?"
            self.prompt_input()

GuessingGame().prompt_input()
0 голосов
/ 10 января 2012

Самое простое, что можно сделать здесь, - это просто использовать цикл здесь - без рекурсии.

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

...