小学生都能看懂 · 从零开始 · 3.5小时做出小游戏
在开始学习之前,你需要先安装 Python。去 python.org 下载最新版本,安装时记得勾选 "Add Python to PATH" 这个选项,否则后面用不了。安装完成后,第一章会教你怎么写第一个程序。
装好Python,写出第一个程序,学会用变量存东西,和电脑对话
安装Python,写出你人生第一行代码
Python就是一种「和电脑说话的语言」。电脑听不懂中文,但它能懂Python。你用Python写好命令,电脑就按命令去做事。
就像你跟机器人下命令。你说「向前走3步」,机器人就走3步。Python就是你和电脑之间的「翻译语言」。
打开浏览器,访问 python.org/downloads,点大按钮下载,然后双击安装。
安装好之后,打开「开始菜单」找到「IDLE」(Python自带的编辑器),然后输入下面这行代码,按回车:
print("Hello, 世界!") print("我会Python了!")
Hello, 世界! 我会Python了!
print() 就是「打印/显示」的意思。括号里放什么,屏幕上就显示什么。引号里是文字,可以随便改。
用变量存东西,让电脑帮你做数学题
变量就是一个「盒子」,你可以往里面放东西——数字、文字都行。给盒子起个名字,以后想用里面的东西,叫名字就行了。
就像你有一个贴了标签「零花钱」的存钱罐。钱放进去,叫「零花钱」就能找到。
# 创建变量,就是给盒子起名、放东西 名字 = "小明" 年龄 = 10 零花钱 = 50.5 # 用print显示出来 print(名字) print(年龄) print(零花钱)
小明 10 50.5
苹果 = 5 橙子 = 3 总数 = 苹果 + 橙子 print("水果总数:", 总数) # 其他运算符 print(10 - 3) # 减法 = 7 print(4 * 5) # 乘法 = 20 print(10 / 2) # 除法 = 5.0 print(10 ** 2) # 10的2次方 = 100
水果总数: 8 7 20 5.0 100
name、age。两种都行,随你喜欢。
让程序问问题,你来回答,电脑给你反馈
input() 会让程序暂停,等你输入内容,你按回车才继续。
名字 = input("你叫什么名字?") print("你好," + 名字 + "!欢迎来学Python!") 年龄 = input("你几岁了?") print("原来你" + 年龄 + "岁,真棒!")
你叫什么名字?小明 你好,小明!欢迎来学Python! 你几岁了?10 原来你10岁,真棒!
input() 得到的永远是文字(字符串),如果要做数学计算,需要用 int() 转换成数字:
a = int(input("输入第一个数:")) b = int(input("输入第二个数:")) print("两数之和是:", a + b)
输入第一个数:8 输入第二个数:5 两数之和是: 13
+,print多个内容用逗号 , 隔开,逗号会自动加空格。
综合运用本章知识,做一个会问问题的程序
# 收集信息 name = input("请输入你的名字:") age = input("请输入你的年龄:") hobby = input("你最喜欢做什么?") # 打印卡片 print() print("╔══════════════════╗") print("║ 📋 个人信息卡片 ║") print("╠══════════════════╣") print("║ 姓名:" + name) print("║ 年龄:" + age + " 岁") print("║ 爱好:" + hobby) print("╚══════════════════╝")
╔══════════════════╗ ║ 📋 个人信息卡片 ║ ╠══════════════════╣ ║ 姓名:小明 ║ 年龄:10 岁 ║ 爱好:打游戏 ╚══════════════════╝
2分钟快速复习本章要点
Hello?print() 函数输出内容,括号里放字符串(带引号)。方括号是列表语法,echo 是 Shell 命令,Python 没有 show()。x 的值是多少?
input() 函数返回的数据类型是什么?"18" 转换成整数,应该使用什么函数?(只填函数名,不含括号)int() 函数将字符串转整数。例如 int("18") 得到数字 18。如果是带小数的字符串,用 float()。% 是取余(模运算)运算符。10 ÷ 3 = 3 余 1,所以结果是 1。让电脑帮你重复做事,再也不用复制粘贴一百遍代码了
按顺序做同一件事N遍,自动完成重复操作
for循环就是「按顺序做一遍又一遍」。比如你要打印1到10,不用写10行print,一个for循环搞定。
就像老师说「全班同学依次报数」,每个同学站起来说一个数,说完坐下,下一个接着说。for循环就是这个过程,自动的。
# range(5) 表示 0,1,2,3,4 共5个数 for i in range(5): print("第", i, "次循环")
# range(终点) — 从0开始到终点-1 for i in range(3): # 0, 1, 2 print(i) # range(起点, 终点) — 从起点到终点-1 for i in range(1, 6): # 1, 2, 3, 4, 5 print(i) # range(起点, 终点, 步长) — 每次跳几步 for i in range(0, 10, 2): # 0, 2, 4, 6, 8 print(i)
for循环还可以逐个处理列表里的每一项:
水果 = ["苹果", "香蕉", "西瓜", "草莓"] for fruit in 水果: print("我喜欢吃" + fruit)
我喜欢吃苹果 我喜欢吃香蕉 我喜欢吃西瓜 我喜欢吃草莓
条件满足就一直循环,条件不满足才停下来
while循环是「只要条件成立,就一直做」。不像for循环有固定次数,while是按条件来的。
就像「只要天没黑,就一直在外面玩」。天黑了(条件不成立),才停下来回家。
count = 1 while count <= 5: # 只要count≤5就继续 print("倒计时:", count) count = count + 1 # 每次+1,否则死循环! print("循环结束!")
倒计时: 1 倒计时: 2 倒计时: 3 倒计时: 4 倒计时: 5 循环结束!
secret = 7 # 神秘数字 guess = 0 # 初始猜测值 while guess != secret: guess = int(input("猜一个1-10的数:")) if guess < secret: print("太小了,再大一点!") elif guess > secret: print("太大了,再小一点!") print("🎉 猜对了!就是", secret)
# break:立刻跳出循环 for i in range(10): if i == 5: break # 到5就停 print(i) # 只打印 0,1,2,3,4 # continue:跳过这次,继续下次 for i in range(6): if i == 3: continue # 跳过3 print(i) # 打印 0,1,2,4,5
用嵌套for循环打出漂亮的九九乘法表
for i in range(1, 10): for j in range(1, i + 1): print(f"{j}×{i}={i*j}", end=" ") print() # 换行
1×1=1 1×2=2 2×2=4 1×3=3 2×3=6 3×3=9 1×4=4 2×4=8 3×4=12 4×4=16 ...
2分钟快速复习本章要点
range(1, 5) 会生成哪些数字?break 立刻退出循环;continue 是跳过本次继续下一次;stop/exit 不是循环控制关键字。用列表存一堆东西,用字典存带标签的信息,数据管理轻松搞定
用一个变量存很多个东西,增删改查都行
列表就是一排格子,每个格子存一个东西,按顺序排好,可以随时加、删、改、查。
就像你的书包,里面可以放很多本书,第1本、第2本……你可以往里加书,也可以拿出来某一本。
# 创建列表 水果 = ["苹果", "香蕉", "西瓜"] # 取第1个(从0开始数) print(水果[0]) # 苹果 print(水果[1]) # 香蕉 print(水果[-1]) # 最后一个:西瓜 # 增加 水果.append("草莓") # 加到末尾 # 删除 水果.remove("香蕉") # 删指定值 # 查长度 print(len(水果)) # 3 # 遍历 for f in 水果: print(f)
| 方法 | 作用 | 例子 |
|---|---|---|
| .append(x) | 末尾加一个 | list.append("新") |
| .remove(x) | 删除指定值 | list.remove("旧") |
| .insert(i,x) | 在位置i插入 | list.insert(0,"第一") |
| .pop() | 取出最后一个 | last = list.pop() |
| .sort() | 排序 | list.sort() |
| len(list) | 获取长度 | len(list) |
给数据贴标签,像真正的字典一样查找
字典存的是「键值对」——每个数据都有一个名字(键),通过名字找数据(值)。
就像真正的字典,你查"苹果"这个词(键),就能找到它的解释(值)。或者像你家的柜子,每个抽屉都有标签:「袜子」「T恤」「裤子」,一眼找到要的东西。
# 创建字典 同学 = { "名字": "小明", "年龄": 12, "爱好": "打篮球", "成绩": 95 } # 查找 print(同学["名字"]) # 小明 print(同学["成绩"]) # 95 # 修改 同学["成绩"] = 98 # 新增 同学["班级"] = "五年二班" # 删除 del 同学["爱好"] # 遍历所有键值对 for key, value in 同学.items(): print(key, ":", value)
名字 : 小明 年龄 : 12 成绩 : 98 班级 : 五年二班
用列表+字典做一个能增删查的通讯录
通讯录 = [] # 添加联系人 def 添加(名字, 电话): 通讯录.append({"名字": 名字, "电话": 电话}) print(f"✅ 已添加:{名字}") # 查找联系人 def 查找(名字): for 人 in 通讯录: if 人["名字"] == 名字: print(f"📞 {名字} 的电话:{人['电话']}") return print("❌ 没找到这个人") # 显示全部 def 全部(): print("\n📋 所有联系人:") for 人 in 通讯录: print(f" {人['名字']}:{人['电话']}") 添加("小明", "138-0000-1111") 添加("小红", "139-2222-3333") 查找("小明") 全部()
2分钟快速复习
fruits 末尾添加一个元素?
append() 在末尾添加元素。add() 是集合的方法,insert() 需要两个参数,push() 是 JS 的方法。len(d) 的值是多少?
get() 方法如果键不存在返回 None(不报错),而直接用 [] 访问不存在的键会抛出 KeyError 异常。pop() 默认删除并返回最后一个元素,也可传索引如 pop(0) 删除第一个。把代码装进盒子,想用的时候拿出来,写一次到处用
def 一下,代码装盒,随叫随到
函数就是一段代码的"快捷键"。你把一堆代码打包进去,给它起个名字,以后直接叫名字就能运行,不用每次都重新写一遍。
就像微波炉上的"热饭"按钮——里面已经设置好了时间和功率,你只需要按一下,它就自动执行一整套操作。你不需要每次都手动调,直接按按钮就行。
# 定义函数(打包代码) def 打招呼(): print("你好!欢迎来学Python!") print("今天也要加油哦~") # 调用函数(按下快捷键) 打招呼() # 第一次 打招呼() # 第二次,完全一样 打招呼() # 想用多少次都行
你好!欢迎来学Python! 今天也要加油哦~ 你好!欢迎来学Python! 今天也要加油哦~ 你好!欢迎来学Python! 今天也要加油哦~
传进去东西,拿出来结果,函数才真的有用
参数就是你调用函数时"附带的信息",让函数根据你给的内容做不同的事。
函数是奶茶机,参数是你选的口味。你跟机器说"一杯珍珠奶茶"(参数),它就按你要求做。你说"一杯芒果奶茶",结果就不一样了。
# 带参数的函数 def 打招呼(名字): print(f"你好,{名字}!欢迎来学Python!") 打招呼("小明") # 你好,小明! 打招呼("胡哥") # 你好,胡哥! # 多个参数 def 介绍(名字, 年龄): print(f"我叫{名字},今年{年龄}岁") 介绍("小红", 10) # 我叫小红,今年10岁
用 return 把结果"带出来",这样才能把函数的计算结果存到变量里继续用。
# 有返回值的函数 def 加法(a, b): 结果 = a + b return 结果 # 把结果返回给调用者 总和 = 加法(3, 5) # 总和 = 8 print(总和) # 8 print(加法(10, 20)) # 30 # 实用例子:判断奇偶 def 判断奇偶(n): if n % 2 == 0: return "偶数" else: return "奇数" print(判断奇偶(7)) # 奇数 print(判断奇偶(4)) # 偶数
参数可以有默认值,变量有自己的"势力范围"
定义函数时给参数设默认值,调用时可以不传这个参数,它会自动用默认的。
def 订奶茶(口味, 甜度="全糖", 温度="常温"): print(f"您的{口味},{甜度},{温度}") 订奶茶("珍珠奶茶") # 全糖常温 订奶茶("芒果奶茶", "半糖") # 半糖常温 订奶茶("抹茶拿铁", "少糖", "热") # 少糖热
函数里面定义的变量,函数外面看不到;函数外面的全局变量,函数里面可以读但不能直接改。
全局变量 = "我在外面" def 测试(): 局部变量 = "我在函数里" print(全局变量) # 可以读全局变量 print(局部变量) # 可以用局部变量 测试() print(全局变量) # ✅ 没问题 # print(局部变量) # ❌ 报错!函数外看不到局部变量
用函数封装四则运算,做一个简单计算器
def 加法(a, b): return a + b def 减法(a, b): return a - b def 乘法(a, b): return a * b def 除法(a, b): if b == 0: return "❌ 不能除以零" return a / b a = float(input("请输入第一个数: ")) 运算符 = input("请输入运算符(+ - * /): ") b = float(input("请输入第二个数: ")) if 运算符 == "+": print("结果:", 加法(a, b)) elif 运算符 == "-": print("结果:", 减法(a, b)) elif 运算符 == "*": print("结果:", 乘法(a, b)) elif 运算符 == "/": print("结果:", 除法(a, b)) else: print("❌ 不支持该运算")
2分钟快速复习
def 关键字定义函数。function 是 JS/其他语言的写法,Python 不用。return 关键字立即终止函数并返回值。没有 return 的函数默认返回 None。读取文件、写入数据、永久保存——让程序和硬盘对话
打开文件,把里面的内容读出来
Python用 open() 函数打开文件,就像你用手去翻开一本书。打开后要记得关上,否则文件会一直被占用。
open() 就像打开一个文件柜的抽屉,read() 是把里面的纸拿出来看,close() 是把抽屉关上。用 with 语句就像请了一个助手,看完自动帮你关好,不用担心忘记。
# 方式1:手动关闭(容易忘) f = open("笔记.txt", "r", encoding="utf-8") 内容 = f.read() print(内容) f.close() # 必须手动关! # 方式2:with 语句(推荐!自动关闭) with open("笔记.txt", "r", encoding="utf-8") as f: 内容 = f.read() # 一次读完 print(内容) # 逐行读取(适合大文件) with open("笔记.txt", "r", encoding="utf-8") as f: for 行 in f: print(行.strip()) # strip()去掉末尾换行符
| 模式 | 含义 | 文件不存在时 |
|---|---|---|
| "r" | 只读(默认) | 报错 |
| "w" | 写入(覆盖原内容) | 自动创建 |
| "a" | 追加(不覆盖) | 自动创建 |
| "r+" | 读写 | 报错 |
把数据永久存到硬盘,下次打开还在
用 "w" 模式打开会清空原文件重新写,用 "a" 模式是在末尾追加,不会覆盖原来的内容。
# 写入文件("w" 模式 — 覆盖) with open("日记.txt", "w", encoding="utf-8") as f: f.write("今天学了Python文件操作\n") f.write("感觉挺简单的!\n") # 追加内容("a" 模式 — 不覆盖) with open("日记.txt", "a", encoding="utf-8") as f: f.write("明天继续加油!\n") # 验证写入结果 with open("日记.txt", "r", encoding="utf-8") as f: print(f.read())
今天学了Python文件操作 感觉挺简单的! 明天继续加油!
文件不存在怎么办?程序别崩,优雅处理错误
程序运行时可能出错(比如文件不存在)。用 try/except 可以"捕获"错误,让程序不崩溃,而是给出友好提示。
try 是"试试看",except 是"如果出问题就这样处理"。就像你去商店买东西(try),如果没货了(except),就去其他店买,而不是直接回家大哭(程序崩溃)。
# 基本用法 try: with open("不存在的文件.txt", "r") as f: print(f.read()) except FileNotFoundError: print("❌ 文件不存在,请检查路径") # 更完整的写法 try: with open("数据.txt", "r", encoding="utf-8") as f: 内容 = f.read() print("✅ 读取成功:", 内容) except FileNotFoundError: print("❌ 文件不存在") except UnicodeDecodeError: print("❌ 编码错误,请用 utf-8") except Exception as e: print(f"❌ 未知错误:{e}") finally: print("不管成功还是失败,这里都会执行")
做一个可以增加、查看记录的小记事本
def add_note(text): with open("notes.txt", "a", encoding="utf-8") as f: f.write(text + "\n") print(f"✅ 已记录:{text}") def show_notes(): try: with open("notes.txt", "r", encoding="utf-8") as f: lines = f.readlines() if not lines: print("📭 暂无笔记") return print("\n📋 所有笔记:") for i, line in enumerate(lines, 1): print(f" {i}. {line.strip()}") except FileNotFoundError: print("📭 还没有任何笔记") add_note("今天学了文件读写") add_note("with语句真好用") add_note("try/except防止崩溃") show_notes()
2分钟快速复习
'a' 表示什么?
with open() 来操作文件?
read() 读取全部内容为字符串;readlines() 读取为列表;readline() 逐行读取。用类来描述世界,创建一个个"对象",让代码更有条理
类是模板,对象是用模板造出来的东西
类(Class)是一个"模板"或"图纸",描述某种东西有哪些属性和行为。对象(Object)是用这个模板造出来的具体东西。
类就像"饼干模具",对象就是用模具压出来的每块饼干。同一个模具可以做很多块饼干(创建多个对象),每块饼干的形状一样,但可以有不同的颜色和口味(不同属性值)。
# 定义一个"狗"类(模板) class Dog: # __init__ 是初始化方法,创建对象时自动运行 def __init__(self, 名字, 品种): self.名字 = 名字 # 属性:名字 self.品种 = 品种 # 属性:品种 # 方法:狗会做的事 def 叫(self): print(f"{self.名字}:汪汪汪!") def 介绍(self): print(f"我是{self.品种},叫{self.名字}") # 创建对象(用模板造饼干) 狗1 = Dog("旺财", "中华田园犬") 狗2 = Dog("Max", "金毛") 狗1.叫() # 旺财:汪汪汪! 狗2.介绍() # 我是金毛,叫Max print(狗1.名字) # 直接访问属性:旺财
子类继承父类的所有功能,还能加自己的特色
继承就是"子类"自动拥有"父类"的所有属性和方法,还能额外添加自己的功能或修改原来的行为。
就像你继承了父母的基因——你拥有家族的共同特征(继承),但你也有自己独特的个性(子类自己的方法)。父亲会开车,你也会(继承方法),但你比父亲更会玩游戏(子类特有功能)。
# 父类:动物(基础模板) class Animal: def __init__(self, 名字): self.名字 = 名字 def 吃(self): print(f"{self.名字}在吃东西") def 叫(self): print("...") # 基础实现 # 子类:狗(继承动物,重写叫的方法) class Dog(Animal): # 括号里写父类名 def 叫(self): # 重写父类方法 print(f"{self.名字}:汪汪汪!") def 接飞盘(self): # 狗特有的方法 print(f"{self.名字}成功接住飞盘!") # 子类:猫 class Cat(Animal): def 叫(self): print(f"{self.名字}:喵喵喵~") d = Dog("旺财") c = Cat("咪咪") d.吃() # 继承自Animal:旺财在吃东西 d.叫() # 重写后:旺财:汪汪汪! d.接飞盘() # 狗特有:旺财成功接住飞盘! c.叫() # 重写后:咪咪:喵喵喵~
用类管理学生信息,面向对象的实际应用
class Student: def __init__(self, 名字, 成绩): self.名字 = 名字 self.成绩 = 成绩 def introduce(self): 状态 = "✅及格" if self.成绩 >= 60 else "❌不及格" print(f" {self.名字}:{self.成绩}分 {状态}") def is_pass(self): return self.成绩 >= 60 class Classroom: def __init__(self, 班级名): self.班级名 = 班级名 self.学生列表 = [] def add(self, student): self.学生列表.append(student) def average(self): if not self.学生列表: return 0 return sum(s.成绩 for s in self.学生列表) / len(self.学生列表) def top(self): return max(self.学生列表, key=lambda s: s.成绩) def report(self): print(f"\n📊 {self.班级名} 成绩报告") for s in self.学生列表: s.introduce() print(f" 平均分:{self.average():.1f}") 第一名 = self.top() print(f" 最高分:{第一名.名字} {第一名.成绩}分") 班级 = Classroom("五年二班") 班级.add(Student("小明", 95)) 班级.add(Student("小红", 78)) 班级.add(Student("小刚", 55)) 班级.report()
2分钟快速复习
class 关键字定义类。def 是定义函数,object/type 不是定义类的关键字。__init__ 方法什么时候被调用?
class 子类(父类):。extends 是 Java 的写法,Python 不用。self 作为方法第一个参数,指向调用该方法的对象本身,通过 self 访问对象的属性和其他方法。学以致用,写出真正能解决生活问题的Python小工具
用 datetime 模块处理时间,是每个脚本的必备
Python内置的 datetime 模块可以获取当前时间、计算日期差、格式化显示时间。写任何需要"记录时间"的脚本都会用到。
from datetime import datetime, date # 获取当前时间 现在 = datetime.now() print(现在) # 2026-03-28 21:30:00 print(现在.year, 现在.month, 现在.day) # 2026 3 28 print(现在.hour, 现在.minute) # 21 30 # 格式化显示 print(现在.strftime("%Y年%m月%d日 %H:%M")) # 2026年03月28日 21:30 # 计算距今多少天(比如生日倒计时) 生日 = date(2026, 6, 1) 今天 = date.today() 差距 = 生日 - 今天 print(f"距儿童节还有 {差距.days} 天")
import time 开始 = time.time() # 模拟一些耗时操作 for i in range(1000000): pass 结束 = time.time() print(f"耗时:{结束 - 开始:.3f} 秒")
用代码管理文件夹、批量改名、扫描目录
os 模块让Python可以和操作系统交互,查看、创建、删除文件夹,列出文件等。批量处理文件的必备工具。
os 模块就是一个"文件管理员",你可以让它帮你查当前在哪个文件夹(os.getcwd),列出里面有什么(os.listdir),或者帮你新建一个文件夹(os.mkdir)。
import os # 当前工作目录 print(os.getcwd()) # 列出文件夹内容 文件们 = os.listdir(".") # "." 代表当前目录 for f in 文件们: print(f) # 创建文件夹 os.makedirs("新建文件夹", exist_ok=True) # 拼接路径(跨平台安全) 路径 = os.path.join("C:\\用户", "文档", "作业.txt") print(路径) # 判断文件/文件夹是否存在 print(os.path.exists("笔记.txt")) # True/False print(os.path.isfile("笔记.txt")) # 是文件? print(os.path.isdir("新建文件夹")) # 是文件夹? # 批量重命名:给所有txt文件加上"备份_"前缀 for 文件名 in os.listdir("."): if 文件名.endswith(".txt"): os.rename(文件名, "备份_" + 文件名)
抽奖、猜数字、生成测试数据都靠它
import random # 随机整数(1到10之间,含两端) print(random.randint(1, 10)) # 随机小数(0到1之间) print(random.random()) # 从列表中随机选一个 水果 = ["苹果", "香蕉", "西瓜", "草莓"] print(random.choice(水果)) # 随机打乱列表 牌 = [1,2,3,4,5] random.shuffle(牌) print(牌) # 顺序随机 # 随机抽取多个(不重复) 中奖 = random.sample(水果, 2) print("中奖:", 中奖)
综合运用随机数、循环、函数,做一个完整小游戏
import random import time def 猜数字游戏(): 秘密 = random.randint(1, 100) 次数 = 0 开始 = time.time() print("🎮 猜数字游戏!我想了一个1-100的数") while True: try: 猜 = int(input("请猜一个数: ")) except ValueError: print("❌ 请输入数字") continue 次数 += 1 if 猜 < 秘密: print("📈 太小了,再大一点!") elif 猜 > 秘密: print("📉 太大了,再小一点!") else: 用时 = time.time() - 开始 print(f"🎉 答对了!第{次数}次猜中!用时{用时:.1f}秒") break 猜数字游戏()
2分钟快速复习
random.randint(a,b) 返回 a 到 b 之间的随机整数(含两端)。random() 返回 0~1 的浮点数,没有参数。datetime 模块,用 datetime.datetime.now() 获取当前日期时间。os.path.exists() 检查路径是否存在,返回布尔值:文件/目录存在返回 True,不存在返回 False。os.listdir(路径) 返回目录下所有文件和子目录名称的列表。用 pygame 做一个真正可以玩的游戏,把前7章所学全部用上!
安装 pygame,搭建游戏窗口,启动游戏循环
pip install pygame
pygame 是 Python 的游戏开发库,可以创建窗口、画图形、检测键盘鼠标、播放声音。学完它,你就能做出真正能运行的2D游戏!
pygame 就像一块"电子画布+遥控器"——你可以在上面画任何东西(画图形),还能检测你按了什么键(检测输入),每秒刷新60次(游戏循环),就像动画片一样,画面动起来了!
import pygame import sys # 初始化 pygame.init() # 创建窗口 (宽, 高) 屏幕 = pygame.display.set_mode((800, 600)) pygame.display.set_caption("我的第一个游戏") # 颜色定义 (R, G, B) 黑色 = (0, 0, 0) 白色 = (255, 255, 255) 红色 = (255, 0, 0) # 时钟(控制帧率) clock = pygame.time.Clock() # 游戏主循环 while True: # 1. 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # 2. 更新游戏逻辑(这里暂时空着) # 3. 绘制画面 屏幕.fill(黑色) # 清屏 pygame.draw.circle(屏幕, 红色, (400, 300), 50) # 画圆 pygame.display.flip() # 刷新显示 # 4. 控制帧率(每秒60帧) clock.tick(60)
检测按键,让角色动起来
游戏的核心:根据玩家按键,更新角色坐标,每帧重新绘制在新位置,就产生了移动效果。
import pygame, sys pygame.init() 屏幕 = pygame.display.set_mode((800, 600)) pygame.display.set_caption("移动的方块") clock = pygame.time.Clock() # 玩家初始位置和速度 x, y = 400, 300 速度 = 5 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit(); sys.exit() # 检测当前按住的键 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and x > 0: x -= 速度 if keys[pygame.K_RIGHT] and x < 760: x += 速度 if keys[pygame.K_UP] and y > 0: y -= 速度 if keys[pygame.K_DOWN] and y < 560: y += 速度 # 绘制 屏幕.fill((0, 0, 0)) pygame.draw.rect(屏幕, (0, 200, 255), (x, y, 40, 40)) pygame.display.flip() clock.tick(60)
完整可玩的小游戏,综合运用所有pygame知识
import pygame, sys, random pygame.init() W, H = 600, 500 屏幕 = pygame.display.set_mode((W, H)) pygame.display.set_caption("接球游戏") clock = pygame.time.Clock() 字体 = pygame.font.SysFont("microsoftyahei", 28) 大字体 = pygame.font.SysFont("microsoftyahei", 48) # 游戏状态 挡板 = pygame.Rect(250, H-30, 100, 15) 球_x = random.randint(20, W-20) 球_y = 0 球速 = 4 得分 = 0 生命 = 3 游戏结束 = False while True: for e in pygame.event.get(): if e.type == pygame.QUIT: pygame.quit(); sys.exit() if not 游戏结束: # 移动挡板 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and 挡板.x > 0: 挡板.x -= 6 if keys[pygame.K_RIGHT] and 挡板.x < W-100: 挡板.x += 6 # 移动球 球_y += 球速 球_rect = pygame.Rect(球_x-15, 球_y-15, 30, 30) # 碰到挡板 if 球_rect.colliderect(挡板): 得分 += 10 球速 = min(球速 + 0.2, 12) 球_x = random.randint(20, W-20) 球_y = 0 # 漏掉 elif 球_y > H: 生命 -= 1 球_x = random.randint(20, W-20) 球_y = 0 if 生命 <= 0: 游戏结束 = True # 绘制 屏幕.fill((10, 10, 20)) pygame.draw.circle(屏幕, (255, 100, 50), (int(球_x), int(球_y)), 15) pygame.draw.rect(屏幕, (50, 200, 255), 挡板) 屏幕.blit(字体.render(f"得分: {得分}", True, (255,255,255)), (10, 10)) 屏幕.blit(字体.render(f"生命: {'❤️'*生命}", True, (255,80,80)), (450, 10)) if 游戏结束: 屏幕.blit(大字体.render("GAME OVER", True, (255,50,50)), (170, 200)) 屏幕.blit(字体.render(f"最终得分: {得分}", True, (255,255,255)), (210, 270)) pygame.display.flip() clock.tick(60)
2分钟快速复习
while running:,running 是布尔变量,退出游戏时设为 False。pygame.display.flip() 将缓冲区内容刷新到屏幕,实现画面更新。不调用它画面不会更新。pygame.QUIT 事件,在事件循环中检测到它后设 running=False 退出游戏。clock.tick(60) 限制游戏每秒最多跑 60 帧,防止游戏逻辑跑太快。pygame.draw.rect(surface, color, rect) 绘制填充矩形,是 pygame 中最常用的绘制函数之一。综合运用9章所学,独立完成一个完整项目。恭喜你走到了最后一章!
在选项目之前,先来确认一下你的技能清单
完成了前8章,你已经掌握了以下Python技能,完全足够做一个完整的小项目:
从以下3个项目中选一个,独立完成
根据自己的兴趣和挑战意愿选一个。每个项目都有详细说明,从简单到有挑战:
最有挑战性的项目,一步步带你做完
贪吃蛇的关键:用一个列表存蛇身所有格子的坐标,每帧在头部插入新位置,在尾部删除旧位置,就产生了"蛇在移动"的效果。吃到食物时不删尾部,蛇就变长了。
# 蛇用列表存,每个元素是 [x, y] 格子坐标 蛇 = [[10,10], [9,10], [8,10]] # 头、身、尾 方向 = [1, 0] # 向右 # 每帧移动一步 def 移动(): # 计算新头部位置 新头 = [蛇[0][0] + 方向[0], 蛇[0][1] + 方向[1]] # 插入新头部 蛇.insert(0, 新头) # 如果没吃到食物,删掉尾部(蛇长度不变) if 新头 != 食物位置: 蛇.pop() # 删尾部 # 如果吃到食物:不删尾部(蛇变长),重新生成食物 # 碰撞检测 def 检查死亡(): 头 = 蛇[0] # 撞墙 if 头[0] < 0 or 头[0] >= 20 or 头[1] < 0 or 头[1] >= 20: return True # 咬到自己 if 头 in 蛇[1:]: return True return False
import pygame, sys, random pygame.init() 格子 = 30 格数 = 20 W = 格子 * 格数 # 600 屏幕 = pygame.display.set_mode((W, W+50)) pygame.display.set_caption("🐍 贪吃蛇") clock = pygame.time.Clock() 字体 = pygame.font.SysFont("microsoftyahei", 24) 大字体 = pygame.font.SysFont("microsoftyahei", 42) def 随机食物(蛇): while True: f = [random.randint(0,格数-1), random.randint(0,格数-1)] if f not in 蛇: return f def 画格子(pos, 颜色): pygame.draw.rect(屏幕, 颜色, (pos[0]*格子+1, pos[1]*格子+51, 格子-2, 格子-2)) # 初始化游戏状态 def 重置(): 蛇 = [[10,10],[9,10],[8,10]] return 蛇, [1,0], 随机食物(蛇), 0, 8, False 蛇, 方向, 食物, 得分, 速度, 结束 = 重置() while True: for e in pygame.event.get(): if e.type == pygame.QUIT: pygame.quit(); sys.exit() if e.type == pygame.KEYDOWN: if e.key == pygame.K_r: 蛇, 方向, 食物, 得分, 速度, 结束 = 重置() if not 结束: if e.key==pygame.K_UP and 方向!=[0,1]: 方向=[0,-1] elif e.key==pygame.K_DOWN and 方向!=[0,-1]: 方向=[0,1] elif e.key==pygame.K_LEFT and 方向!=[1,0]: 方向=[-1,0] elif e.key==pygame.K_RIGHT and 方向!=[-1,0]: 方向=[1,0] if not 结束: 新头 = [蛇[0][0]+方向[0], 蛇[0][1]+方向[1]] if 新头[0]<0 or 新头[0]>=格数 or 新头[1]<0 or 新头[1]>=格数 or 新头 in 蛇: 结束 = True else: 蛇.insert(0, 新头) if 新头 == 食物: 得分 += 10 速度 = min(速度+0.5, 20) 食物 = 随机食物(蛇) else: 蛇.pop() # 绘制 屏幕.fill((10,12,20)) pygame.draw.rect(屏幕, (20,22,35), (0,50,W,W)) for seg in 蛇[1:]: 画格子(seg, (50,180,80)) 画格子(蛇[0], (100,240,120)) # 头部亮一点 画格子(食物, (255,80,80)) 屏幕.blit(字体.render(f"得分: {得分}", True, (200,255,150)), (10,12)) 屏幕.blit(字体.render(f"长度: {len(蛇)}", True, (150,200,255)), (200,12)) 屏幕.blit(字体.render("R键重玩", True, (100,100,150)), (460,12)) if 结束: 屏幕.blit(大字体.render("GAME OVER", True, (255,80,80)), (155,240)) 屏幕.blit(字体.render(f"最终得分: {得分} (R键重玩)", True, (255,255,255)), (140,300)) pygame.display.flip() clock.tick(int(速度))
list.sort() 原地排序(修改原列表);sorted(list) 返回新列表不改变原列表。两者都可以,这里填 sort。import 关键字用于导入模块。如 import os、import random、from datetime import datetime。