2014-10-29 4 views
1

Вот проблемный кусок моей функции:Реализация палач функции в Python

def hangman1(word): 
global guessesMade 
global guessesLeft 
currentGuess = '_ ' * len(word) 
let = print(input('Please guess a letter: ')) 
for i in range(len(word)): 
    if word[i] == let: 
     print('{} is contained in the word.'.format(let)) 
     if i == 0: 
      currentGuess = word[0] + currentGuess[1:] 
     else: 
      currentGuess = currentGuess[:i] + word[i] + currentGuess[i + 1:] 
print(currentGuess) 

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

Любая помощь приветствуется.

+0

Вы не можете использовать функцию 'replace' напрямую; вам также нужно срезать. См. Здесь: http://stackoverflow.com/questions/12723751/replacing-letter-in-string-by-index – 101

+0

Не знаете, почему этот вопрос был опущен. ОП попытался решить проблему сам, дал четкое описание того, где он застрял и что он пытался. Как первый пост, это довольно хорошо. Я голосую. –

ответ

2

Основная проблема, с которой вы сейчас сталкиваетесь, - это два варианта: один, что метод replace() заменяет все экземпляры любого заданного ввода внутри строки, а не первой, и двух, что вы не в настоящее время есть способ сообщить, какие письма вы уже обнаружили. Вызов replace («_», let) всегда будет заменять каждый отдельный экземпляр «_» и при условии, что вы применяете его к строке только, состоящей из символов подчеркивания, она всегда будет перезаписывать всю строку. Кажется, что вы также обновляете hidden_let каждый раз, когда hangman() вызывается с буквой угадывания, что означает, что в лучшем случае с вашим дизайном теперь вы будете только показывать каждую букву, которую только что догадали пользователи, и куча подчеркиваний в противном случае ,

Что вы хотите сделать, это иметь два значения: correct_word и current_guess. correct_word будет тем словом, которое игрок должен угадать, а current_guess будет их успехом в угадывании слова, начиная с строки только подчеркивания той же длины, что и right_word.

Вот краткий пример. Я взял на себя смелость удалить ваши глобальные ссылки - глобальные глобальные символы, как правило, не одобряются, и инкапсулировали поведение в небольшом классе. Вы хотите заменить значение в hangmanner.play_hangman() любым вашим случайным словом.

class Hangmanner: 
    correct_word = ''  
    current_guess = '' 

    def play_hangman(self, word): 
     self.correct_word = word 

     self.current_guess = '_' * len(self.correct_word) 

     while self.current_guess != self.correct_word: 
      self.guess_letter(input("Please guess a letter: ")) 

    def guess_letter(self, guessed_letter): 
     for i in range(len(self.correct_word)): 
      if self.correct_word[i] == guessed_letter: 
       if i == 0: 
        self.current_guess = self.correct_word[i] + self.current_guess[1:] 
       else: 
        self.current_guess = self.current_guess[:i] + self.correct_word[i] + self.current_guess[i + 1:] 
     print(self.current_guess) 

if __name__ == "__main__": 
    hangmanner = Hangmanner() 
    hangmanner.play_hangman("test") 

Это использует функцию нарезки в Python, где вы можете использовать скобки и [первый: последний] синтаксис для доступа к произвольному диапазону любой данной коллекции. Если первый или последний отсутствует, срез продолжается до начала или конца коллекции, соответственно. Выше current_guess [1:] возвращает current_guess со второго индекса на последний. current_guess [: i] возвращает current_guess от первого индекса до индекса, предшествующего i, учитывая, что последний является исключительной границей конца.

+0

Я могу добавить остальную часть функции, если она будет полезна. – Droxbot

+0

Где/что? Ваше сообщение выглядит одинаково, и в вашем комментарии ничего не появилось. – furkle

+0

Я обновил функцию в исходном вопросе. Он несколько работает, но он все равно не будет распечатан в правильном формате. Может быть, я перепутал где-то по пути. – Droxbot

2

hiddenLet.replace('_',let) заменяет все вхождения _ любым let.

newWordList = [x if x==let else '_' for x in randWord] 
newWord = ''.join(newWordList) 
+1

Строки неизменяемы. – 101

+0

на да, забыл об этом –

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