@N_kuzya
Junior Coder

Не могу решить задачу на Python?

Читаю книгу "Программируем на Python" Майкла Доусона и наткнулся на задачу.

Суть Задачи в том, чтобы пользователь загадывал число, а программа отгадывала, при этом задавая вопрос "Больше или Меньше?".

Вот текст этой задачи:
"А вот задача посложнее. Напишите на псевдокоде алгоритм игры, в которой случайное число от 1 до 100 загадывает человек, а отгадывает компьютер. Прежде чем приступать к решению, задумайтесь над тем, какой должна быть оптимальная стратегия отгадывания. Если алгоритм на псевдокоде будет удачным, попробуйте реализовать игру на Python"

Вот мой код, который я написал :
import random
print( "\tДобро пожаловать в игру 'Отгадай число'!")
print("\nЗагадывайте число от 1 до 100")
print("Я постараюсь отгадать его за минимальное число попыток.")
print("Используйте  \"Больше\", \"Меньше\", \"Да\" или \"Нет\"\n")
max_number = 100
yesOrNot = input("Ваше число 50?\n ")
guess = 50
if yesOrNot == "Да" :
    print("Я нашел это число!!!")
    input("Нажмите Enter чтобы выйти...")
elif yesOrNot == "Нет" :
    while yesOrNot == "Да" :
        check = input("Больше или Меньше")
        if check == "Больше" :
            guess_r = random.randint(guess, max_number)
        elif check == "Меньше" :
            guess_r = random.randit(0, guess)
        guess_r = max_number
        guess_r = guess
        yesOrNot = input("Ваше число ", str(guess_r), "?")     
print("Я нашел это число")
input("Нажмите Enter чтобы выйти...")


Но программа просто спрашивает "Ваше число 50?", затем просто выводит две последние строки при этом на смотря на условия.

В чем проблема?
  • Вопрос задан
  • 36728 просмотров
Решения вопроса 2
flygrounder
@flygrounder
Python/Django
У вас изначально странная стратегия отгадывания. Оптимальная будет такой: две переменных left=1 и right=100. И всегда спрашивать Ваше число (left+right)//2? Если больше, то left = (left+right)//2 + 1, если меньше, то right = (left + right)//2 - 1, если оно, то выйти. Гарантированно угадает за log2(n) вопросов, при n=100 за 7 вопросов.
UPD: Вот накидал реализацию
left = 1
right = 100
while True:
    current = (left+right)//2
    is_right = input('Ваше число:{}?(да, больше, меньше)'.format(current))
    if is_right.lower() == 'да':
        print('Я его угадал!')
        break
    elif is_right=='больше':
        left = current + 1
    else:
        right = current - 1
Ответ написан
@nurakhov
Рандом даст ощущение отгадывания?

import random
number = int(input("Введите число от 1 до 100: "))

x = 1
y = 100
guess = random.randint (x, y)
tries = 1

if number == guess:
    print('С первой попытки!')
else:
    while guess != number:
        if number > guess:
            print("Загаданное число больше: ", guess)
            x = guess
            guess = random.randint(x, y)
            tries += 1
        elif number < guess:
            print("Загаданное число меньше: ", guess)
            y = guess
            guess = random.randint(x, y)
            tries += 1
    print (number)
    print ('В яблочко, с', tries, 'попытки')
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
@Sovik32
Тут есть и проверка на мухлевку и правильное сужение диапазона! Мой код будет отгадывать быстрее.
import random

print("загадайте число от 0 до 100")
print(
    "Если мое число меньше или больше вашего вводите '<' или '>' соответственно, а если я угадал, то введите 'y' и нажмите Enter"
)
rnd = 50
min_diapazona = 0
max_diapazona = 100
otvet = ""
while 1 > 0:
    print("Мое число:", rnd, "я угадал? Диапазон от", min_diapazona, "до",
          max_diapazona)
    otvet = input()
    if otvet == "y":
        print("Я угадал! Игра окончена.")
        break
    elif otvet == "<":
        max_diapazona = rnd - 1
        try:
            rnd = random.randint(min_diapazona, max_diapazona)
        except:
            print("Вы мухлевщик! Я с вами больше не играю! Игра окончена!")
    elif otvet == ">":
        min_diapazona = rnd + 1
        try:
            rnd = random.randint(min_diapazona, max_diapazona)
        except:
            print("Вы мухлевщик! Я с вами больше не играю! Игра окончена!")
            break
    else:
        print("Неправельнй ввод! Допустимые символы: '<', '>' и 'y'")
Ответ написан
Комментировать
@rozhin1
# Игра для компьютера "Отгадай число"
import random
number=input("Введите загаданное вами число в диапазоне [0;100]: ")
x=0
y=100
tries=1
computer_number=random.randrange(x,y+1)
while x!=y:
    print("Ваше число равно,больше или меньше:",computer_number)
    z=input()
    if 'больше' in z.lower():
            x=computer_number
            computer_number=random.randrange(x,y)
            tries+=1
    elif 'меньше' in z.lower():
            y=computer_number
            computer_number=random.randrange(x,y)
            tries+=1
    elif 'равно' in z.lower():
            break
print('Ваше число:',number,' ,а число найденное компьютером: ',computer_number,'кол-во попыток:',tries)

<i></i>
Ответ написан
@Steuer
# Комп, отгадай число

# Человек загадывает случайное число от 1 до 100.
# Комп пытается его угадать,
# а человек говорит больше, меньше или в точку

# Псевдокод

# приветствие и объяснение правил

# предложить юзеру загадать число от 1 до 100

# импортируем ГСЧ
# задать начальные условия
# включить ГСЧ от a до b
# номер попытки приравнять к 1
# пока число не совпадет с загаданным
# вывести число
# спросить у юзера то ли это число
# если да то
# закончить игру, посчитав количество попыток
# если больше
# включить ГСЧ от последнего предложенного до b
# если меньше
# включить ГСЧ от a до последнего предложенного

print('\tWelcome to the game "PC guess the number"!' #приветствуем
'\n\nMake a number from 1 to 100. I will try to guess it.' #объясняем правила
'\n\nPlease, make a number from 1 to 100 and write it down on a piece of paper.') #предлагаем придумать число

import random #импортируем ГСЧ

#задаем начальные условия
a = 1 #начальная граница диапазона
b = 100 #конечная граница диапазона
user_number = int(input('Press "0" to start: ')) #вводим начальное загаданное число вне диапазона (обход бага)
comp_number = random.randint(a, b) #включаем ГСЧ от a до b
tries = 1 #количество попыток

#цикл отгадывания
while comp_number != user_number:
print('\nIs it number', str(comp_number) + '?')
user_answer = input('If I am right, then enter "Y",'
'\nif the hidden number is greater, then enter "M",'
'\nif is less, then enter "L"'
'\n ') #спрашиваем у юзера
if user_answer == 'Y':
user_number = comp_number
print('\nHidden number is', str(user_number) + '. I made', tries, 'tries. Game over.')
break
elif user_answer == 'M':
a = comp_number + 1
comp_number = random.randint(a, b)
elif user_answer == 'L':
b = comp_number - 1
comp_number = random.randint(a, b)
tries += 1
Ответ написан
@Thisnameisalreadytaken
#dawsnon 
#chapter 3, task 4
#Computer is guessing...
#4
import random 
n = int(input('User enters number: '))
rand = -1
edge1 = 1
edge2 = 100
rand = random.randint(edge1, edge2)
print("My guess is ...\n", rand)   
while rand != n:
    if rand > n:
        print("Ah, alright, it was lower than ",rand )
        edge2 = rand
    elif rand < n:
        print("Nope, a little higher than ",rand)
        edge1 = rand
    rand = random.randint(edge1, edge2)
    print(rand)
print("You guessed it right!")

Единственный косяк, random может генерировать несколько одинаковых чисел подряд
Ответ написан
Читаю первые главы "Изучаем Python" Эрика Мэтиза, решил попробовать себя. На микрокалькуляторе Электроника» МК-52, была следующая "игра" - мк-52 загадывает число в промежутке от 0 до 99, пользователь должен угадать загаданное число. После каждого хода, с учетом введенного пользователем числа - на экране отображается числа между которыми находится искомое. Если пользователь введет отрицательное число МК-52 отбросит знак минус. После того как пользователь угадывал число, ему в зависимости от количества попыток выставлялась оценка .

#Игра отгадай число
import random
number=(random.randint(0, 99))
#print(number)
a = 99
b = 0
name = input('Как тебя зовут?\n')
print(f"Уважаемый, {name.title()} пк загадал случайное число от {b} до {a}. Угадываем:")
while True:
    try:
        c = int(input())
        c = abs(c)#убираем знак минус
        if c != number:
            if c > number: 
                a=c
            else:
                b=c
            print(f"Ты не прав, случайное число находится в промежутке от {b} до {a}. Попробуй еще раз.")
                                                        
        else:          
            print("Ты круче знаменитой Ванги, поздравляем!")
            break
    except:
        print(f'Ошибка. {name.title()} вводи пожалуйста только целые числа.')        
        continue
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы