2014-10-29 86 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 2014-10-29 02:57:01

+0

不知道爲什麼這個問題downvoted。 OP試圖解決他/她自己的問題,清楚地描述他被困在哪裏以及他所嘗試的是什麼。作爲第一篇文章,這非常好。我正在投票。 – 2014-10-29 20:21:30

回答

2

你現在遇到的主要問題是雙重的 - 一個,那替換()方法替換字符串,而不是第一個中的任何給定輸入的所有實例,和兩個,你做不目前有任何方法可以告訴你已經發現了哪些字母。調用替換(「_」,讓)永遠取代「_」的每一個實例,因爲你申請的是一個字符串,只有下劃線組成,它會始終覆蓋整個字符串。好像你還再生hidden_​​let每次劊子手()被調用帶猜字母,意思就是最好的情況與您的設計,現在你只打算永遠顯示每一封信用戶只需猜測和一堆下劃線的,否則。

你想要做的是有兩個值,correct_word和current_guess。 correct_word將是玩家必須猜測的單詞,current_guess將是他們猜測單詞的進度,從與correct_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") 

這使用切割功能的蟒蛇,在那裏你可以使用括號和[第一:去年]語法訪問任何收集的任意範圍。如果缺少第一個或最後一個,則切片分別繼續到集合的開始或結束。以上,current_guess [1:]將current_guess從第二個索引返回到最後一個索引。 current_guess [:i]返回current_guess從第一個索引到i之前的索引,因爲last是唯一的結束邊界。

+0

如果它有幫助,我可以添加其餘的功能。 – Droxbot 2014-10-29 03:01:34

+0

哪裏/什麼?您的帖子看起來完全相同,您的評論中沒有任何內容顯示。 – furkle 2014-10-29 03:54:06

+0

我更新了原始問題中的功能。它有點工作,但仍不能以正確的格式打印出來。也許我在一路上的某個地方搞砸了。 – Droxbot 2014-10-29 03:54:31

2

hiddenLet.replace('_',let)替換任何let代表_所有出現。

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

字符串是不可變的。 – 101 2014-10-29 03:11:07

+0

是的,忘了 – 2014-10-29 03:12:51