Python中的Hangman游戏:如何用猜测字母替换空格

2024-04-29 09:15:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个学校项目创建一个简单的Hangman实现,我目前的任务是让一个字母在猜对的时候在单词中显示出来。我已经有了根据单词中字母的数量生成空格的代码,以及我所需要的几乎所有其他游戏组件,但是我不知道如何用正确的字母替换空格。

如果你能简单地解释一下,我将不胜感激,因为我对编程还很陌生。如果可能的话,这样我就不用修改太多代码了。

这是我的代码:

import random

name = str(input("What's your name?"))
print("Hello,", name + "!")
failures = 0
allowed = 1
guessed = str()
wordlist = ['hangman', 'dinner', 'computer', 'america', 'olympics', 'football', 'minecraft', 'jacket', 'cabbage', 'electricity', 'dog',
            'pasta', 'japan', 'water', 'programming', 'anaconda', 'onehunga', 'name', 'windows', 'curtains', 'bieber', 'kirito',
            'montenegro', 'wheel', 'civilization', 'physics', 'bluebird' 'table', 'ACDC', 'guardian yam' 'mario', 'parachute', 'agario', 'obama',
            'youtube', 'putin', 'dairy', 'christianity', 'club penguin', 'oskahlavistah', 'coins', 'agitating', 'jumping', 'eating',
            'your mom', 'executive', 'car', 'jade', 'abraham', 'sand', 'silver', 'uranium', 'oscar is gay', 'bioshock', 'fizzle', 'moonman', 'watermelon',
            'WAHAHAHAHAHA', 'steve jobs', 'extreme', 'weeaboo jones', 'hot damn', name]

def correct(guess):
    if guess in word:
        if guess not in guessed:
            print("Correct")
            return(True)
    else:
        if guess not in word and len(guess) == 1 and guess in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ':
            if guess not in guessed:
                print("Incorrect!")
                return(False)

print("Guess this word!")
print("You can input any letter from A to Z and the space key.")
wordnumber = random.randint(0, len(wordlist))
word = (wordlist[wordnumber])
print("_ "*len(word))
while failures < allowed:
    guess = str(input("Guess a letter!"))
    if len(guess) != 1 or guess not in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ':
        print("That is not a letter, try again.")
    if guess in guessed:
        print("You have already guessed that letter, try again.")
    iscorrect = correct(guess)
    guessed = guessed, guess
    if iscorrect == True:
        print("Word display still in development")
    if iscorrect == False:
        print("You suck")
        failures = failures+1
        print("You have", allowed , "guesses left.")
    if failures == allowed:
        replay = str(input("Press 1 to play again, press 2 to exit."))
        if replay == 1:
            break
        else:
            quit()

#Now all I have to do is find a way to display positions of correct letters.

Tags: tonameinyouinputlenifnot
3条回答
import sys
import random
wordlist = ['hangman', 'dinner', 'computer', 'america', 'olympics', 'football', 'minecraft', 'jacket', 'cabbage', 'electricity', 'dog',
            'pasta', 'japan', 'water', 'programming', 'anaconda', 'onehunga', 'name', 'windows', 'curtains', 'bieber', 'kirito',
            'montenegro', 'wheel', 'civilization', 'physics', 'bluebird' 'table', 'ACDC', 'guardian yam', 'mario', 'parachute', 'agario', 'obama',
            'youtube', 'putin', 'dairy', 'christianity', 'club penguin', 'oskahlavistah', 'coins', 'agitating', 'jumping', 'eating',
            'your mom', 'executive', 'car', 'jade', 'abraham', 'sand', 'silver', 'uranium', 'oscar is gay', 'bioshock', 'fizzle', 'moonman', 'watermelon',
            'WAHAHAHAHAHA', 'steve jobs', 'extreme', 'weeaboo jones', 'hot damn']

class Guess:

    def __init__(self):

        self.SECRET = random.choice(wordlist)
        self.GUESSES_ALLOWED = int(raw_input("The secret's word has %s letter, you how many times can you be mistaken?" % len(self.SECRET)))
        self.WRONG = []
        self.GUESSED = []

    def make_a_guess(self):

        while self.GUESSES_ALLOWED:
            current_guess = raw_input('Guess a letter!')   # TODO: to check for double chars
            self.print_mask()

            if current_guess in self.GUESSED:
                print "You;ve already guessed that! Try again!\n"
                self.make_a_guess()
                self.print_mask()
            elif current_guess in self.WRONG:
                print "You;ve already guessed that! Try again!\n"
                self.make_a_guess()
                self.print_mask()
            elif current_guess not in self.SECRET:
                self.GUESSES_ALLOWED -= 1
                print "WRONG! Guesses left: %s\n" % self.GUESSES_ALLOWED
                self.WRONG.append(current_guess)
                self.print_mask()
            elif current_guess in self.SECRET:
                print "CORRECT! Guesses left: %s\n" % self.GUESSES_ALLOWED
                self.GUESSED.append(current_guess)
                self.print_mask()
                if set(self.GUESSED) == set(self.SECRET):
                    print "You guessed the word!"
                    repeat = raw_input("Play again? type y or n and press Enter")
                    if 'y' in repeat:
                        a = Guess()
                        a.make_a_guess()
                    elif 'n' in repeat:
                        sys.exit(0)
        else:
            print "You got '%s' guesses left, you lost!" % self.GUESSES_ALLOWED
            repeat = raw_input("Play again? type y or n and press Enter")
            if 'y' in repeat:
                a = Guess()
                a.make_a_guess()
            elif 'n' in repeat:
                sys.exit(0)


    def print_mask(self):

        guessed_indexes = []
        for letter in self.GUESSED:
            indexes_for_one_letter = [i for i, x in enumerate(self.SECRET) if x == letter]
            guessed_indexes += indexes_for_one_letter

        MASK_TO_PRINT = []
        for i, letter in enumerate(self.SECRET):
            if i in guessed_indexes:
                MASK_TO_PRINT.append(letter)
            else:
                MASK_TO_PRINT.append("_")

        print " ".join(MASK_TO_PRINT)


if __name__ == '__main__':

    game = Guess()
    game.make_a_guess()

首先, 我们导入系统如果玩家不想再玩我们可以退出

整个逻辑用类猜测的make_a_guess方法实现。 每次启动新游戏时,都会创建类Guess的新实例。

这是一个新的实现,因为您的变量有一些非常重要的错误,例如,您最好使用raw_input()将输入自动转换为字符串。

为了给你写猜测的过程,在我的代码中使用print_mask() 在这个方法中,你应该寻找所有已经猜到的字母并收集它们。例如,如果“For M”单词是一个秘密单词,则您猜测M和F的索引将为[0,3]。这就是为什么在循环中对机密字进行迭代时,如果遇到要迭代的当前索引,也可以在[0,3]中找到->;也就是说,将对应索引的字母添加到某个空列表中,以便以后打印时显示当前进度。如果在迭代过程中,在[0,3]中找不到当前索引,则添加“u”,而不是在准备好的空列表中猜测的字母。

然后将列表收缩为字符串以便进一步打印: “”加入(掩码到打印)

逻辑是这样的: 密语是“计程车” 你以前猜过“c”和“a” 所以self.gused包含[0,1,3] 然后重复:

prepared_list_for_print = []
for i, letter in enumerate('cabage'):
    if i in [0,1,3]:
        prepared_list_for_print.append(letter)
    else:
        prepared_list_for_print.append("_")

要查找字符串中的字母位置,请使用word.index(guess)。 然后把“空白”字中的字母换掉。 为此,请保存b_word = "_ "*len(word), 并在正确的位置替换“\u”:

s = list(b_word)
s[word.index(guess)] = guess

之后打印新的b_单词。

为了帮助您显示猜测的字母,您可以在一个列表中跟踪这些字母,在该列表中,尚未猜测的字母用下划线(或空格或任何您喜欢的内容)表示。

一旦确定了秘密,就可以初始化这样的列表word

guessed_letters = len(word) * ['_']

要显示猜测的字母,请用空格将其连接起来:

print(' '.join(guessed_letters))

随后,当用户输入一个字母guess时,您可以通过枚举单词来更新正确猜测的字母:

for position, letter in enumerate(word):
    if letter == guess:
        guessed_letters[position] = letter

我已经修改了你的程序,以纳入此代码:

import random

name = str(input("What's your name?"))
print("Hello,", name + "!")
failures = 0
allowed = 1
guessed = str()
wordlist = ['hangman', 'dinner', 'computer', 'america', 'olympics', 'football', 'minecraft', 'jacket', 'cabbage', 'electricity', 'dog',
            'pasta', 'japan', 'water', 'programming', 'anaconda', 'onehunga', 'name', 'windows', 'curtains', 'bieber', 'kirito',
            'montenegro', 'wheel', 'civilization', 'physics', 'bluebird' 'table', 'ACDC', 'guardian yam' 'mario', 'parachute', 'agario', 'obama',
            'youtube', 'putin', 'dairy', 'christianity', 'club penguin', 'oskahlavistah', 'coins', 'agitating', 'jumping', 'eating',
            'your mom', 'executive', 'car', 'jade', 'abraham', 'sand', 'silver', 'uranium', 'oscar is gay', 'bioshock', 'fizzle', 'moonman', 'watermelon',
            'WAHAHAHAHAHA', 'steve jobs', 'extreme', 'weeaboo jones', 'hot damn', name]

def correct(guess):
    if guess in word:
        if guess not in guessed:
            print("Correct")
            return(True)
    else:
        if guess not in word and len(guess) == 1 and guess in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ':
            if guess not in guessed:
                print("Incorrect!")
                return(False)

print("Guess this word!")
print("You can input any letter from A to Z and the space key.")
wordnumber = random.randint(0, len(wordlist))
word = (wordlist[wordnumber])
guessed_letters = len(word) * ['_']
print(' '.join(guessed_letters))
while failures < allowed:
    guess = str(input("Guess a letter!"))
    if len(guess) != 1 or guess not in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ':
        print("That is not a letter, try again.")
    if guess in guessed:
        print("You have already guessed that letter, try again.")
    iscorrect = correct(guess)
    guessed = guessed, guess
    if iscorrect == True:
        for position, letter in enumerate(word):
          if letter == guess:
            guessed_letters[position] = letter
        print(' '.join(guessed_letters))
    if iscorrect == False:
        print("You suck")
        failures = failures+1
        print("You have", allowed , "guesses left.")
    if failures == allowed:
        replay = str(input("Press 1 to play again, press 2 to exit."))
        if replay == 1:
            break
        else:
            quit()

这个程序还有其他问题不在这个问题的范围之内。

相关问题 更多 >