在-Python-中实现猜字游戏

在 Python 中实现猜字游戏

原文:towardsdatascience.com/implementing-the-hangman-game-in-python/

成长过程中,猜字游戏在我们家中是一个非常有趣的游戏。我们会拿起笔和纸,轮流选择单词让对方猜测。如今,它被用于课堂环境中,帮助孩子们练习拼写,通过先选择元音字母来理解战略决策,以及根据提示头脑风暴可能的单词。

在这篇文章中,我们将通过在 Python 中实现猜字游戏来探讨这个游戏。这是一个适合初学者的项目,我们将学习 Python 语言的基础知识,例如定义变量、常用函数、循环和条件语句。

理解项目

首先,我们将理解游戏并深入探讨我们的代码应该如何工作。

在典型的两人猜字游戏(Hangman Game)中,玩家 1 选择一个单词,将其隐藏起来不让玩家 2 看到,并生成与所选单词字母数量相对应的空格。玩家 2 需要逐个猜测字母来猜出单词。玩家 2 在游戏开始时拥有一定数量的生命值,每次猜错字母就会失去一个生命值(直到人被绞死)。每次猜对字母,生命值保持不变。如果玩家 2 在猜出单词之前失去所有生命值,游戏结束,他们失败。如果他们成功猜出单词,他们赢得游戏。这就是传统意义上游戏的概述。

在这个项目中,计算机将扮演玩家 1 的角色,生成需要猜测的单词,而我们,作为用户,将是玩家 2。让我们用一个流程图来实现上述功能,以便更好地理解。

图片

图片由作者提供

绘制流程图并定义每个步骤有助于将我们的思维过程转化为代码,因此绘制流程图总是一个好习惯。现在让我们开始编写代码来解决这个问题!

第 1 步:单词列表和随机模块

在这个项目的第一步中,计算机需要选择一个用户需要猜测的随机单词。为此,我们需要一个单词列表,计算机从中随机选择一个单词进行猜测,以及一个名为 random 的 Python 函数,它将从给定的列表中随机选择该单词。

为了生成列表,我在谷歌上搜索了英语中最常用的 100 个名词,并找到了一个列表。我使用了这些单词,并创建了一个 Python 列表,用于本项目。

如其名所示,Python 列表是一种数据类型,它本身存储了一个项目集合。在 Python 中定义颜色列表为colors = ["red", "yellow", "green", "blue", "pink"]。您可以从 Python 官方页面上的列表检查列表语法和附加信息。

word_list = [
    "time",
    "year",
    "people",
    "way",
    "day",
    "man",
    "thing",
    ...
    ]

您可以从我的GitHub仓库访问项目文件。hangman_words.py是包含电脑将从中随机选择一个单词进行游戏的单词列表的 Python 文件。

现在,一旦我们创建了列表,我们需要电脑从给定的单词列表word_list中随机选择一个单词。Python 有一个专门用于此目的的模块,称为“random”。我们将导入该模块,并使用它来允许电脑从列表words_list中随机选择一个单词word_to_guess。您可以在编码项目时打印出word_to_guess以增强理解,当与电脑玩游戏时将其注释掉!

import random
word_to_guess = random.choice(word_list)
print(word_to_guess)

更多关于random.choice()函数的信息,请点击这里

第 2 步:生成空白

下一步是生成与word_to_guess中字母数量相等的空白,以便用户了解他需要猜测的单词中的字母数量。为此,我们将定义一个名为blanks的变量,它将作为单词未猜测字母的容器。它将包含与word_to_guess中字母数量相同的下划线。

为了计算电脑从words_list中随机选择的word_to_guess中的字母数量,我们将使用 Python 函数len(),该函数计算字符串的长度。更多关于这个内置函数的信息可以通过这个链接获取。

blanks = ""
word_length = len(word_to_guess)

如我们现在所知,word_to_guess中的字母数量,我们将使用这个数字在变量blanks中添加相同数量的“_”。为此,我们将使用for循环,这是 Python 的一个功能,允许我们遍历序列中的项目,在我们的情况下,是存储在变量word_to_guess中的字符串。点击这里了解更多关于for循环及其语法的详细信息。

for i in range(word_length):
    blanks = blanks + " _"
print("Word to guess: " + blanks)

上述代码块将遍历word_to_guess字符串中的字母数量,并为每个字母生成一个空白。它将打印出与字母数量相同数量的下划线,每个空白作为猜测单词中字母的占位符。所以对于单词“time”,屏幕上打印的输出将是:

猜测的单词:_ _ _

第 3 步:提示用户猜测一个字母

现在游戏实际上开始了!电脑已经选择了一个单词,并为该单词中的字母生成了空白占位符。现在轮到用户开始逐个猜测单词了。

要让用户输入一个字母,我们将使用 Python 中的input函数,并将其存储在变量guess中:

guess = input("Guess a letter").lower()

点击这里了解更多关于 Python 内置函数input()的信息。

第 4 步:检查字母是否在单词中

一旦用户猜测了一个字母,我们将检查用户是否猜对了,并检查它是否在word_to_guess中。

要做到这一点,我们将使用一个for循环。此外,我们还将创建另一个变量your_word,它将随着猜测的字母而更新,并创建一个名为letters_guessed的空列表,用于存储用户正确猜测的字母(这将在后面很有用)。

例如,如果电脑选择了单词“cheesecake”,随着游戏的进行,用户猜测了字母“c”、“e”和“a”,那么your_wordletters_guessed将如下所示:

your_word = c_ee_eca_e

letters_guessed = [“c”, “e”, “a”]

letters_guessed = []
your_word = ""

for letter in word_to_guess:
    if letter == guess:
        your_word  = your_word + letter
        letters_guessed.append(guess)
    elif letter in letters_guessed:
        your_word  = your_word + letter
    else:
        your_word = your_word + "_"

所以,基本上上述循环所做的是逐个字母遍历word_to_guess,并检查:

  • 如果用户猜测的字母guessword_to_guess中,代码将更新变量your_word,在适当的位置添加猜测的字母。我们需要理解,在 Python 中,字符串实际上是一系列字符的序列,许多列表函数也适用于字符串。此外,我们还将把这个猜对的字母添加到列表letters_guessed中。

  • 如果用户猜测的字母guess已经在letters_guessed中,这意味着用户之前已经建议过这个字母,那么我们不需要将其添加到letters_guessed中,只需在your_word的适当位置添加这个字母即可。

  • 否则,如果用户猜测的字母不在word_to_guess中,因此也不会在letters_guessed中,我们将简单地在这些位置生成空格。

如果上面的代码看起来有点令人不知所措,您可以在定义变量并打印每个变量(word_to_guessguessguessed_lettersyour_word)的同时运行上面的 for 循环,并打印变量在它们被更改的地方。

图片

图片由 AltumCode 在Unsplash提供

第 5 步:创建一个运行直到游戏结束的 While 循环

让我们回顾一下我们创建的流程图,以帮助我们理解项目。为了编写这个项目,我们需要记住以下要点:

  • 用户在开始时有一定的生命值

  • 对于每个猜错的字母,生命值减少 1

    • 如果用户的生命值耗尽,用户失败,游戏结束

    • 如果用户还有生命值,电脑将要求用户猜测另一个字母

  • 对于每个猜对的字母,生命值保持不变,占位符blanks中的空格将被字母替换

    • 如果变量 your_word 已经填满,用户赢得游戏,游戏结束

    • 如果变量 <code>your_word 还有空白空间,那么计算机将再次要求用户猜测下一个字母

由于我们之前已经创建了一个针对猜测字母的 for 循环,现在是时候将生命概念融入其中,并在用户猜错字母时减少它。

让我们用变量 number_of_lives 定义用户的生命值。用户有 6 次机会猜测错误的字母来猜出单词。

number_of_lives = 6

现在,考虑到上述提到的点,我们还需要一个变量或条件来告诉我们何时停止询问用户猜测,因为游戏已经结束。让我们用布尔变量来编写这段代码。

简而言之,布尔是 Python 中存储 True 或 False 的数据类型。我们将使用这个布尔变量在游戏为 False 时继续游戏,反之亦然。最初,当游戏开始时,这个变量将是 False,这意味着游戏没有结束。

game_over = False

现在我们将引入一个 while 循环,其条件是只要游戏没有结束,它就会运行,并且我们将上述提到的条件包含在这个 while 循环中。更多关于 while 循环的信息,请参阅 Python 官方文档这里

while not game over:
     print("\nYou have ", number_of_lives, " lives remaining!")
     guess = input("Guess a letter: ").lower()

     your_word = ""

     for letter in word_to_guess:
        if letter == guess:
            your_word  = your_word + letter
            letters_guessed.append(guess)
        elif letter in letters_guessed:
            your_word  = your_word + letter
        else:
            your_word = your_word + "_"
     print("Word to guess: ", your_word)

在上述代码片段中,我们添加了输入语句以及打印语句,这将根据其在 word_to_guess 中的位置输出已猜测的字母。

第 6 步:处理情况

最后一步是处理不同的情况。如果用户猜测的字母已经被用户提出,或者字母不在单词中,会发生什么?还有,如果所有的字母都被猜测,your_word 中没有更多的空格,会怎样?这意味着用户已经猜出了单词,因此赢了。

我们将在以下行中添加这种情况:

if guess in letters_guessed:
    print(f"\nYou've already guessed {guess}")

if "_" not in your_word:
    game_over = True
    print("\nYou have guessed the word! YOU WIN!")

图片

图片由 Giorgio TrovatoUnsplash 提供

此外,如果用户猜测的字母不在 word_to_guess 中,用户的猜测是错误的,那么他们的生命值将减少 1,我们将通知用户他们猜测的字母不在单词中。如果通过错误猜测减少生命值用完了用户的所有生命,那么我们的布尔变量 game_over 将被设置为 True,游戏将结束,用户输掉游戏。

if guess not in word_to_guess:
    number_of_lives -= 1
    print(f"\nYou guessed {guess}, that's not in the word. You lose a life.")

    if number_of_lives == 0:
        game_over = True
        print(f"\nIT WAS {word_to_guess}! YOU LOSE!")

记得将上述代码块添加到运行直到游戏结束的 while 循环中。一个完整的代码,包括有价值的注释,可以通过这个 GitHub 仓库获得更好的理解。链接

结论

上述编码项目是基于 Python 语言的基础完成的。我们遇到了一些内置函数,例如print()input(),我们使用了random模块来生成随机单词进行猜测,并根据需要使用forwhile循环进行各种迭代。我们还学习了条件语句ifelifelse。这些都是每个初学者在进入复杂编码之前必须了解的基本工具。我们也可以在这个程序中定义和调用函数,但这个项目的目的是为了提供一个面向初学者的 Python 语言入门介绍。如果你是 Python 的专家,请随意分享我们可以采取的其他各种方法来处理这个项目!

posted @ 2026-03-28 10:20  布客飞龙V  阅读(1)  评论(0)    收藏  举报