2014-04-05 4 views
0

Я пытаюсь создать игру, в которой два пользователя вводят буквы, пока они не угадают секретное слово, но по некоторым причинам мои списки не обновляются должным образом. Допустим, секретное слово TOYS, если пользователь догадывается, что T отображает T _ _ _, а затем пользователь вводит R, поэтому он переключается на secondLoop, и пользователь входит в S, он говорит, что S не находится в слове и переходит к первому пользователю , Это игра-догадка, которая меняется между двумя игроками, и когда она меняется на второго игрока, она не работает по какой-то причине. Не могу понять, почему. Функция secondLoop имеет те же компоненты с дополнительными строками «#»Python две петли

+0

Либо вы не форматировать Ваш код правильно при отправке или ваш отступы из сильный удар. –

+0

Почему у вас нет двоеточия после первого цикла? –

+0

@ I.K. что лучше –

ответ

0

В вашей функции secondLoop она, как представляется, называет себя рекурсивно навсегда. Это может быть причиной вашей ошибки. Я изменил рекурсивный сам вызов на оператор возврата и, похоже, работает нормально. Я прокомментировал изменения ниже, например ...

def secondLoop(enteredLetters,sentence,newSentence,lettersInWord): 
    print '--Player 2--' 
    number = len(sentence) 
    flag = True 
    while flag == True: 
     # changed input to raw_input 
     letter = raw_input("Enter letter: ") 

     if letter not in enteredLetters: 
      find = sentence.find(letter) 
      if find == -1: 
       print("Letter is not in word") 
       flag = False 
       # --- changed line below to return statement below it --- 
       #enteredLetters,newSentence,lettersInWord = secondLoop(enteredLetters,sentence,newSentence,lettersInWord) 
       return enteredLetters,newSentence,lettersInWord 
      else: 
       newSentence = "" 
       lettersInWord.append(letter) 
       for char in sentence: 
        if char in lettersInWord: 
         newSentence = newSentence + char 
        else: 
         newSentence = newSentence + "_ " 
       number = newSentence.count("_") 
       flag = True 
     elif letter in enteredLetters: 
      print ("The letter has been used") 
      flag = False 
      # --- changed line below to return statement below it --- 
      #enteredLetters,newSentence,lettersInWord = secondLoop(enteredLetters,sentence,newSentence,lettersInWord) 
      return enteredLetters,newSentence,lettersInWord 

     print (newSentence) 
     enteredLetters.append(letter)  

sentence = 'TOYS' 
enteredLetters = [] 
newSentence = '____' 
lettersInWord = [] 

number = len(sentence) 
while number != 0: 
    print '--Player 1--' 
    # changed input to raw_input 
    letter = raw_input("Enter letter: ") 

    if letter not in enteredLetters: 
     find = sentence.find(letter) 
     if find == -1: 
      print("Letter is not in word") 
      enteredLetters,newSentence,lettersInWord = secondLoop(enteredLetters,sentence,newSentence,lettersInWord) 
     else: 
      newSentence = "" 
      lettersInWord.append(letter) 
      for char in sentence: 
       if char in lettersInWord: 
        newSentence = newSentence + char 
       else: 
        newSentence = newSentence + "_ " 
      number = newSentence.count("_") 
    elif letter in enteredLetters: 
     print ("The letter has been used") 
     enteredLetters,newSentence,lettersInWord = secondLoop(enteredLetters,sentence,newSentence,lettersInWord) 
    print (newSentence) 
    enteredLetters.append(letter)  
+0

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

+0

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

+0

Можете ли вы предоставить копию вашего трассировки/сообщения об ошибке стека? – Genome

0

Хорошая структура программы делает жизнь намного проще:

from itertools import cycle 
import string 

UNKNOWN  = "_" 
ALWAYS_SEEN = set(" " + string.punctuation) 

def get_letter(prompt): 
    while True: 
     ch = input(prompt).strip().upper() 
     if len(ch) == 1: 
      return ch 

def seen_word(word, guessed): 
    return ''.join(ch if ch in guessed or ch in ALWAYS_SEEN else UNKNOWN for ch in word) 

def play_hangman(word, players): 
    word = word.strip().upper() 
    guessed = set() 
    seen = seen_word(word, guessed) 

    for current_player in cycle(players): 
     while True: 
      print(seen) 
      ch = get_letter("{}: guess a letter: ".format(current_player)) 

      if ch in guessed: 
       print("That letter has already been guessed!") 
       break 
      else: 
       guessed.add(ch) 

      if ch in word: 
       print("That's the way to do it!") 
       seen = seen_word(word, guessed) 
      else: 
       print("Sorry, that letter is not in the word.") 
       break 

      if seen == word: 
       print("Hurray! {} won!".format(current_player)) 
       return current_player 

def main(): 
    word = "TOYS" 
    players = ["Player 1", "Player 2"] 
    play_hangman(word, players) 

if __name__=="__main__": 
    main() 
Смежные вопросы