Pygame战舰游戏报错:预期str/bytes类型却得到None,窗口无响应
Pygame战舰游戏:字体类型错误与窗口无响应问题解决
一、字体类型错误解决
你遇到的Expected type 'str | bytes | Iterable[str | bytes]', got 'None'错误,是因为pygame.font.SysFont()的第一个参数要求传入字体名称(字符串/字节串)或字体名称列表,直接传None不符合类型规范,且部分环境下可能无法正确加载默认字体。
修复方案
有两种可行的修改方式:
- 改用
pygame.font.Font类:Font类允许传入None来加载Pygame默认字体,完全符合类型要求 - 指定具体字体名称:传入系统中存在的字体名称(如
sans-serif),避免类型检查报错
修改后的draw_board函数示例:
def draw_board(board, screen): # 方案1:使用Font类加载默认字体 font = pygame.font.Font(None, 30) # 方案2:指定具体字体名称 # font = pygame.font.SysFont("sans-serif", 30) for row in range(10): for col in range(10): text = font.render(board[row][col], True, (255, 255, 255)) if text is not None: x = col * 40 + 40 y = row * 40 + 100 screen.blit(text, (x, y))
二、窗口无响应问题解决
窗口打开后无响应的核心原因是get_ship_location函数中的input()会阻塞Pygame主线程,导致窗口无法处理刷新、关闭等事件,进而卡死。
修复方案
必须用Pygame的事件循环处理用户输入,不能用命令行的input()阻塞主线程,以下是两种实现思路:
1. 完善主循环的事件处理
确保主程序中存在事件循环,让窗口能正常响应系统事件:
# 补充主程序示例(你缺失的核心部分) pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("战舰游戏") font = pygame.font.Font(None, 30) running = True while running: # 必须保留事件循环,否则窗口会无响应 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 可在此添加键盘输入处理逻辑,替代input() # 绘制游戏界面 screen.fill((0, 0, 0)) draw_board(guess_patterns, screen) pygame.display.flip() pygame.quit()
2. 用Pygame事件实现文本输入
替代input()的命令行输入,改用Pygame的键盘事件收集用户输入,示例如下:
def get_ship_location_pygame(screen, font): input_text = "" active = True while active: 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: active = False elif event.key == pygame.K_BACKSPACE: input_text = input_text[:-1] else: input_text += event.unicode.upper() # 绘制输入提示与用户输入内容 screen.fill((0, 0, 0)) prompt = font.render("输入坐标(如A1):", True, (255, 255, 255)) screen.blit(prompt, (50, 50)) text_surface = font.render(input_text, True, (255, 255, 255)) screen.blit(text_surface, (50, 100)) pygame.display.flip() # 解析输入的坐标(可根据需求完善校验逻辑) if len(input_text) >= 2: col_char = input_text[0] row_str = input_text[1:] if col_char in letter_num and row_str.isdigit() and 1 <= int(row_str) <= 10: return int(row_str) - 1, letter_num[col_char] # 输入无效时重新获取 return get_ship_location_pygame(screen, font)
在主循环中调用这个函数,即可实现不阻塞窗口的坐标输入。
内容的提问来源于stack exchange,提问作者שיילי פרנקו
相关产品推荐
相关产品推荐

