(Python)帮助修复一个Hangman游戏

时间:2017-09-25 23:41:27

标签: python python-3.x

我真的需要帮助来修复此代码。基本上,这是一个刽子手游戏,用户可以猜测字母

如果用户输入一封信,它将像普通的刽子手游戏一样工作。然而,最后的机会(猜猜#6)必须是一个词。如果用户使用字母猜测并在猜测#6之前将其更正,则用户不会通过单词guess。

用户可以事先猜出这个词,但如果错误,他们将失去2个机会。因此,如果他们在开始时猜错了单词,他们将有4个机会,但最后一次机会仍然是猜猜。

编辑:该程序现在只有5个字母的猜测是对还是错,但最后的猜测仍然是一个单词猜测,我们仍然有可选的早期猜测。该计数器似乎现在正在运作,但我不确定如何分开这些单词。 (编辑:我已经意识到附加单词也有问题。)

这是我目前的代码。 当用户猜测它(计数器< 5)时我改变了部分。 (counter == 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!")

2 个答案:

答案 0 :(得分:0)

这里至少应该改变3件事以避免额外的循环。

  1. counter = 0
  2. 之后添加休息时间
  3. 删除user_guess中的def user_guess():并将def user_guess(counter):替换为 user_guess()
  4. counter = user_guess(counter)替换为 -Xss512k -Xms6g -Xmx6g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=70 -XX:NewRatio=1 -XX:SurvivorRatio=6 -XX:G1ReservePercent=10 -XX:G1HeapRegionSize=32m -XX:ConcGCThreads=6 -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
  5. 此外,您应该将user_guess()中的while更改为ifs。

答案 1 :(得分:0)

调试问题主要有两种方法。第一种是分散打印报表以显示正在发生的事情,第二种是使用类似pdb的调试程序。

调试器允许您逐步执行代码并且是跟踪问题的最佳方法,因此您应该学习如何使用它,但是打印语句通常很有用且易于理解,因此我将演示在这里。

听起来游戏绘图正确,所以我们会专注于逻辑。让我们放入print语句来显示主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 counter放入user_guess函数
  • 确保在每次错误猜测后递增计数器
  • 在每个用户猜测时不要将计数器重置为零
  • correct.append(guess)应更改为单独附加每个字母

尝试进行这些更改并再次测试。如果您仍然遇到问题,请添加一些打印报表,看看是否能找到问题。

相关问题