You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame开发Wordle游戏遇视频系统未初始化错误求助

解决Pygame "video system not initialized"错误及游戏卡顿问题

核心问题分析

  1. 视频系统提前关闭:代码中处理QUIT事件时直接调用pygame.quit(),但后续仍执行pygame.display.update()或pygame.event.get(),此时视频系统已关闭,触发报错。
  2. 递归重启游戏风险:通过playgame()递归开启新游戏会导致栈溢出,逻辑易混乱。
  3. 事件处理逻辑漏洞:嵌套循环的事件处理重复且存在顺序错误(比如删除、回车的判断时机),导致游戏卡在首页。

修复后的代码及关键修改点

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:14:59