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()函数中完成了背景填充和网格绘制,但从未执行屏幕刷新操作,所以一直显示初始的黑屏。
修复步骤
- 在
main()函数的主循环末尾,添加pygame.display.update(),确保每次循环都刷新屏幕 - 补充回车事件处理,调用
ASSIGN函数提交当前行的猜测(否则无法触发颜色反馈) - 优化
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
相关产品推荐
相关产品推荐

