20251234 2025-2026-2 《Python程序设计》实验四报告

20251234徐浡恒 实验四 Python综合实践实验报告

————基于Pygame的宝石消除(三消)游戏设计与实现

课程:《Python程序设计》

班级: 2512

姓名: 徐浡恒

学号:20251234

实验教师:王志强

实验日期:2026年5月31日

必修/选修: 公选课

一、设计概述

1. 项目背景与意义

       消消乐作为我童年的一款经典休闲益智游戏,逻辑清晰,但覆盖图形渲染、事件处理、算法设计、资源管理等编程核心领域,可以作为一次复刻的尝试。本次作业设计通过实现宝石三消游戏,将Python基础、面向对象编程、模块化设计等理论知识的实现,掌握Pygame游戏开发全流程,提升独立解决工程问题的能力,重温童年经典。

2. 开发环境与技术

类别

选型

选型理由

编程语言

Python 3.10

语法简洁、生态丰富,适合快速原型开发

图形库

Pygame 2.5.2

轻量级2D游戏库,API友好,文档完善

开发工具

Pycharm

插件丰富,支持断点调试与代码补全

系统环境

Windows 11

兼容性好,适合开发,其实是只有win11的电脑

3. 完整功能清单

基础初始化:Pygame初始化、窗口创建、资源加载
核心交互:鼠标选中宝石、相邻宝石交换、无效交换回退
游戏逻辑:无初始三连生成、三连检测、消除、下落填充、连锁消除
实时反馈:网格绘制、选中高亮、分数显示、倒计时、加分动画、音效

流程控制:游戏结束判断、重玩、退出、游戏重置
图形设计:7种差异化宝石素材、统一视觉风格

视频演示:20251234python作业_哔哩哔哩_bilibili

代码以及压缩包已上传gitee: https://gitee.com/uiuied/py.git

 

image

 

 

 

二、整体架构设计

1. 四层模块化架构

Plaintext
┌─────────────────────────┐
│ 资源层 (resources/) │ 图片(7种宝石)、音频(1bgm+7种音效)、字体
├─────────────────────────┤
│ 逻辑层 (modules/) │ gemSprite宝石类、gemGame游戏核心类
├─────────────────────────┤
│ 配置层 (cfg.py) │ 所有常量统一管理
├─────────────────────────┤
│ 入口层 (pygame20251234.py)│ 程序入口、主循环控制
└─────────────────────────┘

2. 游戏状态机设计

通过三个互斥状态标志位避免逻辑冲突:

  • overall_moving:全局下落状态(消除后填充,禁止操作)
  • individual_moving:个体交换状态(玩家交换动画,禁止操作)
  • 空闲状态:等待玩家点击

三、图形设计说明

3.1 宝石素材设计规范

本项目共设计7种差异化宝石,采用统一的64×64像素尺寸,风格为3D水晶质感,色彩鲜明且辨识度高,避免因视觉相似导致玩家误操作:

宝石编号

形状

主色调

设计特点

gem1gem1

正方形

深蓝色

双层边框+高光点,立体感强

gem2gem2

圆形

翠绿色

同心圆纹理,模拟翡翠质感

gem3gem3

菱形

橙红色

多面切割,模拟红宝石光泽

gem4gem4

五角星

金黄色

渐变金属质感,视觉冲击力强

gem5gem5

正六边形

玫红色

棱角分明,模拟紫水晶

gem6gem6

回形正方形

银黑色

金属拉丝效果,科技感强

gem7gem7

正三角形

银白色

多层嵌套,模拟钻石切割

3.2 视觉设计原则

  1. 尺寸统一:所有宝石均为64×64像素,与cfg.py中GRIDSIZE=64严格对应, 保证网格对齐
  2. 色彩区分:7种宝石采用完全不同的主色调,避免色弱玩家无法区分
  3. 风格统一:全部采用3D水晶+高光效果,整体视觉协调
  4. 透明背景:所有图片均为PNG透明格式,消除后不会残留白色背景

3.3 图形加载与渲染优化

Python
# gemSprite类中优化图片加载
self.image = pygame.image.load(img_path).convert_alpha() # 带透明通道加载
self.image = pygame.transform.smoothscale(self.image, size) # 平滑缩放,避免锯齿

  • 使用convert_alpha()加载透明PNG图片,保证背景透明
  • 使用smoothscale()替代普通scale(),提升缩放后图片质量
  • 所有图片在游戏初始化时一次性加载,避免运行时重复加载导致卡顿

四、全功能清单与对应代码实现

3.1 基础初始化功能

3.1.1 Pygame与游戏窗口初始化

功能描述:初始化Pygame所有模块,创建指定大小的游戏窗口,设置窗口标题。

Python
# Game15.py main()函数
def main():
pygame.init() # 初始化Pygame所有子模块(图形、音频、事件等)
screen = pygame.display.set_mode(cfg.SCREENSIZE) # 创建600x600窗口
pygame.display.set_caption('Gemgem 宝石消消乐') # 设置窗口标题

代码说明:pygame.init()是所有Pygame程序的入口,必须在调用其他Pygame API前执行;set_mode返回的screen对象是所有图形绘制的画布。

3.1.2 音频资源加载与播放

功能描述:加载背景音乐并循环播放,加载消除/错误音效。

Python
# Game15.py main()函数
pygame.mixer.init() # 初始化音频模块
# 加载并循环播放背景音乐(-1表示无限循环)
pygame.mixer.music.load(os.path.join(cfg.ROOTDIR, "resources/audios/bg.mp3"))
pygame.mixer.music.set_volume(0.6) # 设置音量为60%
pygame.mixer.music.play(-1)

# 加载音效字典
sounds = {}
# 交换失败音效
sounds['mismatch'] = pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/badswap.wav'))
# 6种不同的消除音效(随机播放避免听觉疲劳)
sounds['match'] = []
for i in range(6):
sounds['match'].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, f'resources/audios/match{i}.wav')))

代码说明:使用os.path.join()拼接路径,避免Windows/macOS路径分隔符差异;背景音乐用mixer.music(支持长音频循环),短音效用mixer.Sound(支持多音效同时播放)。

3.1.3 字体与图片资源加载

功能描述:加载游戏字体和7种宝石图片路径。

Python
# Game15.py main()函数
# 加载自定义字体(用于显示分数、提示文字)
font = pygame.font.Font(os.path.join(cfg.ROOTDIR, 'resources/font/font.TTF'), 25)

# 加载7种宝石图片路径(后续在gemSprite中加载并缩放)
gem_imgs = []
for i in range(1, 8):
gem_imgs.append(os.path.join(cfg.ROOTDIR, f'resources/images/gem{i}.png'))

3.2 核心交互功能

3.2.1 鼠标点击选中宝石

功能描述:检测鼠标点击位置,判断是否点击到宝石,返回宝石的网格坐标。

Python
# modules/game.py gemGame.checkSelected()
def checkSelected(self, position):
# 遍历所有宝石,检测点击位置是否在宝石矩形内
for x in range(self.cfg.NUMGRID):
for y in range(self.cfg.NUMGRID):
if self.getGemByPos(x, y).rect.collidepoint(*position):
return [x, y] # 返回网格坐标(x,y)
return None # 未点击到宝石

代码说明:rect.collidepoint()是Pygame内置的碰撞检测方法,用于判断点是否在矩形内;返回的是网格坐标(0-7)而非像素坐标,方便后续逻辑处理。

3.2.2 相邻宝石交换与动画

功能描述:仅允许上下左右相邻的宝石交换,交换时播放平滑移动动画。

Python
# modules/game.py gemGame.swapGem()
def swapGem(self, gem1_pos, gem2_pos):
# 计算两个宝石的行列差,绝对值为1才是相邻
margin = gem1_pos[0] - gem2_pos[0] + gem1_pos[1] - gem2_pos[1]
if abs(margin) != 1:
return False # 非相邻,交换失败

gem1 = self.getGemByPos(*gem1_pos)
gem2 = self.getGemByPos(*gem2_pos)

# 根据相对位置设置移动方向
if gem1_pos[0] - gem2_pos[0] == 1:
gem1.direction = 'left'
gem2.direction = 'right'
elif gem1_pos[0] - gem2_pos[0] == -1:
gem2.direction = 'left'
gem1.direction = 'right'
elif gem1_pos[1] - gem2_pos[1] == 1:
gem1.direction = 'up'
gem2.direction = 'down'
elif gem1_pos[1] - gem2_pos[1] == -1:
gem2.direction = 'up'
gem1.direction = 'down'

# 设置目标位置
gem1.target_x = gem2.rect.left
gem1.target_y = gem2.rect.top
gem1.fixed = False # 标记为移动中
gem2.target_x = gem1.rect.left
gem2.target_y = gem1.rect.top
gem2.fixed = False

# 交换数组中的引用(更新逻辑位置)
self.all_gems[gem2_pos[0]][gem2_pos[1]] = gem1
self.all_gems[gem1_pos[0]][gem1_pos[1]] = gem2
return True

代码说明:同时更新宝石的像素目标位置和数组中的逻辑位置;fixed=False标记宝石处于移动状态,主循环会调用move()方法实现动画。

3.2.3 无效交换自动回退

功能描述:交换后未形成三连时,自动将宝石交换回原位置并播放错误音效。

Python
# modules/game.py gemGame.start() 主循环
if individual_moving:
gem1 = self.getGemByPos(*gem_selected_xy)
gem2 = self.getGemByPos(*gem_selected_xy2)
gem1.move()
gem2.move()
if gem1.fixed and gem2.fixed: # 交换动画完成
res_match = self.isMatch()
# 无匹配且未回退过 → 执行回退
if res_match[0] == 0 and not swap_again:
swap_again = True
self.swapGem(gem_selected_xy, gem_selected_xy2) # 再次交换回原位置
self.sounds['mismatch'].play() # 播放错误音效

3.3 游戏核心逻辑功能

3.3.1 无初始三连的宝石网格生成

功能描述:随机生成8×8宝石网格,确保初始无水平/竖直三连。

Python
# modules/game.py gemGame.reset()
def reset(self):
# 循环生成直到无初始三连
while True:
self.all_gems = []
self.gems_group = pygame.sprite.Group() # 创建精灵组统一管理
for x in range(self.cfg.NUMGRID):
self.all_gems.append([])
for y in range(self.cfg.NUMGRID):
# 宝石初始位置在屏幕上方,实现下落入场效果
gem = gemSprite(
img_path=random.choice(self.gem_imgs),
size=(self.cfg.GRIDSIZE, self.cfg.GRIDSIZE),
position=[self.cfg.XMARGIN+x*self.cfg.GRIDSIZE,
self.cfg.YMARGIN+y*self.cfg.GRIDSIZE-self.cfg.NUMGRID*self.cfg.GRIDSIZE],
downlen=self.cfg.NUMGRID*self.cfg.GRIDSIZE
)
self.all_gems[x].append(gem)
self.gems_group.add(gem)
# 生成完成后检测是否有三连,无则退出循环
if self.isMatch()[0] == 0:
break
self.score = 0
self.remaining_time = 300 # 5分钟倒计时

代码说明:宝石初始位置在屏幕上方,通过下落动画进入网格;使用Pygame精灵组gems_group批量管理所有宝石,简化渲染和更新。

3.3.2 水平/竖直三连检测

功能描述:遍历网格,检测是否存在三个连续相同的宝石。

Python
# modules/game.py gemGame.isMatch()
def isMatch(self):
for x in range(self.cfg.NUMGRID):
for y in range(self.cfg.NUMGRID):
# 检测水平三连(当前+右1+右2)
if x + 2 < self.cfg.NUMGRID:
if (self.getGemByPos(x, y).type ==
self.getGemByPos(x+1, y).type ==
self.getGemByPos(x+2, y).type):
return [1, x, y] # [匹配类型(1=水平), 起始x, 起始y]
# 检测竖直三连(当前+下1+下2)
if y + 2 < self.cfg.NUMGRID:
if (self.getGemByPos(x, y).type ==
self.getGemByPos(x, y+1).type ==
self.getGemByPos(x, y+2).type):
return [2, x, y] # [匹配类型(2=竖直), 起始x, 起始y]
return [0, x, y] # 无匹配

代码说明:优先检测水平三连,再检测竖直三连;返回匹配类型和起始坐标,供后续消除逻辑使用。

3.3.3 匹配宝石消除与计分

功能描述:移除匹配的宝石,更新得分。

Python
# modules/game.py gemGame.removeMatched()
def removeMatched(self, res_match):
if res_match[0] > 0:
self.generateNewGems(res_match) # 生成新宝石填充
self.score += self.reward # 累加基础分(10分/组)
return self.reward
return 0

3.3.4 宝石下落与新宝石生成

功能描述:消除后,上方宝石下落填补空缺,顶部生成新宝石。

Python
# modules/game.py gemGame.generateNewGems() 水平匹配处理
def generateNewGems(self, res_match):
if res_match[0] == 1: # 水平三连
start = res_match[2]
while start > -2:
for each in [res_match[1], res_match[1]+1, res_match[1]+2]:
gem = self.getGemByPos(*[each, start])
if start == res_match[2]:
# 移除匹配的宝石
self.gems_group.remove(gem)
self.all_gems[each][start] = None
elif start >= 0:
# 上方宝石向下移动一格
gem.target_y += self.cfg.GRIDSIZE
gem.fixed = False
gem.direction = 'down'
self.all_gems[each][start+1] = gem
else:
# 顶部生成新宝石
gem = gemSprite(
img_path=random.choice(self.gem_imgs),
size=(self.cfg.GRIDSIZE, self.cfg.GRIDSIZE),
position=[self.cfg.XMARGIN+each*self.cfg.GRIDSIZE,
self.cfg.YMARGIN-self.cfg.GRIDSIZE],
downlen=self.cfg.GRIDSIZE
)
self.gems_group.add(gem)
self.all_gems[each][start+1] = gem
start -= 1

代码说明:按列从下往上处理,先移除匹配的宝石,再将上方宝石依次下移,最后在顶部生成新宝石;竖直匹配的处理逻辑类似,只是移动距离为3格。

3.3.5 连锁消除机制

功能描述:宝石下落后自动检测新的三连,实现连续消除。

【演示见视频】

Python
# modules/game.py gemGame.start() 主循环
if overall_moving:
overall_moving = not self.dropGems(0, 0)
# 下落完成后立即检测新的匹配
if not overall_moving:
res_match = self.isMatch()
add_score = self.removeMatched(res_match)
if add_score > 0:
overall_moving = True # 有新消除,再次进入下落状态

代码说明:通过循环检测实现连锁消除,直到无新的匹配为止。

3.4 UI与实时反馈功能

3.4.1 游戏网格绘制

功能描述:绘制8×8的网格线,划分宝石区域。

image

 

Python
# modules/game.py gemGame.drawGrids()
def drawGrids(self):
for x in range(self.cfg.NUMGRID):
for y in range(self.cfg.NUMGRID):
rect = pygame.Rect(
(self.cfg.XMARGIN+x*self.cfg.GRIDSIZE,
self.cfg.YMARGIN+y*self.cfg.GRIDSIZE,
self.cfg.GRIDSIZE, self.cfg.GRIDSIZE)
)
self.drawBlock(rect, color=(0, 0, 255), size=1) # 蓝色1像素边框

3.4.2 选中宝石高亮提示

功能描述:给选中的宝石绘制紫色边框,提示当前操作对象。

image

 

Python
# modules/game.py gemGame.start() 主循环
if gem_selected_xy:
self.drawBlock(self.getGemByPos(*gem_selected_xy).rect) # 默认紫色4像素边框

3.4.3 实时分数显示

功能描述:在窗口左上角实时显示当前得分。

image

 

Python
# modules/game.py gemGame.drawScore()
def drawScore(self):
score_render = self.font.render(f'SCORE:{str(self.score)}', 1, (85, 65, 0))
rect = score_render.get_rect()
rect.left, rect.top = (10, 6) # 左上角位置
self.screen.blit(score_render, rect)

3.4.4 倒计时系统

功能描述:在窗口右上角显示剩余时间,时间结束游戏结束。

image

 

Python
# modules/game.py gemGame.showRemainingTime()
def showRemainingTime(self):
remaining_time_render = self.font.render(f'CountDown: {str(self.remaining_time)}s', 1, (85, 65, 0))
rect = remaining_time_render.get_rect()
rect.left, rect.top = (self.cfg.SCREENSIZE[0]-201, 6) # 右上角位置
self.screen.blit(remaining_time_render, rect)

# 主循环中更新时间
self.remaining_time -= (int(time.time()) - time_pre)
time_pre = int(time.time())

3.4.5 加分动画提示

功能描述:消除宝石后在屏幕中央显示红色加分提示。

image

 

Python
# modules/game.py gemGame.drawAddScore()
def drawAddScore(self, add_score):
score_render = self.font.render(f'+{str(add_score)}', 1, (255, 100, 100))
rect = score_render.get_rect()
rect.left, rect.top = (250, 250) # 屏幕中央
self.screen.blit(score_render, rect)

# 主循环中控制显示时长(10帧)
if add_score:
if add_score_showtimes == 10:
random.choice(self.sounds['match']).play()
self.drawAddScore(add_score)
add_score_showtimes -= 1
if add_score_showtimes < 1:
add_score_showtimes = 10
add_score = 0

3.5 游戏结束与重置功能

3.5.1 倒计时结束判断

Python
# modules/game.py gemGame.start() 主循环
if self.remaining_time <= 0:
return self.score # 返回最终得分,退出本轮游戏

3.5.2 游戏结束界面

功能描述:显示最终得分和操作提示(R重玩/ESC退出)。

image

 

Python
# Game15.py main()函数
while True:
score = game.start() # 游戏结束,获取最终得分
flag = False
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):
pygame.quit()
sys.exit()
elif event.type == pygame.KEYUP and event.key == pygame.K_r:
flag = True
if flag:
break
# 绘制结束界面
screen.fill((135, 206, 235)) # 天蓝色背景
text0 = f'Final score: {score}'
text1 = 'Press <R> to restart the game.'
text2 = 'Press <Esc> to quit the game.'
# 逐行绘制文字
y = 150
for idx, text in enumerate([text0, text1, text2]):
text_render = font.render(text, 1, (85, 65, 0))
rect = text_render.get_rect()
rect.left, rect.top = (212 if idx==0 else 122.5, y)
y += 100
screen.blit(text_render, rect)
pygame.display.update()

3.5.3 游戏重置与重玩

Python
# Game15.py main()函数
elif event.type == pygame.KEYUP and event.key == pygame.K_r:
game.reset() # 调用gemGame.reset()重置所有状态
break

五、典型BUG调试记录(开发中真实遇到)

BUG 1:宝石永远无法匹配,所有交换都被判定为无效

现象:无论怎么交换相邻宝石,都不会触发消除,所有交换都会自动回退。
调试过程

  1. 一开始以为是isMatch()算法错误,逐行检查匹配逻辑,未发现问题
  2. 打印每个宝石的type属性,发现输出是完整路径(如E:\pygame\resources\images\gem1.png),而非预期的gem1
  3. 定位到gemSprite类的初始化代码:

Python
# 错误代码
self.type = img_path.split('/')[-1].split('.')[0]

原因分析:Windows系统路径分隔符是\,而非/,导致split('/')无法正确分割路径,type属性变成了完整路径,自然无法匹配。
解决方案:使用os.path.basename()获取文件名,兼容所有操作系统:

Python
# 修正后代码
import os
self.type = os.path.basename(img_path).split('.')[0]

BUG 2:连锁消除时分数重复计算,一次消除加多次分

现象:触发连锁消除时,明明只消除了一组宝石,却加了20分甚至30分。
调试过程

  1. 在removeMatched()函数中打印self.score,发现每次连锁都会被调用多次
  2. 检查generateNewGems()函数,发现移除宝石时只从精灵组移除,没有将数组中的引用置为None
  3. isMatch()函数没有判断宝石是否为None,导致已经被消除的宝石还会被检测到
    原因分析:消除宝石后,数组中对应位置仍保留旧宝石的引用,isMatch()会重复检测到同一组匹配,导致多次加分。
    解决方案
  4. 在generateNewGems()中移除宝石时,立即将数组引用置为None
  5. 在isMatch()中增加空值判断:

Python
# 修正后isMatch()代码
def isMatch(self):
for x in range(self.cfg.NUMGRID):
for y in range(self.cfg.NUMGRID):
current_gem = self.getGemByPos(x, y)
if not current_gem: # 跳过空位置
continue
# 检测水平三连
if x + 2 < self.cfg.NUMGRID:
gem1 = self.getGemByPos(x+1, y)
gem2 = self.getGemByPos(x+2, y)
if gem1 and gem2 and current_gem.type == gem1.type == gem2.type:
return [1, x, y]
# 检测竖直三连
if y + 2 < self.cfg.NUMGRID:
gem1 = self.getGemByPos(x, y+1)
gem2 = self.getGemByPos(x, y+2)
if gem1 and gem2 and current_gem.type == gem1.type == gem2.type:
return [2, x, y]
return [0, x, y]

BUG 3:倒计时显示负数,游戏结束后仍显示-1s、-2s

现象:倒计时结束后,游戏不会立即退出,会继续显示负数秒数,持续1-2秒才进入结束界面。
调试过程

  1. 打印self.remaining_time,发现当时间差大于剩余时间时,会变成负数
  2. 主循环中是先更新时间,再判断是否结束,导致最后一帧会显示负数
    原因分析:时间更新是按秒计算的,当int(time.time()) - time_pre大于剩余时间时,remaining_time会变成负数,而判断结束的逻辑在更新之后。
    解决方案:在更新时间时限制最小值为0:

Python
# 修正后代码
time_diff = int(time.time()) - time_pre
self.remaining_time = max(0, self.remaining_time - time_diff)
time_pre = int(time.time())

BUG 4:快速双击鼠标导致宝石重叠或消失

现象:在宝石交换动画过程中快速双击鼠标,会导致两个宝石重叠,或者其中一个宝石从屏幕上消失。
调试过程

  1. 复现BUG后,打印self.all_gems数组,发现有的位置是None,有的位置有两个宝石引用
  2. 检查鼠标事件处理逻辑,发现即使在individual_moving状态下,仍然会响应鼠标点击
    原因分析:状态锁只在交换动画开始后设置,但鼠标事件处理没有提前判断状态,导致动画过程中可以再次点击,触发第二次交换,造成数组引用混乱。
    解决方案:在鼠标事件处理的最前面增加状态判断:

Python
# 修正后代码
elif event.type == pygame.MOUSEBUTTONUP:
# 只有在空闲状态才响应鼠标点击
if overall_moving or individual_moving or add_score:
continue
position = pygame.mouse.get_pos()
if gem_selected_xy is None:
gem_selected_xy = self.checkSelected(position)
else:
gem_selected_xy2 = self.checkSelected(position)
if gem_selected_xy2:
if self.swapGem(gem_selected_xy, gem_selected_xy2):
individual_moving = True
swap_again = False
else:
gem_selected_xy = None

六、核心算法深度解析

1. 初始防三连算法

通过“生成完整网格→检测三连→重新生成”的循环,保证开局无自动消除,时间复杂度O(n²),对于8×8网格完全满足性能要求。

2. 递归下落填充算法

采用递归遍历所有宝石,推动未固定宝石下落,直到网格全部填满,保证下落动画同步且无空白格。

3. 状态机控制算法

通过三个互斥状态标志位,完美解决动画同步问题,避免快速点击导致的逻辑混乱和程序崩溃。

七、项目亮点与特色

  1. 纯原生实现:所有逻辑基于Pygame基础API编写,无第三方框架依赖
  2. 架构规范:四层模块化设计,高内聚低耦合,易于扩展
  3. 视觉设计专业:7种差异化3D感宝石素材,统一风格,辨识度高
  4. 体验完整:包含动画、音效、反馈等所有细节,接近商业消除游戏
  5. 鲁棒性强:解决了跨平台路径、状态同步、空指针等多个常见BUG
  6. 代码规范:严格遵循PEP8,注释完整,可读性强

八、项目不足与可扩展方向

1. 现有不足

  • 仅支持三连消除,无四连/五连及特殊宝石
  • 单一关卡,无难度递增
  • 无存档与排行榜功能
  • 消除特效较简单

2. 可扩展方向

  1. 新增特殊宝石:四连生成炸弹,五连生成彩虹宝石
  2. 关卡系统:随关卡提升减少倒计时、增加宝石类型
  3. 存档功能:使用JSON保存历史最高分
  4. 道具系统:增加刷新、提示、加时道具
  5. 特效优化:加入消除爆炸、宝石闪烁效果
  6. 课程设计总结与结课感想

  最初选择 王老师的python课程原因有二,一是自己本身从小学就有一定的编程基础,想去进一步扩大自己的知识面,想去了解一下这个被运用广泛的语言 ,二是学长学姐的强烈安利(王老师给分高)。然而在正式开始上课之后,我便觉得我来到这节课来对了,而且不仅仅是因为这两个原因。开课时便被王老师平易近人的引入所吸引,更被王老师强大厚实的专业背景所折服,之后上课的手势签到更是让我 有了每周来上python课的期待与冲动。
  再一个让我除了课程内容外让我受益匪浅的便是单词打卡,最初仅仅是为了那两分去坚持打卡,但渐渐半个月一个月过去打卡便成了习惯,甚至和班里的同学组成了百词斩的同桌,每日互相提醒监督打卡,最后结课时也是拿上了2两分满分,即使结课了,我也觉得我会把这个习惯坚持下去,每天进步一点点。
  本次作业设计历时一周,独立完成了从需求分析、图形设计、架构设计到编码调试的全流程。通过开发宝石消除游戏,我不仅熟练掌握了Pygame的使用,更深刻理解了面向对象编程和模块化设计的价值。
  最具挑战性的是调试上述四个BUG,尤其是路径分隔符和数组引用的问题,花了整整两个下午才找到根源。这个过程让我明白:编程的核心不是语法,而是逻辑思维和解决问题的能力;细节决定成败,一个小小的路径分割符就能让整个游戏无法运行。
  在课程中也深刻体会到:不要变成AI的提线木偶的重要性。我们使用AI 只是个工具,但万万不能让AI帮我们做了决策,要把强大的工具掌握在自己的手中,万不可丢了自己的脑子。同时建议课程可以设计一些课后内容总结类的作业,让知识点让我们学生自己串联成线,下一节课前由老师斧正。
  虽然项目还有很多可以优化的地方,但它是我第一个完整的图形化项目,让我从“会写代码”成长为“能做项目”。这次经历为我今后的编程学习打下了坚实基础,也让我对软件开发产生了更浓厚的兴趣。
  感谢王老师一学期以来的热血与少年感,让我不论在python的学习还是为人处世的方面都受益匪浅。
  最后祝王老师工作顺利,身体健康!

posted @ 2026-05-31 11:28  UIUIED  阅读(40)  评论(0)    收藏  举报