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

Pygame战舰游戏报错:预期str/bytes类型却得到None,窗口无响应

Pygame战舰游戏:字体类型错误与窗口无响应问题解决

一、字体类型错误解决

你遇到的Expected type 'str | bytes | Iterable[str | bytes]', got 'None'错误,是因为pygame.font.SysFont()的第一个参数要求传入字体名称(字符串/字节串)或字体名称列表,直接传None不符合类型规范,且部分环境下可能无法正确加载默认字体。

修复方案

有两种可行的修改方式:

  1. 改用pygame.font.Font类:Font类允许传入None来加载Pygame默认字体,完全符合类型要求
  2. 指定具体字体名称:传入系统中存在的字体名称(如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,提问作者שיילי פרנקו

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:05:34