如何用用户输入替换字符串的元素

以下是子手游戏的代码。到目前为止,一切都工作正常,我遇到的唯一麻烦是弄清楚了如何在用户正确猜出的情况下用正确的字母转换带下划线的空格。我没有编写任何代码,正在寻求帮助。当前所做的就是即使您确实正确猜出了一个数字,也会返回空白下划线

import random

responses = {'title': 'Welcome to Hangman the Game!','rules':'Once you guess \
wrong 6 times you lose. Using the same letter twice does not count as a guess.',\
             'correct':'Well done,your guess is correct!',\
             'incorrect':'Sorry,your guess is incorrect...',\
             'win':'Well done,you win!',\
             'lose':'Out of guesses. You lose.'}

words = ['cat','dog','work','school','game','one','hangman','apple','orange','list','words','bicycle','four','snowing','backpack','computer','house','water','plant','hour']

game = random.choice(words)

print(game) # just in for ease of programming

guesses = 0

letter = []

length = len(game)

numletter = game.replace(game,'_ '*length) # display number of letters

while guesses < 6:
    print(numletter) # need to replace this with the code I will hopefully learn from this
    user = input('Guess a letter here: ')
    if user in game:
        if user not in letter:
            print(responses['correct'])

    if user not in game:
        if user not in letter:
            print(responses['incorrect'])
            guesses += 1


    if user not in letter:
        letter.append(user)

        print('You have guessed these letters',letter)

    else: 
        print('You have already guessed that letter,try again.')


    if user == game:
        print(responses['win'])
        break

else:
    print(responses['lose'])

这是我得到的一些输出

water
_ _ _ _ _ 
Guess a letter here: a
Well done,your guess is correct!
You have guessed these letters ['a']
_ _ _ _ _ 
Guess a letter here: w
Well done,your guess is correct!
You have guessed these letters ['a','w']
_ _ _ _ _ 
Guess a letter here: w
You have already guessed that letter,try again.

如您所见,空白保持不变]

b342874914 回答:如何用用户输入替换字符串的元素

维护布尔值列表visibility,以便且仅当您希望字符串中的字符#5可见时,visibility[5]才为true。

import io
class HiddenString:

    def __init__(self,word):
        self._word = list(str(word))
        self._visibility = [False]*len(self._word)

    def make_all_instances_visible(self,char):
        char = str(char)
        assert(len(char) == 1)
        for idx in range(len(self._word)):
            if self._word[idx] == char:
                self._visibility[idx] = True
        return

    def __str__(self):
        with io.StringIO() as string_stream:
            for idx in range(len(self._word)):
                char = "_"
                if self._visibility[idx]:
                    char = self._word[idx]
                print(char,end="",file=string_stream)
            stryng = string_stream.getvalue()
        return stryng

###################################################################

secret = HiddenString("secret")
print(secret)
secret.make_all_instances_visible("e")
print(secret)

下面是控制台输出:

______
_e__e_
,

一个有趣的字符串函数是.translate()。它使用字符的序数字典,并将其转换为字典的值。因此,如果您将解决方案词的所有序号放入翻译表中,将其翻译为下划线,然后翻译该词,则所有内容都将得到下划线:

>>> word = 'apple'
>>> xlat = {ord(c):'_' for c in word}
>>> xlat
{97: '_',112: '_',108: '_',101: '_'}
>>> word.translate(xlat)
'_____'

现在,如果您有猜测,请测试该序号键是否在转换表中,如果是,则将其删除。当您再次翻译时,替换的字母将不会替换:

>>> guess = 'p'
>>> ord(guess) in xlat
True
>>> del xlat[ord(guess)]
>>> word.translate(xlat)
'_pp__'

word.translate(xlat) == word赢了。

我将其保留为将其合并到您的代码中的练习。

本文链接:https://www.f2er.com/3162846.html

大家都在问