2013-06-13 2 views
2

Я немного задумываюсь о числовой игре, и у меня есть цикл while while, который я хочу продолжать цикл, пока пользователь не угадает правильное число , Прямо сейчас у меня есть номер, показанный для удобства тестирования. Я думаю, правильный номер или нет, но я получаю сообщение об ошибке «Объект Nonetype» не имеет атрибута «Угадай». Im confused, почему «while True» не имеет ошибки при первом запуске, но после этого возникает ошибка.Кажется, я не получаю цикл «while True», чтобы продолжать цикл

Tracker.py

from Number import * 

class Runner(object): 
def __init__(self, start): 
    self.start = start 
    print Integer.__doc__ 
    print Integer.code 

def play(self): 
    next_guess = self.start 

    while True: 
     next_guess = next_guess.Guess() 

     if next_guess == Integer.code: 
      print "Good!" 
      exit(0) 

     else: 
      print "Try again!" 

Integer = Random_Integer() 

Game = Runner(Integer) 

Game.play() 

Number.py

from random import randint 

class Random_Integer(object): 

"""Welcome to the guessing game! You have unlimited attempts 
to guess the 3 random numbers, thats pretty much it.""" 

def __init__(self): 
    self.code = "%d%d%d" % (randint(1,9), randint(1,9), randint(1,9)) 
    self.prompt = '> ' 

def Guess(self): 
    guess_code = raw_input(self.prompt) 

Спасибо!

ответ

8

Вашего метод .Guess() не возвращает ничего:

def Guess(self): 
    guess_code = raw_input(self.prompt) 

Вы должны добавить return заявления там:

def Guess(self): 
    guess_code = raw_input(self.prompt) 
    return guess_code 

Когда функция не имеет явный оператор возврата, то возвращение Значение всегда None. Таким образом, линия:

next_guess = next_guess.Guess() 

наборы next_guess к None.

Однако, даже если .Guess()делает возвращения это raw_input() результата, теперь заменил next_guess с результатом строки, и ваша следующая итерация цикла теперь будет не потому, что строковые объекты не имеет методы .Guess().

Вы также ссылаетесь на глобальное значение Integer, передавая его в качестве аргумента для вашего экземпляра Runner(), сохраняя его как self.start. Не полагайтесь на глобалов, у вас уже есть self.start:

class Runner(object): 
    def __init__(self, start): 
     self.start = start 
     print start.__doc__ 
     print start.code 

    def play(self):   
     while True: 
      next_guess = self.start.Guess() 

      if next_guess == self.start.code: 
       print "Good!" 
       exit(0) 

      else: 
       print "Try again!" 

В приведенном выше коде мы обойтись без доступа к Integer глобальным, а не с помощью self.start. Переменная next_guess строго используется для хранения текущего предположения, и вместо этого мы используем self.start.Guess().

+1

Стоит отметить: код OP будет по-прежнему ломаться после первого предположения, потому что, как только 'Guess' вернет значение угадывания, он все равно будет пытаться вызвать' Guess' в строке, а не в 'Random_Integer'. Ему нужно либо «Угадай» вернуть «сам» (и сохранить предположение где-то), либо, скорее всего, просто экземпляр «Random_Integer» хранится в другом месте, чтобы он не был перезаписан, например 'self.guesser = Random_Integer()', а затем ' next_guess = self.guesser.Guess() 'в цикле. –

+0

Я говорю о втором раз в цикле, когда 'next_guess' является строкой, и он пытается называть' Guess() 'на нем. Ему нужно, чтобы это было 'next_guess = Integer.Guess()' вместо этого. –

+0

Да, все адресовано. –

Смежные вопросы