2014-12-07 5 views
0

Я пытаюсь создать текстовую игру палача. У меня есть два списка:Как вы можете заменить каждое значение в списке другим значением?

  • один со словом, хранящимся в нем
  • один для отображения «*», чтобы заменить буквы из другого списка.

Я могу проверить слова в первом списке и заменить его, только если есть одно вхождение.

Например: слово «DEAD» и пользовательские входы D. Выход будет тогда D ***, потому что он находит только один.

Текущий код для замены из одного списка в другой список:

if guess() == True: 
    pos = word.index(guessed) 
    display[pos] = word[pos] 
    print('Correct: ', display) 

Как я могу изменить код, чтобы он заменяет все вхождения в списке?

+0

Возможно связано: http://codereview.stackexchange.com/questions/63833/guess-the-word-save-yourself-game/63971#63971 –

ответ

4

Вы можете использовать zip, чтобы сравнить ответ с текущей строкой по букве. Затем используйте выражение генератора в пределах join, чтобы проверить правильность буквы, иначе не меняйте ее. Вам все равно нужно добавить логику, чтобы отслеживать, как они были повешены.

answer = 'dictionary' 
current = '*'*len(answer) # Produces '**********' 

while current != answer: 
    guess = input('guess a letter: ') 
    current = ''.join(guess if guess == letter else blank for blank, letter in zip(current, answer)) 
    print(current, '\n') 

Тестирование

guess a letter: i 
*i**i***** 

guess a letter: d 
di**i***** 

guess a letter: c 
dic*i***** 

guess a letter: t 
dicti***** 

guess a letter: n 
dicti*n*** 

guess a letter: l # Note this letter was wrong so the word didn't change 
dicti*n*** 

guess a letter: o 
diction*** 

guess a letter: r 
diction*r* 

guess a letter: a 
dictionar* 

guess a letter: y 
dictionary 
+0

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

0
word = "DEAD" 

inp = "D" 

print("".join([s if inp == s else "_" for s in word])) 
D__D 

Вы должны также использовать if guess()if guess() == True, если догадка() будет либо быть истинной или ложной, если оно retutns логического значения.

Если вы используете функции:

secret_word = "DEAD" 


def is_guessed(secret_word, letters_guessed): 
    return all(x in letters_guessed for x in secret_word) 


def get_guessed_word(secret_word, guessed): 
    return "".join([letter if letter in guessed else "_" for letter in secret_word]) 

letters_guessed = set() 

guess = "" 
lives = 5 
while True: 
    if is_guessed(secret_word,letters_guessed): 
     print("Congratulations you guessed {}.".format(secret_word)) 
     break 
    elif lives == 0: 
     print("Out of lives the word was {}.".format(secret_word)) 
     break 
    print("You have {} lives remaining".format(lives)) 
    inp = input("Enter a letter ").upper() 
    if inp in letters_guessed: 
     print("Already picked that letter") 
     continue 
    letters_guessed.add(inp) 
    if inp.lower() in secret_word: 
     print("Good guess") 
     print(get_guessed_word(secret_word, letters_guessed)) 
    else: 
     print("{} is not in the word".format(inp)) 
     lives -= 1 
+0

Технически делает то, что ОП запрашивает, а не то, что ОП будет хотеть, поскольку нет памяти, в отличие от ответа Кибера. –

+0

@OliverW., Поэтому устанавливаем переменную = '" ".join ([s if inp == s else" _ "для s в слове])' и обновление, которое не будет делать то, что OP не хочет? –

+0

Нет, нет, не поймите меня неправильно. Ваш ответ правильный. Но каждый раз, когда догадка делается, она только покажет положение * этой конкретной догадки * в слове. Он не покажет всех тех, которые были догаданы. –

0
word = "dead" 
right_answer = set() #1 

def replace_star(): # this part is relevant to your quesiton 
    uncoverd = "" # first it makes a empty string 
    for char in word: # loops trough every character in the word 
     if char in right_answer: # if the character is in the set of right_answers 
      uncoverd += char # it adds the character to the empty string 
     else: # if is not 
      uncoverd += "*" # it add a '*' 
    return uncoverd # returns the new word with all the character replaced with eiter a '*' or the guesses right character 

score = 10 
while True: 
    uncoverd = replace_star() 
    print ("Word:",uncoverd) 
    answer = input("Guess one character of the word.\n>>") 
    if answer in word: # 2 
     print ("Spot on!") 
     right_answer.add(answer) # 3 
     if right_answer == set(word): # 4 
      print ("You Win!") 
      print ("The word was:", word) 
      break 
    else: 
     score -= 1 
     print ("Wrong") 
     print ("Score: '%s'"%score) 
     if score == 0: 
      print ("You Lose!") 
      break 

с помощью set вы можете проверить, если все уникальные предметы последовательности присутствуют в другом

  1. вы создаете пустой набор
  2. проверьте, не введен ли пользовательский символ в word
  3. добавьте этот символ в right_answer
  4. проверьте, равен ли right_answer набор символов в слове.