【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个步骤:
- 让`random`模块可用 (`import`)
- 生成一个1到100之间的随机答案数字
- 让玩家输入猜测的数字 (`input`)
- 比较答案和猜测,并显示结果 (`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`。
- `try:` 代码块:把可能发生错误的处理写在这里。可以想象成“总之,先试试这个!”。
- `except 错误类型:` 代码块:如果在`try`中指定的错误类型真的发生了,就执行这里的处理。可以想象成“万一出错了,就改做这个”。
使用这个语法,将`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的重要基础要素:
- `import`: 模块的导入
- `random.randint()`: 随机整数的生成
- `input()`: 从用户处获取键盘输入
- `int()`: 从字符串到整数的类型转换
- `print()` (f-string): 在屏幕上显示结果和信息
- `if/elif/else`: 根据条件进行处理分支
- `while`循环 (`break`): 处理的重复与跳出
- `try-except`: 错误处理
学习编程,比起单纯背诵语法,实际动手制作一些“可运行的东西”是进步最快的捷径。小小的成功体验会成为继续学习的巨大动力。
尝试改造这次制作的代码,比如“增加次数限制”、“让提示更详细”等等,挑战制作属于你自己的原创游戏也会很有趣。请务必将本文作为你编程学习的第一步来活用。
下一步
熟悉了基本编程之后,接下来要不要挑战一下图像处理呢?使用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 < 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()
</code></pre>
</div>
<p>
感觉怎么样?这是一个猜电脑想的数字的简单游戏吧。从下一节开始,我们会把这个代码分解成一个个零件,从零开始组装起来。
</p>
<!-- 各个部分类似地继续 -->
</article>