2016-03-08 6 views
0

Итак, я работаю над игрой с гаданием и одним из требований является «диапазон» номеров, которые нужно обновить, чтобы у пользователя было легче с их угадать ». Я создал новый вход, когда число слишком велико или слишком низкое. Тем не менее, я не очень хорош с циклами, и я не могу понять, почему мой цикл повторяется только один раз, не вставляя код снова и снова. Может ли кто-нибудь помочь, чтобы заявления elif повторялись до тех пор, пока номер не будет правильным?Guessing number game python

Это мой код до сих пор ...

import random 
random_number = random.randint(1,100) 
tries = 0 
while tries < 800: 
    guess = input("Guess a random number between 1 and 100.")  
    tries += 1 
    try: 
    guess_num = int(guess) 
    except: 
    print("That's not a whole number!") 
    break 

    if not guess_num > 0 or not guess_num < 101: 
    print("That number is not between 1 and 100.") 
    break 

    elif guess_num == random_number: 
    print("Congratulations! You are correct!") 
    print("It took you {} tries.".format(tries)) 
    break 

    elif guess_num > random_number: 
     print("Sorry that number is too high.") 
     guess_high = input("Guess a number between 0 and {} .".format(guess_num)) 

    elif guess_num < random_number: 
     print("Sorry that number is too low.") 
     guess_low = input("Guess a number between {} and 100 .".format(guess_num)) 

    else: 
     print("Sorry, but my number was {}".format(random_number)) 
     print("You are out of tries. Better luck next time.") 
+1

Вы не обновляя фактические диапазоны, но только печать из – Abundance

+0

так, как я мог обновлять диапазоны поэтому он подходит для сужения вкладов пользователей? – Devalur

+1

Вы не должны ломаться, если ответ не был прав. Удалите все другие вхождения 'break' – zondo

ответ

1
import random 
random_number = random.randint(1,100) 
tries = 0 
guess = input("Guess a random number between 1 and 100.")  
while tries < 800: 
    tries += 1 
    try: 
    guess_num = int(guess) 
    except: 
    print("That's not a whole number!") 
    break 

    if not guess_num > 0 or not guess_num < 101: 
    print("That number is not between 1 and 100.") 
    break 

    elif guess_num == random_number: 
    print("Congratulations! You are correct!") 
    print("It took you {} tries.".format(tries)) 
    break 

    elif guess_num > random_number: 
     print("Sorry that number is too high.") 
     guess = input("Guess a number between 0 and {} .".format(guess_num)) 

    elif guess_num < random_number: 
     print("Sorry that number is too low.") 
     guess = input("Guess a number between {} and 100 .".format(guess_num)) 

else: 
    print("Sorry, but my number was {}".format(random_number)) 
    print("You are out of tries. Better luck next time.") 
+0

Ваш код не будет работать, поскольку он не учитывает произвольные диапазоны, например, от 25-30. – Abundance

+0

(см. Мой другой пост). Поскольку пользователь может играть с использованием «двоичного поиска», я бы рекомендовал ограничить число попыток менее 800 (примерно 8 будет достаточно). Это ускорит тестирование последнего 'else:'. –

0

Для какого случая вашего цикл повторяется только один раз?

Петля сломается (поскольку у вас есть заявление перерыв в строке 15 в столбце «если не guess_num> 0 или нет guess_num < 101:»), если входной догадка меньше 0 или больше 100.

Если пользователь вводит неверное предположение между 1 и 100, тогда код выполняет цикл, и, следовательно, пользователю предлагается ввести другой номер.

Хотя он и делает цикл, цикл не обновляет диапазон. Что вы можете сделать, это установить значения range_min и range_max в качестве переменных и изменить эти переменные в соответствии с тем, если догадка слишком низкая или слишком высокая. Смотрите следующий код:

import random 
random_number = random.randint(1,100) 
tries = 0 
range_min = 0 
range_max = 100 
while tries < 800: 
    guess = input("Guess a random number between " + str(range_min +1) + " and " + str(range_max))  
    tries += 1 
    try: 
    guess_num = int(guess) 
    except: 
    print("That's not a whole number!") 
    break 

    if not guess_num > range_min or not guess_num < (range_max+1): 
    print("That number is not between str(range_min +1) + " and " +  str(range_max)") 
    break 

    elif guess_num == random_number: 
    print("Congratulations! You are correct!") 
    print("It took you {} tries.".format(tries)) 
    break 

    elif guess_num > random_number: 
     print("Sorry that number is too high.") 
     guess_high = input("Guess a number between 0 and {} .".format(guess_num)) 
range_max = guess_num 

    elif guess_num < random_number: 
     print("Sorry that number is too low.") 
     guess_low = input("Guess a number between {} and 100 .".format(guess_num)) 
range_min = guess_num 

    else: 
     print("Sorry, but my number was {}".format(random_number)) 
      print("You are out of tries. Better luck next time.") 
+0

My elif сужает предположение, так что пользователь имеет более легкое время, либо догадываясь над своим номером, если его слишком низко или ниже их числа, если он слишком высок, но после нового ввода он возвращается к угадыванию от 1 до 100, а не к обновленный диапазон – Devalur

+0

Я отредактировал свой ответ. Цикл выполняет цикл, когда пользователь вводит неверное предположение и запрашивает новое предположение, однако он не обновляет диапазон. –

0
  1. Не используйте break, как прекратить время цикла. См. Ссылку на язык python.

  2. Вы должны спросить только один раз за guess_num. Удалите два значения input, когда значение слишком велико или слишком низкое (значение переменной BTW guess было неверным).

  3. Последнее условие (из попыток) должен находиться вне контура while, так как он будет выполняться, когда количество попыток составляет более 800.

  4. Подсказки. Пользователь может играть в эту игру с эквивалентом двоичного поиска (начинать с 50, затем догадываться 25 или 75 в зависимости от того, выше или ниже и т. Д.). Вы должны разрешить около 8 попыток (не 800).

+0

Да, спасибо, ха-ха, у меня было 800 с целью следования и ошибок. – Devalur

0

Вот как обновить диапазоны:

import random 
random_number = random.randint(1,100) 
tries = 0 
low = 0 
high = 100 
while tries < 800: 
    if(tries == 0): 
    guess = input("Guess a random number between {} and {}.".format(low, high))  
    tries += 1 
    try: 
    guess_num = int(guess) 
    except: 
    print("That's not a whole number!") 
    break  

    if guess_num < low or guess_num > high: 
    print("That number is not between {} and {}.".format(low, high)) 
    break  

    elif guess_num == random_number: 
    print("Congratulations! You are correct!") 
    print("It took you {} tries.".format(tries)) 
    break  

    elif guess_num > random_number: 
     print("Sorry that number is too high.") 
     high = guess_num 
     guess = input("Guess a number between {} and {} .".format(low, high))  

    elif guess_num < random_number: 
     print("Sorry that number is too low.") 
     low = guess_num 
     guess = input("Guess a number between {} and {} .".format(low, high))  

    else: 
     print("Sorry, but my number was {}".format(random_number)) 
     print("You are out of tries. Better luck next time.") 
+0

Огромное вам спасибо – Devalur

+0

Нет проблем;) Кстати, окончательная проверка еще не обязательно должна быть там и может произойти вне цикла while (она никогда не дойдет до этого кода) – Abundance

0

Вот как я бы это сделать. Не уверен, что, если он работает, но подход был бы:

import random 

random_number = random.randint(1,100) 
max_tries = 100 
tries = 0 
left = 0 
right = 100 
found = False 


def get_number(): 
    try: 
     guess = int(input("Guss a random number between {} and {}".format(left, right)))    
     if guess > right or guess < left: 
      print("That number is not between {} and {}".format(left, right)) 
     return guess 
    except: 
     print("That's not a whole number!") 
     get_number() 

def update_range(guess): 
    if guess >= left: 
     left = guess 
    else: 
     right = guess   

while tries <= max_tries and not found: 
    guess = get_number() 
    tries=+1 
    if guess == random_number: 
     print("Congratulations! You are correct!") 
     print("It took you {} tries.".format(tries)) 
     found = True 
    else: 
     update_range(guess) 

    if not found: 
     print("Sorry, but my number was {}".format(random_number)) 
     print("You are out of tries. Better luck next time.") 

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

Также необходимо обновление диапазона. И спасибо параметризованные строки Я могу рассказать пользователю, что это за диапазон.

Я также установить флаг знать, нашел ли пользователь число или не в конце игры