Pygame开发Wordle游戏遇视频系统未初始化错误求助
解决Pygame "video system not initialized"错误及游戏卡顿问题
核心问题分析
- 视频系统提前关闭:代码中处理
QUIT事件时直接调用pygame.quit(),但后续仍执行pygame.display.update()或pygame.event.get(),此时视频系统已关闭,触发报错。 - 递归重启游戏风险:通过
playgame()递归开启新游戏会导致栈溢出,逻辑易混乱。 - 事件处理逻辑漏洞:嵌套循环的事件处理重复且存在顺序错误(比如删除、回车的判断时机),导致游戏卡在首页。
修复后的代码及关键修改点
import pygame # 假设已定义Word、Box类及全局变量(screen、header、font_*等) def playgame(): global t_score global play # 确保游戏启动时视频系统已初始化 if not pygame.get_init(): pygame.init() # 重新创建显示窗口(根据你的分辨率调整) screen = pygame.display.set_mode((640, 720)) pygame.display.set_caption("Wordle Clone") screen.fill("White") row = [] newgame = getgame() row.append(Box(100,100,120,space_)) row.append(Box(100,100,260,space_)) row.append(Box(100,100,400,space_)) row[0].makerow() row[1].makerow() row[2].makerow() meaning_text = font_meaning.render(f'Meaning: {newgame.meaning}',True,"Black") meaning_rec = meaning_text.get_rect(center=(325,576)) screen.blit(meaning_text,meaning_rec) screen.blit(keyboard,keyboard_rec) score_text = font_score.render(f'Total score: {t_score}',False,"Black") score_text_rec = score_text.get_rect(center=(35,19)) screen.blit(score_text,score_text_rec) pygame.display.update() win = 0 score = 8 for attempts in range (0,3): word_guess = [" "]*5 for letter_count in range (0,5): letter = ' ' run = True clock = pygame.time.Clock() while run: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 直接终止程序,避免后续操作报错 if event.type == pygame.MOUSEBUTTONDOWN: letter = ' ' # 用elif避免多次赋值 if(a_rec.collidepoint(pygame.mouse.get_pos())): letter = 'A' elif(b_rec.collidepoint(pygame.mouse.get_pos())): letter = 'B' elif(c_rec.collidepoint(pygame.mouse.get_pos())): letter = 'C' elif(d_rec.collidepoint(pygame.mouse.get_pos())): letter = 'D' elif(e_rec.collidepoint(pygame.mouse.get_pos())): letter = 'E' elif(f_rec.collidepoint(pygame.mouse.get_pos())): letter = 'F' elif(g_rec.collidepoint(pygame.mouse.get_pos())): letter = 'G' elif(h_rec.collidepoint(pygame.mouse.get_pos())): letter = 'H' elif(i_rec.collidepoint(pygame.mouse.get_pos())): letter = 'I' elif(j_rec.collidepoint(pygame.mouse.get_pos())): letter = 'J' elif(k_rec.collidepoint(pygame.mouse.get_pos())): letter = 'K' elif(l_rec.collidepoint(pygame.mouse.get_pos())): letter = 'L' elif(m_rec.collidepoint(pygame.mouse.get_pos())): letter = 'M' elif(n_rec.collidepoint(pygame.mouse.get_pos())): letter = 'N' elif(o_rec.collidepoint(pygame.mouse.get_pos())): letter = 'O' elif(p_rec.collidepoint(pygame.mouse.get_pos())): letter = 'P' elif(q_rec.collidepoint(pygame.mouse.get_pos())): letter = 'Q' elif(r_rec.collidepoint(pygame.mouse.get_pos())): letter = 'R' elif(s_rec.collidepoint(pygame.mouse.get_pos())): letter = 'S' elif(t_rec.collidepoint(pygame.mouse.get_pos())): letter = 'T' elif(u_rec.collidepoint(pygame.mouse.get_pos())): letter = 'U' elif(v_rec.collidepoint(pygame.mouse.get_pos())): letter = 'V' elif(w_rec.collidepoint(pygame.mouse.get_pos())): letter = 'W' elif(x_rec.collidepoint(pygame.mouse.get_pos())): letter = 'X' elif(y_rec.collidepoint(pygame.mouse.get_pos())): letter = 'Y' elif(z_rec.collidepoint(pygame.mouse.get_pos())): letter = 'Z' # 优先处理删除键 if delete_kb_rec.collidepoint(pygame.mouse.get_pos()): letter = " " row[attempts].surface_.fill("White") screen.blit(row[attempts].surface_,row[attempts].box_surface_rect[letter_count]) pygame.draw.rect(screen,"Black",row[attempts].box_surface_rect[letter_count],1) pygame.display.update() continue # 显示选中的字母 if letter != " ": letter_print = font_letter.render(f'{letter}',True,"Black") letter_rec = letter_print.get_rect(center=(row[attempts].box_surface_rect[letter_count].center)) screen.blit(letter_print,letter_rec) pygame.display.update() # 处理回车键,判断字母正确性 if enter_kb_rec.collidepoint(pygame.mouse.get_pos()) and letter != " ": if letter == newgame.word[letter_count]: row[attempts].surface_.fill("Green") elif letter in newgame.word: row[attempts].surface_.fill("Orange") else: row[attempts].surface_.fill("Red") screen.blit(row[attempts].surface_,row[attempts].box_surface_rect[letter_count]) pygame.draw.rect(screen,"Black",row[attempts].box_surface_rect[letter_count],1) screen.blit(letter_print,letter_rec) pygame.display.update() run = False clock.tick(60) # 控制帧率,降低CPU占用 word_guess[letter_count] = letter guess = ''.join(word_guess) if guess == newgame.word: win = 1 t_score += score break else: score -= 1 # 显示结束提示 congrats_text = font_smaller.render(f'Word was: {newgame.word} Press Enter to start new game',False,"Black") congrats_rect = congrats_text.get_rect(center=(320, 690)) screen.blit(congrats_text,congrats_rect) pygame.display.update() # 等待用户操作 waiting = True clock = pygame.time.Clock() while waiting: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_RETURN: waiting = False playgame() # 重启游戏(若担心栈溢出,可改用外部主循环控制) clock.tick(60)
关键修改说明
- 终止后续代码执行:处理
QUIT事件时,调用pygame.quit()后直接exit(),避免视频系统关闭后仍执行相关操作。 - 优化事件判断逻辑:将字母判断改为
elif避免重复赋值,调整删除、输入、回车的判断顺序,修复逻辑漏洞。 - 增加帧率控制:添加
clock.tick(60)降低CPU占用,解决游戏卡顿问题。 - 修复提示文本位置:用
get_rect(center)替代固定坐标,适配不同窗口分辨率。 - 避免递归栈溢出:若游戏重启次数较多,建议改用外部主循环控制游戏启停(比如返回布尔值标记是否重启)。
内容的提问来源于stack exchange,提问作者Anttwone Marsh
相关产品推荐
相关产品推荐

