2017-09-25 118 views
-1

我確實需要幫助來修復此代碼。基本上,這是一個hang子手遊戲,用戶可以猜測字母單詞(Python)幫助修復Hang子手遊戲

如果用戶輸入一個字母,它將像普通的hang子手遊戲一樣工作。然而,最後的機會(猜測#6)必須是一個詞。如果用戶在猜測#6之前使用了字母猜測並得到了正確的結果,用戶就不會猜測這個單詞。

用戶可以事先猜出這個單詞,但如果它錯了,他們將失去兩次機會。所以如果他們一開始就猜錯詞,他們將有4次機會,但最後的機會仍然是猜測。

編輯:該程序現在只有5個字母猜測是對還是錯,但最終的猜測仍然是一個單詞猜測,我們仍然有可選的早期單詞猜測。櫃檯現在似乎在工作,但我不確定如何區分這些單詞。 (編輯:我意識到還有一個問題要附加單詞。)

這是我當前的代碼。 我改變了它的部分(計數器< 5)在用戶猜測。 (計數器== 5)的部分與舊的代碼相似。

import random 

wordlist = 'artist breeze circle decent enroll filthy growth honest invest kernel letter narrow meteor policy pursue roster runway scheme ripple toddle wobbly zeroes'.upper().split() 
random.shuffle(wordlist) 
counter = 0 

def draw_board(): 
    #Display words here 
    for i in secret_word: 
     if i in correct: 
      print(i, end=' ') 
     else: 
      print('_', end=' ') 
    print("\n") 
    print("*** MISSES ***") 
    for i in incorrect: 
     print(i, end=' ') 
    print('\n*********************') 


def user_guess(): 
    #For user to input guess 
    global counter 
    secret_word = wordlist.pop() 
    while(counter < 5):   
     guess = input("Guess a letter or word\n: ").upper() 
     if(len(guess) > 1): 
      guess_list = list(guess) 
      if(guess_list == secret_list): 
       correct.append(guess_list) 
      else: 
       counter = counter + 1 
     elif guess in secret_word: 
      correct.append(guess) 
     else: 
      incorrect.append(guess) 
     return counter 
    if(counter == 5): 
     wordguess = input("Enter your word\n: ").upper() 
     if(guess == secret_word): 
      correct.append(wordguess) 
     else: 
      counter = counter + 1 
      print(counter) 
    return counter 

def check_win(): 
    #Check if user has won or not 
    global counter 
    if(counter > 5): 
     return 'loss' 
    for i in secret_word: 
     if i not in correct: 
      return 'no win' 
    return 'win' 

#pop is used to retrieve a word from word list 
secret_word = wordlist.pop() 
secret_list = list(secret_word) 
correct = [] 
incorrect = [] 
print("DEBUG: %s" % secret_word) 

while True: 
    draw_board() 
    user_guess() 
    counter = counter + 1 
    win_condition = check_win() 
    if win_condition == 'loss': 
     print("You lose!") 
     break 
    elif win_condition == 'win': 
     print("You win!") 
+0

代碼的具體問題是什麼?它出錯了哪裏? –

+0

@Peter當用戶輸入一個單詞時,程序不會檢測到,所以即使用戶輸入正確的單詞,它也會繼續遊戲。儘管機會超過6,它也會持續不斷,所以在櫃檯或邏輯上肯定存在缺陷。對不起,沒有正確處理這個問題。我編輯了這個問題。 – Sar

回答

0

在這裏至少應該修改3件事以避免額外的循環。

  1. 添加一個休息後print("you win")
  2. 刪除counter = 0在user_guess與 def user_guess(counter):
  3. 取代def user_guess():counter = user_guess(counter)

更換user_guess()另外,你或許應該改變user_guess(的田地)以IFS 。

0

調試問題有兩種主要方式。首先是分散打印報表以顯示發生的情況,第二種是使用像pdb這樣的調試器。

調試器允許您逐步瀏覽代碼,並且是追蹤問題的最佳方式,所以您應該學會如何使用它,但是打印語句通常很有用並且易於理解,所以我將演示這裏。

這聽起來像是遊戲繪製正確,所以我們將專注於邏輯。讓我們在主要的while循環中輸入打印語句來顯示程序狀態。 (我也刪除了一些不必要的打印語句來縮短輸出)。

while True: 
    draw_board() 
    user_guess() 
    win_condition = check_win(counter) 
    print('secret_word: {}, correct: {}, incorrect: {}, counter: {}, win_condition: {}'.format(
     secret_word, correct, incorrect, counter, win_condition)) 

    if win_condition == 'loss': 
     print("You lose!") 
     break 
    elif win_condition == 'win': 
     print("You win!") 

下面是一個示例遊戲,這樣的輸出:

Guess a letter or word: a 
secret_word: ZEROES, correct: [], incorrect: ['A'], counter: 0, win_condition: no win 
_ _ _ _ _ _ *** MISSES *** 
A 
Guess a letter or word: e 
secret_word: ZEROES, correct: ['E'], incorrect: ['A'], counter: 0, win_condition: no win 
_ E _ _ E _ *** MISSES *** 
A 
Guess a letter or word: n 
secret_word: ZEROES, correct: ['E'], incorrect: ['A', 'N'], counter: 0, win_condition: no win 
_ E _ _ E _ *** MISSES *** 
A N 
Guess a letter or word: t 
secret_word: ZEROES, correct: ['E'], incorrect: ['A', 'N', 'T'], counter: 0, win_condition: no win 
_ E _ _ E _ *** MISSES *** 
A N T 
Guess a letter or word: zeroes 
secret_word: ZEROES, correct: ['E', 'ZEROES'], incorrect: ['A', 'N', 'T'], counter: 0, win_condition: no win 
_ E _ _ E _ *** MISSES *** 
A N T 
Guess a letter or word: test 
secret_word: ZEROES, correct: ['E', 'ZEROES'], incorrect: ['A', 'N', 'T'], counter: 0, win_condition: no win 
_ E _ _ E _ *** MISSES *** 
A N T 

因此馬上就可以看到一些問題。

  • counter不被遞增後,每猜
  • 當我猜到了正確的單詞,它追加整個單詞到correct列表,而不是單個字母
  • 當我猜到了不正確的話,counter是不改變

因此,一些問題進行修復:

  • 確保您獲取user_guess(計數器)的返回值並將其分配給您的全局變量counter - 由於範圍的原因,這兩個變量是單獨的變量。你也可以只是把global counteruser_guess功能
  • 確保你每個不正確的猜測後,計數器遞增
  • 沒有計時器歸零在每個用戶猜測
  • correct.append(guess)應改爲單獨添加每個字母

嘗試進行這些更改並再次測試。如果您仍然遇到問題,請添加更多的打印語句,並查看是否可以找到問題。

+0

感謝您的詳細回覆。我很抱歉再次打擾,但儘管問題得到解決,我不知道如何解決這些問題,也沒有找到解決辦法。我如何去做這件事? – Sar

+0

@Sar你嘗試了什麼?您是否可以更新問題以及在更改後遇到的問題? –

+0

我已經更新了這個問題。到目前爲止,我只設法讓全球反擊工作。 – Sar