第 04 章 · 二年级(小学四年级) 下学期

完整游戏开发与数据处理

用面向对象重构游戏架构,做出带粒子特效和地图的完整 RPG;同时跨入数据分析三件套。

12 课时 22 个知识点 4 大易错点 3 档分层作业
一年级上一年级下二年级上二年级下三年级上三年级下四年级上四年级下五年级上五年级下六年级上六年级下七年级上七年级下
01

情景导航

用故事和生活类比打开这学期的大门,先「知其所以然」再学语法。

小强发现游戏写大了就乱成一团:敌人代码复制了 20 份,改一个属性要改 20 处。学会「类」之后,他像造物主一样定义「敌人」这个物种,然后批量生产。数据三件套 NumPy / Pandas / Matplotlib,则让他第一次用图表「看见」数据背后的规律。这个学期结束,你将交出一个完整的 RPG 游戏。

💯生活类比:把新知识挂在旧经验上
🐱

类 = 物种图纸

图纸(class)画一次,照着造出无数只猫(实例),只改图纸全体更新。

模板与实例
🧬

继承 = 家族血脉

动物有的本领猫都有,猫还能长出自己的新招(方法重写)。

代码复用
📊

DataFrame = 超级 Excel

一行行数据任你筛选、排序、汇总,比手翻表格快一万倍。

结构化数据
📈

Matplotlib = 画笔

一行代码把一列数字变成折线图、柱状图。

数据可视化
核 心 口 诀class图纸造万物,继承重写家族谱;
精灵组里批量管,碰撞粒子加特效;
Numpy算、Pandas查、Matplotlib画图表!
02

知识探究

完整游戏开发与数据处理 —— 共 12 课时,全部知识点一网打尽。

🐱面向对象基础(2 课时)
第1课面向对象入门
🎯 趣味项目:定义一个「猫」类📚 教学目标:掌握class、对象,在项目实战中巩固运用
class对象
Python类与对象:定义一只猫
class Cat:
    def __init__(self, name, color):    # 造猫说明书
        self.name = name                # 自己的名字
        self.color = color

    def meow(self):                     # 猫的本领
        print(f"{self.name}({self.color}):喵~")

mimi = Cat("咪咪", "橘色")     # 造出一只真猫
mimi.meow()
运 行 结 果
咪咪(橘色):喵~
第2课继承与多态
🎯 趣味项目:动物家族📚 教学目标:掌握继承、方法重写,在项目实战中巩固运用
继承方法重写
Python继承与方法重写
class Animal:
    def __init__(self, name):
        self.name = name
    def speak(self):
        print("……")

class Dog(Animal):              # 狗是动物(继承)
    def speak(self):            # 重写:狗有自己的叫声
        print(f"{self.name}:汪汪!")

class Duck(Animal):
    def speak(self):            # 同一方法,不同表现
        print(f"{self.name}:嘎嘎!")

for a in [Dog("旺财"), Duck("唐老鸭")]:
    a.speak()
运 行 结 果
旺财:汪汪!
唐老鸭:嘎嘎!
✨精灵与特效(5 课时)
第3课精灵系统
🎯 趣味项目:多个敌人同时出现📚 教学目标:掌握Sprite类、Group,在项目实战中巩固运用
Sprite类Group
Python精灵系统:批量管理敌人
class Enemy(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()              # 父类先初始化!
        self.image = pygame.Surface((30, 30))
        self.image.fill((248, 113, 113))
        self.rect = self.image.get_rect(topleft=(x, y))
        self.speed = 2

    def update(self):                   # 每帧自动被调用
        self.rect.y += self.speed

enemies = pygame.sprite.Group()
for i in range(5):                     # 一键生成 5 个敌人
    enemies.add(Enemy(i * 60, 0))
enemies.update()                       # 集体移动
enemies.draw(screen)                   # 集体绘制
运 行 结 果
(5 个红色方块整齐下落,代码只写了一份)
第4课碰撞检测进阶
🎯 趣味项目:打砖块游戏📚 教学目标:掌握矩形碰撞、像素碰撞,在项目实战中巩固运用
矩形碰撞像素碰撞
Python碰撞检测进阶:矩形碰撞
import pygame
ball = pygame.Rect(50, 50, 10, 10)      # 球
brick = pygame.Rect(40, 60, 40, 20)     # 砖块
pad = pygame.Rect(30, 280, 80, 12)      # 挡板
print("球撞上砖块?", ball.colliderect(brick))
print("球撞上挡板?", ball.colliderect(pad))
# 像素级碰撞:先矩形粗判,再用碰撞掩码精判
# mask1 = pygame.mask.from_surface(ball_img)
# hit = mask1.overlap(mask2, offset)
运 行 结 果
球撞上砖块? True
球撞上挡板? False
第5课粒子效果
🎯 趣味项目:爆炸特效📚 教学目标:掌握粒子系统,在项目实战中巩固运用
粒子系统
Python粒子效果:爆炸的本质
import random
# 爆炸 = 一次性生成一批「带寿命的粒子」
particles = []
for _ in range(8):
    particles.append({
        "x": 150, "y": 100,                    # 出生点
        "vx": random.randint(-5, 5),           # 随机速度
        "vy": random.randint(-8, -2),
        "life": random.randint(20, 50),        # 寿命帧数
        "color": random.choice([(255,120,40), (255,220,80)]),
    })
# 每帧更新:位置 += 速度,重力下坠,寿命 -1,寿命归零就删除
for p in particles[:3]:
    p["x"] += p["vx"]; p["y"] += p["vy"]; p["life"] -= 1
    print("粒子 (%3d,%3d) 剩余寿命 %2d" % (p["x"], p["y"], p["life"]))
运 行 结 果
粒子 (149,  94) 剩余寿命 47
粒子 (152,  92) 剩余寿命 49
粒子 (146,  97) 剩余寿命 38
(几十个粒子同时飞散 = 绚丽爆炸)
第6课地图与瓦片
🎯 趣味项目:迷宫探险游戏📚 教学目标:掌握瓦片地图、寻路,在项目实战中巩固运用
瓦片地图寻路
Python地图与瓦片:迷宫用二维数组画出来
# 一张地图 = 一个二维列表(1=墙,0=路,2=终点)
maze = [
    [1, 1, 1, 1, 1],
    [1, 0, 0, 0, 1],
    [1, 0, 1, 0, 1],
    [1, 0, 0, 2, 1],
    [1, 1, 1, 1, 1],
]
for row in maze:
    print("".join("█" if c == 1 else ("◎" if c == 2 else "·") for c in row))
# 寻路:从起点 BFS 一层层探索,第一次到达终点就是最短路
运 行 结 果
█████
█···█
█·█·█
█··◎█
█████
第7课存档与读档
🎯 趣味项目:游戏进度保存📚 教学目标:掌握JSON文件,在项目实战中巩固运用
JSON文件
PythonJSON 存档与读档
import json
save = {"level": 3, "coins": 250, "pos": [10, 20]}
with open("save.json", "w", encoding="utf-8") as f:
    json.dump(save, f, ensure_ascii=False)    # 存档

with open("save.json", encoding="utf-8") as f:
    loaded = json.load(f)                     # 读档
print("读到关卡:", loaded["level"])
运 行 结 果
读到关卡: 3
📊数据分析三件套(4 课时)
第8课Numpy入门
🎯 趣味项目:矩阵运算小工具📚 教学目标:掌握ndarray、基本运算,在项目实战中巩固运用
ndarray基本运算
PythonNumPy:矩阵运算
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print("相加:\n", a + b)          # 对应位置相加
print("乘以2:\n", a * 2)
print("整体求和:", a.sum())
运 行 结 果
相加:
 [[ 6  8]
 [10 12]]
乘以2:
 [[2 4]
 [6 8]]
整体求和: 10
第9课Pandas入门
🎯 趣味项目:班级成绩分析表📚 教学目标:掌握DataFrame、数据筛选,在项目实战中巩固运用
DataFrame数据筛选
PythonPandas:成绩分析
import pandas as pd
df = pd.DataFrame({
    "姓名": ["小明", "小红", "小刚", "小丽"],
    "数学": [92, 88, 75, 95],
    "英语": [85, 94, 80, 90],
})
print("平均分:\n", df[["数学","英语"]].mean())
print("\n数学>80 的同学:\n", df[df["数学"] > 80])
运 行 结 果
平均分:
 数学    87.5
英语    87.25
dtype: float64

数学>80 的同学:
    姓名  数学  英语
0  小明  92  85
1  小红  88  94
3  小丽  95  90
第10课Matplotlib入门
🎯 趣味项目:成绩可视化图表📚 教学目标:掌握折线图、柱状图、饼图,在项目实战中巩固运用
折线图柱状图饼图
PythonMatplotlib:画成绩图
import matplotlib.pyplot as plt
names = ["小明", "小红", "小刚", "小丽"]
scores = [92, 88, 75, 95]
plt.bar(names, scores, color="#04A3F0")   # 柱状图
plt.title("数学成绩")
plt.ylabel("分数")
plt.show()
运 行 结 果
(弹出一个窗口,显示 4 根蓝色柱子)
第11课数据清洗
🎯 趣味项目:处理脏数据📚 教学目标:掌握缺失值、重复值处理,在项目实战中巩固运用
缺失值重复值处理
Python数据清洗:处理脏数据三板斧
import pandas as pd
df = pd.DataFrame({"姓名": ["小明", "小红", None, "小刚"],
                   "分数": [90, None, 85, 90]})
print("缺失统计:\n", df.isnull().sum(), sep="")
df = df.dropna()                        # ① 删除缺失行
df = df.drop_duplicates(subset="分数")  # ② 去重
df["分数"] = df["分数"].astype(int)     # ③ 统一类型
print("清洗后:\n", df, sep="")
运 行 结 果
缺失统计:
姓名    1
分数    1
dtype: int64
清洗后:
   姓名  分数
0  小明   90
2  小刚   85
🏆综合实战(1 课时)
🏆 期末项目期末项目
🎯 趣味项目:完整的RPG小游戏📚 教学目标:掌握综合运用,在项目实战中巩固运用
综合运用
Python期末项目:RPG 游戏的骨架
# RPG = 角色 + 地图 + 战斗 + 剧情 四大系统
class Hero:
    def __init__(self, name):
        self.name, self.hp, self.atk = name, 100, 15
    def attack(self, enemy):
        enemy.hp -= self.atk
        print(f"{self.name} 攻击 {enemy.name},剩 {enemy.hp} 血")

hero = Hero("勇者")
slime = type("Slime", (), {"__init__": lambda s: None})()
slime.name, slime.hp = "史莱姆", 30
hero.attack(slime)   # 战斗循环 → 剧情推进 → 通关
运 行 结 果
勇者 攻击 史莱姆,剩 15 血
(把四个系统串起来,就是一个完整 RPG)
03

实践应用

每个知识点都要落到能跑、能玩、能演示的作品上。

🏆 期末项目完整的RPG小游戏

期末项目是整学期知识点的综合检验场:综合运用。学生将独立完成需求拆解 → 功能实现 → 调试打磨 → 上台演示的完整闭环。

💡 验收标准:功能完整可运行、代码结构清晰、能给同学讲明白实现原理。
📊本学期课时一览表(可打印)
课次主题趣味项目知识点
1面向对象入门定义一个「猫」类class、对象
2继承与多态动物家族继承、方法重写
3精灵系统多个敌人同时出现Sprite类、Group
4碰撞检测进阶打砖块游戏矩形碰撞、像素碰撞
5粒子效果爆炸特效粒子系统
6地图与瓦片迷宫探险游戏瓦片地图、寻路
7存档与读档游戏进度保存JSON文件
8Numpy入门矩阵运算小工具ndarray、基本运算
9Pandas入门班级成绩分析表DataFrame、数据筛选
10Matplotlib入门成绩可视化图表折线图、柱状图、饼图
11数据清洗处理脏数据缺失值、重复值处理
12期末项目完整的RPG小游戏综合运用
04

总结提升

把一学期的知识点串成体系,看清来路与去向。

📌知识点体系图
🐱 面向对象基础
class对象继承方法重写
✨ 精灵与特效
Sprite类Group矩形碰撞像素碰撞粒子系统瓦片地图寻路JSON文件
📊 数据分析三件套
ndarray基本运算DataFrame数据筛选折线图柱状图饼图缺失值重复值处理
🏆 综合实战
综合运用
🔄承上启下

◀ 上一章:二年级 上学期 · 算法基础与Pygame入门

下一章 ▶:三年级 上学期 · 算法进阶与NOAI初赛备战

💪 学完这学期,你将获得

用面向对象重构游戏架构,做出带粒子特效和地图的完整 RPG;同时跨入数据分析三件套。

结业时你将带走:3 个可玩游戏作品 + 一套算法思维 + NOAI 初赛参赛能力。

05

学习检测

避开高频易错点,再用速查表把语法焊进肌肉记忆。

易错点 1

忘记 super().__init__()

✗ 错误写法
class Enemy(Sprite):
    def __init__(self):
        self.image = …  # 父类没初始化
✓ 正确写法
class Enemy(Sprite):
    def __init__(self):
        super().__init__()
        self.image = …
💡 为什么:精灵子类不调用父类初始化,加入 Group 时会出错。
易错点 2

类当函数用

✗ 错误写法
cat = Cat       # 少了括号
✓ 正确写法
cat = Cat()
💡 为什么:Cat 是图纸,Cat() 才是一只真正的猫;忘记括号是初学者最常见错误。
易错点 3

链式赋值警告

✗ 错误写法
df[df.分数>90]["姓名"] = "x"
✓ 正确写法
df.loc[df.分数>90, "姓名"] = "x"
💡 为什么:链式索引赋值可能不生效,规范写法用 .loc 一步到位。
易错点 4

画完图不 show

✗ 错误写法
plt.plot(x, y)
# 什么都没出现
✓ 正确写法
plt.plot(x, y)
plt.show()
💡 为什么:plt.show() 才会把图渲染出来,脚本里漏了它就是一张白屏。
📋语法速查表
功能写法一句话理解
定义类class Cat:开始画猫的图纸
初始化def __init__(self, name):造猫时自动执行的准备动作
继承class Dog(Animal):动物会的狗都会
调父类super().__init__()先执行父类的准备动作
精灵组enemies = pygame.sprite.Group()批量管理/更新/绘制敌人
NumPy 数组a = np.array([[1, 2], [3, 4]])矩阵运算一步到位
筛选数据df[df.成绩 > 90]一行筛出所有高分行
画柱状图df.plot(kind='bar')数据直接变图表
分 层 作 业

练习作业

按 A / B / C 三档难度自主选择:保底完成 A 组,学有余力挑战 B、C 组。

A组·基础任选其一深入完成
  1. 定义 Rectangle 类:带 width/height 属性和 area() / perimeter() 方法。
  2. 建三层继承链 Animal → Dog → Puppy,每层新增一个本领。
  3. 用 Pandas 读班级成绩表,算出平均分和最高分。
B组·提高任选其一深入完成
  1. 给打砖块加爆炸粒子特效。
  2. 地图编辑器:用字符画地图,程序读入生成瓦片关卡。
  3. 把自己的成绩 CSV 画成柱状图 + 折线图组合。
C组·挑战任选其一深入完成
  1. 完整 RPG:战斗系统 + 地图行走 + JSON 存档。
  2. 分析自己近一年身高体重数据,输出一份图文报告。
  3. 采集全班睡眠时间数据,清洗后可视化并给出结论。