Угадай число (цикл while)
Напишите программу-игру. Компьютер загадывает случайное число, пользователь пытается его угадать. Пользователь вводит число до тех пор. пока не угадает или не введет слово «Выход». Компьютер сравнивает число с введенным и сообщает пользователю больше оно или меньше загаданного.
Мне не нравится, что первый вопрос по сути задается дважды. Что мне нужно исправить, чтобы сразу было сказано меньше число или больше задуманного?
from random import randint N=randint(1,10) K=int(input("Угадайте целое число от 1 до 10:")) while K!=N: K=int(input("Повторите попытку:")) if KN: print("Ваше число больше, чем задумал компьютер") else: print("Вы угадали") print(K) print(N)
Отслеживать
122k 24 24 золотых знака 125 125 серебряных знаков 299 299 бронзовых знаков
задан 5 ноя 2019 в 19:13
193 2 2 золотых знака 4 4 серебряных знака 10 10 бронзовых знаков
Алгоритм для программы Python
Я недавно начал изучать Python. Эту задачу я решил, но она работает криво и не так, как должно быть. У меня возникла проблема, что я понимаю, как написать программу, но не могу правильно выразить мысли в коде.
left = 0 right = 1000 answer = None while answer != '=': answer = input() if answer == '=': print('Я угадал!') break elif answer == '': right = (right - left) // 2 + left print(right, '?')
Отслеживать
задан 29 окт 2018 в 20:14
97 3 3 серебряных знака 15 15 бронзовых знаков
начинать явно стоит с вывода предложения 500. А иначе на что будет давать ответ пользователь ?
29 окт 2018 в 20:46
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В целом ваше решение не такое уж и плохое, предлагаю несколько шагов по улучшению:
Во первых, в вашем решении сбивает то что пользователю ничего не показывается при запуске программы, это решается вычислением первого числа до цикла while .
left = 0 right = 1001 current = (left + right) // 2
Обратите внимание что right мы устанавливаем в 1001 а не 1000, это необходимо что бы при «угадывании» захватить число 1000 .
Во вторых, я бы рекомендовал вынести вывод текущего числа в начало цикла, так же для того что бы показать пользователю текущее значение и ожидать его реакции.
while answer != '=': print(current, '?') answer = input()
В третьих, после этого можно внести небольшие изменения в цепочку if-elif , этот вариант отличается от вашего тем что здесь изменяются только границы нашего вычисления и добавлена обработка некорректного ввода
if answer == '=': print('Я угадал!') break elif answer == '>': left = current elif answer == ',
И самом конце цикла добавляем сточку с вычислением текущего значения
current = (left + right) // 2
Код полностью
left = 0 right = 1001 current = (left + right) // 2 answer = None while answer != '=': print(current, '?') answer = input() if answer == '=': print('Я угадал!') break elif answer == '>': left = current elif answer == ',
Цикл управления для угадайки чисел в Python
Я пытаюсь написать программу, которая генерирует псевдослучайное число и позволяет пользователю угадать его. Когда пользователь угадывает неправильное число, как это, скорее всего, я хотел бы, чтобы функция возвращалась к началу условного цикла, а не к самому началу функции (что привело бы к генерации нового псевдослучайного числа). Вот что у меня так далеко:
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()
Как можно сделать псевдослучайное число локально неизменным, чтобы после неправильного предположения число не изменилось?
sdsgg 10 Янв 2012 в 05:05
5 ответов
Лучший ответ
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()
Jason Sundram 10 Янв 2012 в 02:49
Хотя циклы здесь, вероятно, лучший способ сделать это, вот как вы можете реализовать их рекурсивно с минимальными изменениями в вашем коде:
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, и ваш код выглядит как ожидаемый и целочисленный.
Andrew Clark 10 Янв 2012 в 01:13
Создание класса и определение логики в различных методах (или функциях) может быть вашим лучшим выбором. Ознакомьтесь с документацией по 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()
Clayton 10 Янв 2012 в 01:54
Импортировать случайные и генерировать случайные числа вне вашей функции? Вы также можете установить диапазон для сгенерированных целых например, n = random.randint(1,max) Вы могли бы даже иметь предустановку макс.
toonarmycaptain 5 Май 2017 в 04:15
Самое простое, что можно сделать здесь, - это просто использовать цикл - без рекурсии.
Однако, если вы используете рекурсию, вы можете просто поместить условие в его собственную функцию, которая принимает случайное число в качестве аргумента и может рекурсивно вызывать себя без пересчета числа.
Угадывание рандомного числа Python
Напишите программу, которая загадывает случайное число от 0 до 15 включительно, и просит пользователя угадать его с трех попыток. При каждом вводе пользователем числа программа отвечает «тепло», если введенное число отличается от загаданного на 2 или меньше и «холодно», если на 3 и больше.
В каждом ответе программа также подсказывает, больше или меньше введенное число, чем загаданное (выводит на экран "нужно больше" или "нужно меньше"). Если число угадано точно за 3 попытки – программа завершается и поздравляет пользователя с победой.
Если нет – выводит какое число было загадано.
Я практически всё сделал, осталось сделать так чтобы он писал холодно или тепло в зависимости от того на сколько отличается выбранное число. Там заготовка у меня есть, но я не знаю как это делать дальше.
guesses_made = 0 import random number = random.randint(0, 15) print("Загадано число от 0 до 15, отгадайте какое?") while guesses_made < 3: guess = int(input()) guesses_made += 1 if guess < number: print("Тепло (нужно больше)") if guess >number: print("Тепло (нужно меньше)") if guess < number: print("Холодно (нужно больше)") if guess >number: print("Холодно (нужно меньше)") if guess == number: break if guess == number: print("Ты угадал мое число!") else: print ("Не угадал! Я загадал число ".format(number))
