2017-09-25 120 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