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水晶质感,色彩鲜明且辨识度高,避免因视觉相似导致玩家误操作:
|
宝石编号
|
形状
|
主色调
|
设计特点
|
|
gem1![gem1]()
|
正方形
|
深蓝色
|
双层边框+高光点,立体感强
|
|
gem2![gem2]()
|
圆形
|
翠绿色
|
同心圆纹理,模拟翡翠质感
|
|
gem3![gem3]()
|
菱形
|
橙红色
|
多面切割,模拟红宝石光泽
|
|
gem4![gem4]()
|
五角星
|
金黄色
|
渐变金属质感,视觉冲击力强
|
|
gem5![gem5]()
|
正六边形
|
玫红色
|
棱角分明,模拟紫水晶
|
|
gem6![gem6]()
|
回形正方形
|
银黑色
|
金属拉丝效果,科技感强
|
|
gem7![gem7]()
|
正三角形
|
银白色
|
多层嵌套,模拟钻石切割
|
3.2 视觉设计原则
- 尺寸统一:所有宝石均为64×64像素,与cfg.py中GRIDSIZE=64严格对应, 保证网格对齐
- 色彩区分:7种宝石采用完全不同的主色调,避免色弱玩家无法区分
- 风格统一:全部采用3D水晶+高光效果,整体视觉协调
- 透明背景:所有图片均为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:宝石永远无法匹配,所有交换都被判定为无效
现象:无论怎么交换相邻宝石,都不会触发消除,所有交换都会自动回退。
调试过程:
- 一开始以为是isMatch()算法错误,逐行检查匹配逻辑,未发现问题
- 打印每个宝石的type属性,发现输出是完整路径(如E:\pygame\resources\images\gem1.png),而非预期的gem1
- 定位到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分。
调试过程:
- 在removeMatched()函数中打印self.score,发现每次连锁都会被调用多次
- 检查generateNewGems()函数,发现移除宝石时只从精灵组移除,没有将数组中的引用置为None
- isMatch()函数没有判断宝石是否为None,导致已经被消除的宝石还会被检测到
原因分析:消除宝石后,数组中对应位置仍保留旧宝石的引用,isMatch()会重复检测到同一组匹配,导致多次加分。
解决方案:
- 在generateNewGems()中移除宝石时,立即将数组引用置为None
- 在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秒才进入结束界面。
调试过程:
- 打印self.remaining_time,发现当时间差大于剩余时间时,会变成负数
- 主循环中是先更新时间,再判断是否结束,导致最后一帧会显示负数
原因分析:时间更新是按秒计算的,当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:快速双击鼠标导致宝石重叠或消失
现象:在宝石交换动画过程中快速双击鼠标,会导致两个宝石重叠,或者其中一个宝石从屏幕上消失。
调试过程:
- 复现BUG后,打印self.all_gems数组,发现有的位置是None,有的位置有两个宝石引用
- 检查鼠标事件处理逻辑,发现即使在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. 状态机控制算法
通过三个互斥状态标志位,完美解决动画同步问题,避免快速点击导致的逻辑混乱和程序崩溃。
七、项目亮点与特色
- 纯原生实现:所有逻辑基于Pygame基础API编写,无第三方框架依赖
- 架构规范:四层模块化设计,高内聚低耦合,易于扩展
- 视觉设计专业:7种差异化3D感宝石素材,统一风格,辨识度高
- 体验完整:包含动画、音效、反馈等所有细节,接近商业消除游戏
- 鲁棒性强:解决了跨平台路径、状态同步、空指针等多个常见BUG
- 代码规范:严格遵循PEP8,注释完整,可读性强
八、项目不足与可扩展方向
1. 现有不足
- 仅支持三连消除,无四连/五连及特殊宝石
- 单一关卡,无难度递增
- 无存档与排行榜功能
- 消除特效较简单
2. 可扩展方向
- 新增特殊宝石:四连生成炸弹,五连生成彩虹宝石
- 关卡系统:随关卡提升减少倒计时、增加宝石类型
- 存档功能:使用JSON保存历史最高分
- 道具系统:增加刷新、提示、加时道具
- 特效优化:加入消除爆炸、宝石闪烁效果
- 课程设计总结与结课感想
最初选择 王老师的python课程原因有二,一是自己本身从小学就有一定的编程基础,想去进一步扩大自己的知识面,想去了解一下这个被运用广泛的语言 ,二是学长学姐的强烈安利(王老师给分高)。然而在正式开始上课之后,我便觉得我来到这节课来对了,而且不仅仅是因为这两个原因。开课时便被王老师平易近人的引入所吸引,更被王老师强大厚实的专业背景所折服,之后上课的手势签到更是让我 有了每周来上python课的期待与冲动。
再一个让我除了课程内容外让我受益匪浅的便是单词打卡,最初仅仅是为了那两分去坚持打卡,但渐渐半个月一个月过去打卡便成了习惯,甚至和班里的同学组成了百词斩的同桌,每日互相提醒监督打卡,最后结课时也是拿上了2两分满分,即使结课了,我也觉得我会把这个习惯坚持下去,每天进步一点点。
本次作业设计历时一周,独立完成了从需求分析、图形设计、架构设计到编码调试的全流程。通过开发宝石消除游戏,我不仅熟练掌握了Pygame的使用,更深刻理解了面向对象编程和模块化设计的价值。
最具挑战性的是调试上述四个BUG,尤其是路径分隔符和数组引用的问题,花了整整两个下午才找到根源。这个过程让我明白:编程的核心不是语法,而是逻辑思维和解决问题的能力;细节决定成败,一个小小的路径分割符就能让整个游戏无法运行。
在课程中也深刻体会到:不要变成AI的提线木偶的重要性。我们使用AI 只是个工具,但万万不能让AI帮我们做了决策,要把强大的工具掌握在自己的手中,万不可丢了自己的脑子。同时建议课程可以设计一些课后内容总结类的作业,让知识点让我们学生自己串联成线,下一节课前由老师斧正。
虽然项目还有很多可以优化的地方,但它是我第一个完整的图形化项目,让我从“会写代码”成长为“能做项目”。这次经历为我今后的编程学习打下了坚实基础,也让我对软件开发产生了更浓厚的兴趣。
感谢王老师一学期以来的热血与少年感,让我不论在python的学习还是为人处世的方面都受益匪浅。
最后祝王老师工作顺利,身体健康!