返回首页 佳昊的课堂记录
成长记录 · 第 1 ~ 5 课

佳昊的课堂记录

从第一节课开始,把每一次动手做出来的作品都记在这里。
从一个小小的网页自动化工具,一路做到有地图、有敌人、有战斗的完整游戏模型。
下面还收藏了他自己做的 5 个网页作品,点一下就能打开看。

网页作品展

佳昊做的 5 个网页

点击卡片,直接打开作品查看

🌙 作品 1 静夜诗 用标题和段落,把《静夜思》和《悯农》排成网页 打开作品 → 🎈 作品 2 我的网页 练习标题、段落,还有左中右三种对齐方式 打开作品 → 🖼️ 作品 3 古诗配图 用 Flex 布局,让图片和古诗左右并排 打开作品 → 🪪 作品 4 自我介绍卡片 渐变背景、圆角卡片,悬停还能切换头像 打开作品 → 🎡 作品 5 幸运大转盘 用渐变画出转盘,点击按钮随机抽奖 打开作品 →
1
🌐 第 1 课

网页自动化小工具

第一节课,佳昊做了一个 网页自动化小工具。运行程序之后,电脑会自动打开浏览器, 并且按照提前保存好的网址,依次自动打开 www.bilibili.com 和 www.douyin.com, 全程不用手动去输入网址。

  • 用 webbrowser 控制浏览器自动打开网页
  • 把要访问的网址,提前保存进一个列表里
  • 用 for 循环,把列表里的网址一个一个自动打开
webbrowser 列表 list for 循环 自动化
作品代码 · 网页自动化小工具.py
import webbrowser   # 控制浏览器的工具
import time         # 用来控制等待时间

# 佳昊提前保存好的网址
url_list = [
    "https://www.bilibili.com",
    "https://www.douyin.com",
]

# 循环打开列表里的每一个网址
for url in url_list:
    webbrowser.open(url)   # 自动打开浏览器访问网址
    time.sleep(2)          # 等 2 秒,再打开下一个
2
🪟 第 2 课

搜索物资窗口

第二节课,佳昊用 tk(tkinter) 创建了一个属于自己的窗口, 在窗口里做了一个 “搜索物资” 按钮。点一下按钮,就能随机搜出一样物资。 物资的图片是佳昊自己上网找来的,而且每一种物资的 爆率 都可以自己调整, 想让它更容易出现,就把爆率数字调大一点。

  • 用 tkinter 创建窗口和按钮,做出程序界面
  • 物资图片自己寻找、自己挑选
  • 给每种物资设置不同的爆率权重,控制出现的难易
  • 点击按钮,按爆率随机抽出一种物资
tkinter 窗口 Button 按钮 random 随机 爆率
作品代码 · 搜索物资窗口.py
import tkinter as tk
import random

window = tk.Tk()
window.title("物资搜索器")
window.geometry("360x480")

# 物资 & 爆率:数字越大,越容易搜到
loot_table = {
    "医疗包": 30,
    "子弹": 25,
    "防弹衣": 20,
    "三级头盔": 15,
    "金色怀表": 10,
}

tip = tk.Label(window, text="点一下,看看能搜到什么?", font=("微软雅黑", 16))
tip.pack(pady=20)

result = tk.Label(window, text="", font=("微软雅黑", 22), fg="#26a69a")
result.pack(pady=10)

def search():
    names = list(loot_table.keys())                  # 所有物资名
    weights = list(loot_table.values())              # 对应的爆率
    item = random.choices(names, weights=weights, k=1)[0]   # 按爆率抽一个
    result.config(text="搜到:" + item)

btn = tk.Button(window, text="搜索物资", font=("微软雅黑", 18),
                bg="#4ecdc4", fg="white", command=search)
btn.pack(pady=20)

window.mainloop()
3
📦 第 3 课

物资箱动态系统

第三节课,佳昊把这个程序升级成了 物资箱: 物资的 数量 和 爆率 可以动态调整, 还可以把自己想要存放的物资(网上找的图片)放进物资箱。 佳昊自己 手动指定一个存放路径,程序就会自动读取里面的图片, 这些物资就出现在自己的程序里了。

  • 自己指定物资图片的存放文件夹路径
  • 程序自动读取文件夹里的图片,转换成物资
  • 动态增加 / 调整物资的数量和爆率
  • 物资箱内容随时可改,改完立刻生效
os 文件路径 列表 / 字典 动态更新 图片素材
作品代码 · 物资箱.py
import os
import random

BOX_PATH = "物资图片"   # 佳昊自己指定的物资图片文件夹
loot = {}               # 物资箱:{物资名: 爆率}

# 第一步:自动读取文件夹里的物资图片,放进物资箱
for file in os.listdir(BOX_PATH):
    if file.lower().endswith((".png", ".jpg")):
        name = os.path.splitext(file)[0]   # 用文件名当物资名
        loot[name] = 10                    # 默认爆率

# 第二步:动态调整某个物资的爆率
def set_rate(name, rate):
    loot[name] = rate

# 第三步:按爆率搜索物资
def search():
    names = list(loot)
    weights = [loot[n] for n in names]
    return random.choices(names, weights=weights, k=1)[0]
4
🏃 第 4 课

人物角色移动系统

第四节课,佳昊在这个物资箱程序上,新增了 人物角色移动系统。 现在按键盘上的 上、下、左、右 方向键,就可以控制角色在界面里四向走动, 走到物资堆的位置,就能搜索物资。

  • 在界面里创建属于自己的角色
  • 绑定键盘的上下左右四个方向键
  • 角色可以四向移动,走到物资堆前搜索物资
键盘按键事件 bind 绑定 坐标移动 角色角色
作品代码 · 人物移动.py
import tkinter as tk

window = tk.Tk()
window.title("物资箱 · 人物移动")

canvas = tk.Canvas(window, width=600, height=480, bg="#2b2b2b")
canvas.pack()

# 创建角色(一个小方块代表佳昊的角色)
player = canvas.create_rectangle(280, 220, 320, 260, fill="#4ecdc4")

def move(event):
    step = 12   # 每按一次移动的距离
    if event.keysym == "Up":
        canvas.move(player, 0, -step)
    elif event.keysym == "Down":
        canvas.move(player, 0, step)
    elif event.keysym == "Left":
        canvas.move(player, -step, 0)
    elif event.keysym == "Right":
        canvas.move(player, step, 0)

window.bind("<Key>", move)   # 绑定键盘按键
window.mainloop()
5
⚔️ 第 5 课

敌人与攻击系统 · 完整游戏模型

第五节课,佳昊给游戏新增了 敌人 和 攻击系统, 并且把地图做得 更大了。至此,一个有地图、有角色、有物资、 有敌人、能战斗的 完整游戏模型 就做出来啦!

  • 新增敌人,敌人拥有自己的位置和血量
  • 新增攻击系统:靠近敌人按下攻击键就能造成伤害
  • 血量归零,敌人被击败
  • 地图扩大,游戏内容更丰富,做出完整游戏模型
敌人 AI 血量 hp 攻击判定 碰撞 / 距离 大地图
作品代码 · 敌人与战斗.py
# 更大的地图
MAP_WIDTH, MAP_HEIGHT = 1600, 1200

# 敌人列表:每个敌人有自己的位置和血量
enemies = [
    {"x": 800,  "y": 600, "hp": 100},
    {"x": 1200, "y": 900, "hp": 100},
]

def distance(a, b):
    # 计算两个位置的距离
    return ((a["x"] - b["x"]) ** 2 + (a["y"] - b["y"]) ** 2) ** 0.5

def attack(player, event):
    if event.keysym == "space":           # 按下空格键攻击
        for enemy in enemies[:]:          # 遍历所有敌人
            if distance(player, enemy) < 60:   # 距离够近才能打到
                enemy["hp"] -= 30         # 每次攻击扣 30 点血
                if enemy["hp"] <= 0:
                    enemies.remove(enemy) # 血量归零,敌人被击败
返回首页 · 佳昊的编程课网站

第 1 课 ~ 第 5 课 · 佳昊的编程成长记录