Pygame俄罗斯方块双击运行py文件仅显开始菜单后无报错闪退
故障原因
- 核心触发点:双击运行py文件时,Python的默认工作目录是你执行双击操作所在的文件夹(如果py文件放桌面就是桌面路径),不是py文件自身存放的目录。程序进入主游戏逻辑第一行就调用
max_score()读取同目录下的scores.txt,如果对应路径下没有这个文件,会直接抛出文件不存在的错误,程序瞬间退出。双击运行时控制台窗口会随程序同步关闭,你看不到任何报错。而Sublime运行脚本时会自动把py文件所在目录设为工作目录,能正常找到分数文件,所以全程运行无异常。 - 附带代码逻辑问题:
- 游戏结束分支里
update_score(score)写在了return True之后,属于永远不会执行的死代码,对局结束后最高分不会被保存。 - 难度递增逻辑写错变量,原本应该调整下落速度
fall_speed的判断,错写成了修改level_time,玩多久下落速度都不会提升。 - 代码里重复写了两次
pygame.init(),属于冗余代码,保留全局一次初始化即可。 - 没有做分数文件的存在性判断,就算在正确目录下运行,第一次启动没有
scores.txt也会直接报错闪退。
- 游戏结束分支里
修复方案
- 首先在文件开头导入模块的部分,新增
os模块导入,加固定路径逻辑,保证程序不管从什么位置启动,都读取py文件同目录下的分数文件:
import os import pygame import sys import random # 固定取当前py文件所在目录为基准路径 BASE_PATH = os.path.dirname(os.path.abspath(__file__)) SCORE_FILE = os.path.join(BASE_PATH, 'scores.txt') # 全局只保留这一次pygame初始化即可,删掉函数中间多余的pygame.init() pygame.init() pygame.font.init()
- 修改分数读写函数,增加文件不存在时的自动创建逻辑,替换所有硬编码的
'scores.txt'为刚才定义的SCORE_FILE:
def max_score(): # 首次运行没有分数文件时自动创建,初始最高分0 if not os.path.exists(SCORE_FILE): with open(SCORE_FILE, 'w') as f: f.write('0') with open(SCORE_FILE, 'r') as f: score = f.readlines()[0].strip() return score def update_score(nscore): score = max_score() with open(SCORE_FILE, 'w') as f: if int(score) > nscore: f.write(str(score)) else: f.write(str(nscore))
- 修复游戏结束分支的代码顺序,把分数保存逻辑移到return之前:
if check_lost(locked_positions): draw_text_middle(win, "YOU LOST!", 80, (255,255,255)) pygame.display.update() pygame.time.delay(1500) update_score(score) # 保存分数要放在return前面才会执行 return True
- 修复难度递增的变量错误:
if level_time/1000 > 5: level_time = 0 if fall_speed > 0.12: # 原来错写为level_time,改为调整下落速度 fall_speed -= 0.005
- 删除代码里
valid_space、get_shape函数前多余的两次pygame.init()调用,只保留全局的一次初始化即可。
验证方式
修复完成后,不管是在编辑器里运行,还是直接双击py文件,按任意键都可以正常进入主游戏界面,对局结束后最高分会自动保存,不会出现无理由闪退的问题。
内容的提问来源于stack exchange,提问作者SLC08
相关产品推荐
相关产品推荐

