Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何用用户输入替换字符串的元素_Python_List_Random - Fatal编程技术网

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

Python 如何用用户输入替换字符串的元素,python,list,random,Python,List,Random,下面是一个刽子手游戏的代码。到目前为止,一切都运行得很好。我遇到的唯一问题是,当用户猜对时,如何将带下划线的空格转换为正确的字母。我没有为它编写的代码,正在寻求一些帮助。它现在所做的就是返回空白下划线,即使你正确地猜到一个数字 import random responses = {'title': 'Welcome to Hangman the Game!', 'rules':'Once you guess \ wrong 6 times you lose. Using the same le

下面是一个刽子手游戏的代码。到目前为止,一切都运行得很好。我遇到的唯一问题是,当用户猜对时,如何将带下划线的空格转换为正确的字母。我没有为它编写的代码,正在寻求一些帮助。它现在所做的就是返回空白下划线,即使你正确地猜到一个数字

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'])

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

维护布尔值列表,
可见性
使得当且仅当您希望字符串中的字符#5可见时,
可见性[5]
才为真

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
游戏获胜

我将把它作为一个练习,将它合并到您的代码中

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