🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【CV即可运行!】Python猜数字游戏入门:一个与AI共同奋斗的新手记录

你好!欢迎来到编程的世界。

就在几个月前,我和大家一样,编程知识完全为零。每天都不知道该从何下手,一遇到错误就头疼不已……。就是这样的我,在AI的帮助下,经过反复的试错,如今已经能独立搭建两个网站(buyonjapan.com, copicode.com)了。

在这个网站上,我会尽量不使用专业术语,以“同为新手的视角”来解说我一路走来“真正想知道的东西”、“实际遇到的难点”以及“是如何解决的”。

这次,我们将用Python制作一个非常受欢迎的编程入门项目——“猜数字游戏”。本文的目的只有一个:“提供复制粘贴就能完美运行的代码,让大家首先体验到‘让程序跑起来’的成功感”。

让我们一起来体验编程的乐趣吧!


首先体验成品!CV即可运行的完整代码

百闻不如一见。首先,我来展示一下我们接下来要一起制作的猜数字游戏的最终成品代码。请将下面的代码全部复制,在你自己的环境(如VSCode或Google Colaboratory)中运行试试看。亲身体验一下这是个什么样的游戏,是了解它的最佳捷径!


import random

def number_guessing_game():
  while True:
    print("\n--- 猜数字游戏 ---")
    print("请选择难度:")
    print("1: 简单 (1-10)")
    print("2: 普通 (1-100)")
    print("3: 困难 (1-1000)")
    
    level = input("请输入难度(1, 2, 3): ")
    
    if level == '1':
      min_num, max_num = 1, 10
    elif level == '2':
      min_num, max_num = 1, 100
    elif level == '3':
      min_num, max_num = 1, 1000
    else:
      print("无效的选择。请输入 '1', '2', 或 '3'。")
      continue

    answer = random.randint(min_num, max_num)
    count = 0
    
    print(f"\n请猜一个 {min_num} 到 {max_num} 之间的数字!")

    while True:
      try:
        guess_str = input(f"你的猜测 (剩余尝试次数: 无限): ")
        guess = int(guess_str)
        count += 1

        if guess < min_num or guess > max_num:
          print(f"超出范围!请输入 {min_num} 到 {max_num} 之间的数字。")
        elif guess < answer:
          print(f"可惜!答案比这个数字大。 (尝试次数: {count}次)")
        elif guess > answer:
          print(f"可惜!答案比这个数字小。 (尝试次数: {count}次)")
        else:
          print(f"\n🎉🎉🎉 正确!恭喜你! 🎉🎉🎉")
          print(f"正确答案是 {answer}。")
          print(f"你一共猜了 {count} 次。")
          break
      except ValueError:
        print("错误:请输入数字。不能使用文字或符号。")

    while True:
      replay = input("\n再玩一次吗? (y / n): ").lower()
      if replay in ["y", "n"]:
        break
      else:
        print("无效输入。请输入 'y' 或 'n'。")
      
    if replay == "n":
      print("感谢游玩!下次再见!")
      break

# 开始游戏
number_guessing_game()
  

感觉怎么样?这是一个猜电脑想的数字的简单游戏吧。从下一节开始,我们会把这个代码分解成一个个零件,从零开始组装起来。


步骤1:搭建游戏骨架(最简结构篇)

无论看起来多么复杂的程序,追根溯源,都只是简单命令的组合。首先,我们从制作这个游戏最基础的“骨架”部分开始吧。

必要的工具:`random`模块是什么?

要制作猜数字游戏,首先需要让电脑随机选择一个数字。为此,我们要使用Python的标准功能——“`random`模块”。

听到“模块”这个词可能觉得很难,但其实可以把它想象成一个“装满了便利功能的工具箱”。`random`模块里有创建随机数、打乱列表元素顺序等功能。

这次我们会使用其中的`random.randint(a, b)`这个功能。这是一个能生成一个包含`a`到`b`之间(包括a和b)的随机整数的命令。例如,写`random.randint(1, 100)`,就会随机选出1到100之间的一个数字。

更详细的信息可以在Python官方文档中确认,但现在只需要知道“有这么个功能”就足够了。

最初的代码:仅此而已就能运行!

那么,我们来制作游戏的核心部分吧。需要以下4个步骤:

  1. 让`random`模块可用 (`import`)
  2. 生成一个1到100之间的随机答案数字
  3. 让玩家输入猜测的数字 (`input`)
  4. 比较答案和猜测,并显示结果 (`if/else`)

把这些写成代码,就是下面这样。


# 1. 导入random模块
import random

# 2. 生成一个1到100的随机整数,并保存在answer变量中
answer = random.randint(1, 100)

print("请猜一个1到100之间的数字!")

# 3. 接收玩家的输入
guess_str = input("你的猜测: ")

# 将input()接收到的字符串,转换为可以计算的数值(整数)
guess = int(guess_str)

# 4. 比较猜测和答案,并显示结果
if guess == answer:
  print("🎉 正确!恭喜你!")
else:
  print(f"可惜!正确答案是 {answer}。")
  

运行这段代码,你只能猜一次。但它能正确判断对错。这就是我们游戏的出发点。

要点:`input()`接收到的值,即使用户输入了数字,也必定是作为“字符串”来处理的。因此,在作为数值进行比较或计算之前,需要使用`int()`将其转换为“整数”。这被称为“类型转换”。


步骤2:让游戏可以“重复”玩(`while`循环篇)

现在的代码,猜一次游戏就结束了。这可算不上游戏。我们来改进一下,让玩家可以反复猜测,直到猜对为止。

为什么需要循环?

当想重复执行相同处理时,编程中会使用“循环”结构。Python有`for`循环和`while`循环,这次我们使用适合“在满足特定条件前一直重复”的`while`循环。

用`while`循环改良!

“直到猜对为止”这个条件,换句话说就是“在没猜对期间一直”重复。用`while`来实现这一点,游戏的样子就出来了。

这次我们使用`while True:`这种写法。它表示“无限重复”,但别担心。通过在循环内部使用`break`这个命令,可以在任意时机跳出循环。


import random

answer = random.randint(1, 100)
print("请猜一个1到100之间的数字!")

# 开始无限循环
while True:
  guess_str = input("你的猜测: ")
  guess = int(guess_str)

  if guess == answer:
    print("🎉 正确!恭喜你!")
    break  # 猜对就跳出循环
  else:
    print("可惜!再试一次吧。")
  

怎么样?运行之后,就可以无限次输入猜测,直到猜对为止了。如果没有`break`,即使猜对了程序也永远不会结束。记住,`while True:`和`break`是配套使用的。


步骤3:让游戏更友好(提示功能篇)

目前的状态,程序只会说“可惜!”,完全不知道接下来该输入什么样的数字。我们来增加提示功能,让玩家玩得更开心吧。

提示“大了”或“小了”

在猜错的情况下,如果能告诉玩家输入的数字比答案“大了”还是“小了”,游戏会变得有趣得多。这通过在`if`语句中加入`elif`(else if的缩写)就能简单实现。

来计算挑战次数吧

此外,记录下猜对所用的次数,并在最后显示出来,会带来成就感。为此,在循环开始前,准备一个计数器变量,如`count = 0`,每次猜测时用`count += 1`来加1。


import random

answer = random.randint(1, 100)
count = 0  # 初始化用于计算次数的变量

print("请猜一个1到100之间的数字!")

while True:
  guess_str = input("你的猜测: ")
  guess = int(guess_str)
  
  count += 1 # 每次猜测都将计数器加1

  if guess < answer:
    print(f"可惜!答案比这个数字大。 (尝试次数: {count}次)")
  elif guess > answer:
    print(f"可惜!答案比这个数字小。 (尝试次数: {count}次)")
  else: # guess == answer 的情况
    print(f"\n🎉 正确!恭喜你!")
    print(f"正确答案是 {answer}。")
    print(f"你一共猜了 {count} 次!")
    break
  

提示和挑战次数都显示出来了,感觉越来越像个游戏了吧!使用Python的`f-string`(在字符串前加`f`的写法),可以像`{变量名}`这样轻松地将变量的值嵌入字符串中,非常方便。


步骤4:迈向更健壮的程序(最重要・差异化关键)

好了,从这里开始是本文最重要的部分。现在的代码隐藏着一个“弱点”。那就是,当玩家输入数字以外的内容时,程序会强制退出

新手必踩的“`ValueError`”坑

不妨试试运行刚才的代码,在猜数字的环节输入“abc”或“你好”这样的文字。

`ValueError: invalid literal for int() with base 10: 'abc'`

你应该会看到类似这样的红色错误信息,然后程序就停止了。这是因为`int()`函数是用来“将字符串转换为整数”的,但当它收到了无法转换的字符(如'abc')时,就会发生这个错误。

这是我当新手时反复遇到的障碍。“在自己的电脑上运行得好好的,别人一用就报错挂掉……”这样的程序,很遗憾,不能算是“好程序”。我们的目标是创建一个即使用户操作失误也不容易崩溃的“健壮的”程序。

用`try-except`捕获错误!

解决这个`ValueError`的魔法语法就是`try-except`。

使用这个语法,将`int()`的转换处理用`try`代码块包围起来,并将`ValueError`发生时的处理写入`except`代码块,就可以防止因错误导致的强制退出了。


import random

answer = random.randint(1, 100)
count = 0

print("请猜一个1到100之间的数字!")

while True:
  guess_str = input("你的猜测: ")
  
  try:
    # 可能会发生错误的处理
    guess = int(guess_str)
    count += 1

    if guess < answer:
      print(f"可惜!答案比这个数字大。 (尝试次数: {count}次)")
    elif guess > answer:
      print(f"可惜!答案比这个数字小。 (尝试次数: {count}次)")
    else:
      print(f"\n🎉 正确!恭喜你!")
      print(f"正确答案是 {answer}。")
      print(f"你一共猜了 {count} 次!")
      break
      
  except ValueError:
    # 发生ValueError时的处理
    print("错误:请输入数字。不能使用文字或符号。")
  

运行这段代码,再输入一次“abc”试试。这次程序不会因错误而停止,而是会显示“错误:请输入数字。”的消息,并再次要求输入。

熟练掌握`try-except`,是脱离新手阶段的一大步!

【专栏】如何请求AI解决错误

我在学习编程时,最常求助的就是AI。遇到像`ValueError`这样的错误时,我会直接复制错误信息,然后这样问AI(我用的是Gemini或ChatGPT):

“我正在用Python练习编程。程序停止并显示了以下错误信息。这个错误的原因是什么?另外,要怎样修改代码才能让程序即使发生这个错误也不会停止?请用新手也能看懂的方式告诉我。”

`ValueError: invalid literal for int() with base 10: 'abc'`

接着,AI几乎毫无例外地会给出使用`try-except`的解决方案。不要害怕错误信息,把它作为向AI提问的“素材”来活用,是加速自学的最佳技巧。


步骤5:更有趣!应用篇

基本功能和错误处理都实现了,最后我们再增加一点功能,让游戏更完善吧。这部分是对文章开头最终成品代码所含内容的解说。

让玩家能选择难度

每次都是1到100可能会腻。如果在游戏开始时,能让玩家选择数字范围,比如“简单(1-10)”、“普通(1-100)”、“困难(1-1000)”,就能吸引玩家反复游玩。

这可以通过在游戏主循环前,增加一个选择难度的循环来实现。根据玩家的输入,改变传递给`random.randint()`的最小值(`min_num`)和最大值(`max_num`)就可以了。

让玩家能再玩一次

每次游戏结束都要重新运行程序有点麻烦。我们可以在猜对后,询问“再玩一次吗?(y/n)”,如果回答“y”就从头开始整个游戏,如果回答“n”就结束。

要实现这个功能,最简单的方法就是用一个更大的`while`循环把至今为止制作的整个游戏逻辑包起来。然后在游戏结束后确认是否重玩,如果输入是“n”,就用`break`跳出大循环,完全结束程序。

把这些功能全部加进去,就是本文开头介绍的“最终成品代码”了。请务必再次回顾代码,确认哪个部分对应哪个功能。


总结:体验创造可运行程序的乐趣吧!

辛苦了!这次我们体验了用Python从零开始制作一个简单猜数字游戏的过程。

通过本文,你接触到了以下这些Python的重要基础要素:

学习编程,比起单纯背诵语法,实际动手制作一些“可运行的东西”是进步最快的捷径。小小的成功体验会成为继续学习的巨大动力。

尝试改造这次制作的代码,比如“增加次数限制”、“让提示更详细”等等,挑战制作属于你自己的原创游戏也会很有趣。请务必将本文作为你编程学习的第一步来活用。

下一步

熟悉了基本编程之后,接下来要不要挑战一下图像处理呢?使用Python的库“Pillow”,就能轻松制作出瞬间调整大量图片尺寸之类的便利工具。

➡️ 下一篇文章:用Python制作一个批量调整图片尺寸的工具吧 (Pillow)


【总集篇】关于可完整运行的HTML示例

本节是你在自己的网站上发布类似这篇博客文章的内容时,可以复制粘贴使用的HTML示例。

以下代码包含了本文的全部内容(标题、文章、代码块等)。不过,Python代码本身是设想在读者的PC上的Python运行环境(如终端或命令提示符)中执行的。

注意:以下代码块内的HTML代码为了在网页上正确显示,对特殊字符进行了转义处理(例:`<`被转换为`<`)。


<article>
 <h1 style="color: #669df6;">【CV即可运行!】Python猜数字游戏入门:一个与AI共同奋斗的新手记录</h1>
 <p>
 你好!欢迎来到编程的世界。
 </p>
 <p>
 就在几个月前,我和大家一样,编程知识完全为零。每天都不知道该从何下手,一遇到错误就头疼不已……。就是这样的我,在AI的帮助下,经过反复的试错,如今已经能独立搭建两个网站(<a href="https://buyonjapan.com" target="_blank" rel="noopener noreferrer" style="color: #8ab4f8;">buyonjapan.com</a>, <a href="https://copicode.com" target="_blank" rel="noopener noreferrer" style="color: #8ab4f8;">copicode.com</a>)了。
 </p>
 <p>
 在这个网站上,我会尽量不使用专业术语,以“同为新手的视角”来解说我一路走来“真正想知道的东西”、“实际遇到的难点”以及“是如何解决的”。
 </p>
 <p>
 这次,我们将用Python制作一个非常受欢迎的编程入门项目——“<strong>猜数字游戏</strong>”。本文的目的只有一个:“<strong>提供复制粘贴就能完美运行的代码,让大家首先体验到‘让程序跑起来’的成功感</strong>”。
 </p>
 <p>
 让我们一起来体验编程的乐趣吧!
 </p>

 <hr style="margin: 4rem 0;">

 <h2 style="color: #669df6;">首先体验成品!CV即可运行的完整代码</h2>
 <p>
 百闻不如一见。首先,我来展示一下我们接下来要一起制作的猜数字游戏的最终成品代码。请将下面的代码全部复制,在你自己的环境(如VSCode或Google Colaboratory)中运行试试看。亲身体验一下这是个什么样的游戏,是了解它的最佳捷径!
 </p>
 <div class="code-wrapper">
  <button class="copy-btn" data-target="code-block-1">📋 复制</button>
  <pre><code id="code-block-1">
import random

def number_guessing_game():
  while True:
    print("\n--- 猜数字游戏 ---")
    print("请选择难度:")
    print("1: 简单 (1-10)")
    print("2: 普通 (1-100)")
    print("3: 困难 (1-1000)")
    
    level = input("请输入难度(1, 2, 3): ")
    
    if level == '1':
      min_num, max_num = 1, 10
    elif level == '2':
      min_num, max_num = 1, 100
    elif level == '3':
      min_num, max_num = 1, 1000
    else:
      print("无效的选择。请输入 '1', '2', 或 '3'。")
      continue

    answer = random.randint(min_num, max_num)
    count = 0
    
    print(f"\n请猜一个 {min_num} 到 {max_num} 之间的数字!")

    while True:
      try:
        guess_str = input(f"你的猜测 (剩余尝试次数: 无限): ")
        guess = int(guess_str)
        count += 1

        if guess &lt; min_num or guess &gt; max_num:
          print(f"超出范围!请输入 {min_num} 到 {max_num} 之间的数字。")
        elif guess &lt; answer:
          print(f"可惜!答案比这个数字大。 (尝试次数: {count}次)")
        elif guess &gt; answer:
          print(f"可惜!答案比这个数字小。 (尝试次数: {count}次)")
        else:
          print(f"\n🎉🎉🎉 正确!恭喜你! 🎉🎉🎉")
          print(f"正确答案是 {answer}。")
          print(f"你一共猜了 {count} 次。")
          break
      except ValueError:
        print("错误:请输入数字。不能使用文字或符号。")

    while True:
      replay = input("\n再玩一次吗? (y / n): ").lower()
      if replay in ["y", "n"]:
        break
      else:
        print("无效输入。请输入 'y' 或 'n'。")
      
    if replay == "n":
      print("感谢游玩!下次再见!")
      break

# 开始游戏
number_guessing_game()
  </code></pre>
 </div>
 <p>
 感觉怎么样?这是一个猜电脑想的数字的简单游戏吧。从下一节开始,我们会把这个代码分解成一个个零件,从零开始组装起来。
 </p>

 <!-- 各个部分类似地继续 -->

</article>