2014-10-24 1 views
0

позволяет сказать, что у меня есть слово: «Пицца»Python: Раскрывая слово для Виселицы (струнного, заменить, индекс и полосы)

sAnswer = "Pizza" 
sReveal = len(sAnswer)* "_ " 

Выше я построил строку, которая бы дисплей «_ _ _ _ _ "

Как и любая другая игра Hangman, она будет содержать символы подчеркивания моей проблемы: как мне удалить sReveal пробелов, найти указатель угадываемой буквы (пример: 'z'), а затем заменить подчеркивания с z, где это необходимо, а затем перестроить промежутки между ними, поэтому оно станет следующим: «_ _ zz _»

Я пытался что-то вроде этого без толка:

if sLetterGuessed in list(sAnswer): 

    for character in list(sAnswer): 
     index = sAnswer.find(sLetterGuessed) 
     sReveal = sReveal.replace(" ", "") 
     list(sReveal)[index] = "z" 

     print sReveal 

     for char in sReveal: 
      sReveal = sReveal.strip(" ") 
      sReveal = sReveal.replace("_", char) 

    print sReveal 
    print HangingMan[iErrors] 

## The code is just consideration of the route I'm taking with this; the horrible route. 
+0

Попробуйте это: '»».join ("P ____")' – inspectorG4dget

ответ

0

Простой способ обновления sReveal является использование списка комп и str.join:

sAnswer = "Pizza" 
sReveal = len(sAnswer)* "_ " 
letter_guessed = "z" 
# if letter_guessed == current letter in word, add that letter else add a _ 
sReveal = " ".join([x if x==letter_guessed else "_" for x in sAnswer ]) 
print(sReveal) 
_ _ z z _ 

старый палач игра, которую я должен был сделать для курса может быть полезно:

def hangman(secret_word): 
    from string import ascii_lowercase 
    print ("Welcome to Hangman!") 
    print ("I am thinking of a word that is {} letters long\n-----------".format(len(secret_word))) 
    guesses = 8 
    letters_guessed = [] 
    missed_l = '' 
    correct_l = '' 
    secret_word = secret_word.lower() 
    while True: 
     # if all the letters in secret_word are in correct_l , the user has won 
     if all(x in correct_l for x in secret_word): 
      print ("Congratulations, you won!") 
      break 
     # if len missed letters is 8, user has used up all guesses so break/end teh game 
     elif len(missed_l) == 8: 
      print ("Sorry, you ran out of guesses. The word was {}.".format(secret_word)) 
      break 
     print ("You have {} guesses left".format(guesses)) 
     print ("Available Letters: {}".format(" ".join([x for x in ascii_lowercase if x not in letters_guessed]))) 
     guess = raw_input("Please guess a letter: ").lower() 
     # if guess in letters_guessed user has already guessed that letter 
     if guess in letters_guessed: 
      print ("Sorry You've already guessed that letter: {}\n-----------".format(guess)) 
     # else if it is in the word, add guess to correct_l and to letters guessed 
     elif guess in secret_word: 
      letters_guessed.append(guess) 
      correct_l += guess 
      print("Good guess: {}\n-----------".format(" ".join([x if x in letters_guessed else "_" for x in secret_word]))) 
     # if users guess is not in the word, minus a life/guess 
     elif guess not in secret_word: 
      letters_guessed.append(guess) 
      guesses -= 1 
      print (" That letter is not in my word: {}\n-----------".format(" ".join([x if x in letters_guessed else "_" for x in secret_word]))) 
      missed_l += guess 
+0

Ваш код работает, но sReveal сбрасывает себя (внутри цикла while) И не сохраняет его значение после того, как его угадала запись. Я хотел бы сохранить «_ _ zz _» , затем разрешить игроку снова угадать «а», чтобы следующий sReveal был «_ _ zza» – 42Cosmic

+0

@ 42Cosmic, вам нужно отслеживать все буквы, цикл, то вам просто нужна эта единственная строка кода для обновления sReveal. –

0

Вы преобразование sReveal в список, но вы не экономить список, так что не имеет никакого эффекта после того, как все.

Попробуйте это:

aReveal = list(sReveal) 

index = sAnswer.find(sLetterGuessed) 
while index >= 0: 
    aReveal[index] = sLetterGuessed 
    index = sAnswer.find(sLetterGuessed, index + 1) 

sReveal = ''.join(aReveal) 
print sReveal 
+0

К сожалению, я не понимаю, что вы имеете в виду под «спасительной т он перечисляет "и как вы это делаете? sReveal = '' .join (aReveal) – 42Cosmic

+0

Я имел в виду эту строку: list (sReveal) [index] = "z". Вы создаете список, используя sReveal, но вы не назначаете список переменной. И создание списка на основе sReveal фактически не изменяет sReveal. Поэтому, когда вы печатаете sReveal в следующей строке, он просто печатает исходную строку. Обратите внимание, что в моем коде я присваиваю список aReveal, вношу изменения, а затем назначаю его обратно в sReveal. – linus