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

Pygame开发Wordle游戏运行时屏幕黑屏问题求助

Pygame Wordle 黑屏问题解决

我正在用Pygame开发一款Wordle游戏,但运行时屏幕始终显示黑屏,尽管我尝试将背景填充为白色。我刚接触Pygame,无法判断是否存在错误,且程序未提示任何报错。我查阅过相关帖子但未找到相似问题,预期能看到30个可填充字母的白色方框,实际却显示黑屏。

用户提供的原始代码:

import pygame
import os
import json

pygame.init()
WIDTH, HEIGHT = 560, 700


BACKGROUND = pygame.display.set_mode((WIDTH,HEIGHT))
FPS = 60
pygame.display.set_caption("Wordle")

#COLORS
WHITE = (255,255,255)
BLACK = (0,0,0)
GREY = (150,150,150)
YELLOW = (255,255,0)
GREEN = (0,255,0)
BACKGROUND.fill(WHITE)

#FONTS
FONT = pygame.font.SysFont("arial", 40)

class VARS:
    LETTER = 0
    ROW = 0

WORD = ["h","e","l","l","o"]
grid = [
    ["","","","",""],
    ["","","","",""],
    ["","","","",""],
    ["","","","",""],
    ["","","","",""],
    ["","","","",""]
]

AlphaB = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]

def ASSIGN(word):
    a = 0
    for i in word:
        if i in WORD:
            if WORD[a] == word[a]:
                grid[VARS.ROW][a]+="g"
            else:
                grid[VARS.ROW][a]+="y"
        a+=1
    return grid

def LETTERS(key):
    if key in AlphaB:
        if VARS.LETTER<5:
            grid[VARS.ROW][VARS.LETTER] = key
            VARS.LETTER+=1
            return VARS.LETTER
    elif key == "backspace":
        if VARS.LETTER > 0:
            VARS.LETTER-=1
            grid[VARS.ROW][VARS.LETTER] = ""
            return VARS.LETTER, grid
    else:
        return


def UPDATE():
    BACKGROUND.fill(WHITE)
    z = 0
    w = 0
    for y in grid:
        w = 0
        for x in y:
            if len(x) == 0:
                pygame.draw.rect(BACKGROUND, BLACK, pygame.Rect(30+w*126, 30+z*126, 96, 96),2)
            elif len(x) == 1:
                pygame.draw.rect(BACKGROUND, BLACK, pygame.Rect(30+w*126, 30+z*126, 96, 96),2)
                letter = FONT.render(x, True, BLACK)
                letterRect = letter.get_rect()
                letterRect.center = (78+w*126, 78+z*126)
                BACKGROUND.blit(letter,letterRect)
            elif len(x) == 2:
                if x[1] == "g":
                    pygame.draw.rect(BACKGROUND, GREEN, pygame.Rect(30+w*126, 30+z*126, 96, 96))
                    letter = FONT.render(x[0], True, WHITE)
                    letterRect = letter.get_rect()
                    letterRect.center = (78+w*126, 78+z*126)
                    BACKGROUND.blit(letter,letterRect)
                elif x[1] == "y":
                    pygame.draw.rect(BACKGROUND, YELLOW, pygame.Rect(30+w*126, 30+z*126, 96, 96))
                    letter = FONT.render(x[0], True, WHITE)
                    letterRect = letter.get_rect()
                    letterRect.center = (78+w*126, 78+z*126)
                    BACKGROUND.blit(letter,letterRect)
                elif x[1] == "r":
                    pygame.draw.rect(BACKGROUND, GREY, pygame.Rect(30+w*126, 30+z*126, 96, 96))
                    letter = FONT.render(x[0], True, WHITE)
                    letterRect = letter.get_rect()
                    letterRect.center = (78+w*126, 78+z*126)
                    BACKGROUND.blit(letter,letterRect)
            w += 1
        z+=1
def main():
    Running = True
    clock = pygame.time.Clock()
    while Running:
        clock.tick(FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                Running = False
                pygame.quit()
            if event.type == pygame.KEYUP:
                LETTERS(pygame.key.name(event.key))

        UPDATE()
if __name__ == "__main__":
    main()

问题根源

Pygame的渲染逻辑是先在内存表面绘制内容,必须调用pygame.display.update()或pygame.display.flip()才能将内存中的画面刷新到实际屏幕上。你的代码里已经在UPDATE()函数中完成了背景填充和网格绘制,但从未执行屏幕刷新操作,所以一直显示初始的黑屏。

修复步骤

  1. 在main()函数的主循环末尾,添加pygame.display.update(),确保每次循环都刷新屏幕
  2. 补充回车事件处理,调用ASSIGN函数提交当前行的猜测(否则无法触发颜色反馈)
  3. 优化ASSIGN函数的字母匹配逻辑,避免重复字母判断错误

修改后的完整代码

import pygame
import os
import json

pygame.init()
WIDTH, HEIGHT = 560, 700

BACKGROUND = pygame.display.set_mode((WIDTH,HEIGHT))
FPS = 60
pygame.display.set_caption("Wordle")

#COLORS
WHITE = (255,255,255)
BLACK = (0,0,0)
GREY = (150,150,150)
YELLOW = (255,255,0)
GREEN = (0,255,0)

#FONTS
FONT = pygame.font.SysFont("arial", 40)

class VARS:
    LETTER = 0
    ROW = 0

WORD = ["h","e","l","l","o"]
grid = [
    ["","","","",""],
    ["","","","",""],
    ["","","","",""],
    ["","","","",""],
    ["","","","",""],
    ["","","","",""]
]

AlphaB = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]

def ASSIGN(word):
    temp_word = WORD.copy()
    # 先标记绿色(完全匹配)的字母
    for i in range(len(word)):
        if word[i] == temp_word[i]:
            grid[VARS.ROW][i] += "g"
            temp_word[i] = None  # 标记已匹配的字母
    # 再标记黄色(存在但位置不对)的字母
    for i in range(len(word)):
        if len(grid[VARS.ROW][i]) == 1 and word[i] in temp_word:
            grid[VARS.ROW][i] += "y"
            temp_word[temp_word.index(word[i])] = None
    # 剩余字母标记为灰色
    for i in range(len(word)):
        if len(grid[VARS.ROW][i]) == 1:
            grid[VARS.ROW][i] += "r"
    # 提交后切换到下一行
    if VARS.ROW < 5:
        VARS.ROW += 1
        VARS.LETTER = 0
    return grid

def LETTERS(key):
    if key in AlphaB:
        if VARS.LETTER < 5:
            grid[VARS.ROW][VARS.LETTER] = key
            VARS.LETTER += 1
    elif key == "backspace":
        if VARS.LETTER > 0:
            VARS.LETTER -= 1
            grid[VARS.ROW][VARS.LETTER] = ""
    elif key == "return":
        if VARS.LETTER == 5:
            ASSIGN(grid[VARS.ROW])

def UPDATE():
    BACKGROUND.fill(WHITE)
    z = 0
    for row in grid:
        w = 0
        for cell in row:
            rect = pygame.Rect(30 + w*126, 30 + z*126, 96, 96)
            if len(cell) == 0:
                pygame.draw.rect(BACKGROUND, BLACK, rect, 2)
            elif len(cell) == 1:
                pygame.draw.rect(BACKGROUND, BLACK, rect, 2)
                letter = FONT.render(cell, True, BLACK)
                letter_rect = letter.get_rect(center=rect.center)
                BACKGROUND.blit(letter, letter_rect)
            elif len(cell) == 2:
                # 根据标记绘制背景色
                if cell[1] == "g":
                    pygame.draw.rect(BACKGROUND, GREEN, rect)
                elif cell[1] == "y":
                    pygame.draw.rect(BACKGROUND, YELLOW, rect)
                elif cell[1] == "r":
                    pygame.draw.rect(BACKGROUND, GREY, rect)
                # 绘制白色字母
                letter = FONT.render(cell[0], True, WHITE)
                letter_rect = letter.get_rect(center=rect.center)
                BACKGROUND.blit(letter, letter_rect)
            w += 1
        z += 1

def main():
    Running = True
    clock = pygame.time.Clock()
    while Running:
        clock.tick(FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                Running = False
                pygame.quit()
            if event.type == pygame.KEYUP:
                LETTERS(pygame.key.name(event.key))

        UPDATE()
        # 关键:刷新屏幕,将绘制内容显示到窗口
        pygame.display.update()

if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者Phat Duck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:16:10