窗口无响应,关闭失败,报video system not initialized

这篇博客介绍了在使用Pygame创建主屏幕后遇到窗口无响应的问题及其解决方案。通过在while循环中监听并处理pygame.QUIT事件,可以避免窗口无响应。然而,仅使用pygame.quit()关闭程序会导致程序仍在后台运行,需要额外调用sys.exit()确保程序完全退出。正确代码示例展示了如何处理这两个问题。

用pygame生成主屏幕后,会产生无响应。如下图:
在这里插入图片描述正确做法后面必须写以下代码,否则界面会一直循环,导致无响应

    # 初始函数,使用 pygame 的第一步;
    pygame.init()  
    # 生成主屏幕
    screen = pygame.display.set_mode((600, 500), 0, 32)  
    # 设置标题
    pygame.display.set_caption('Hello Pygame')
    # 窗口无响应是因为没有任何注册在窗口上的事件
    # 为当前窗口增加事件
    # 利用pygame注册事件,其返回值是一个列表,
    # 存放当前注册时获取的所有事件
    while True: 
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()

到这一步后,关闭会报错,如下图:在这里插入图片描述
因此后面还得加上sys.exit(),才能正常退出

    # 初始函数,使用 pygame 的第一步;
    pygame.init()  
    # 生成主屏幕
    screen = pygame.display.set_mode((600, 500), 0, 32)  
    # 设置标题
    pygame.display.set_caption('Hello Pygame')
    # 窗口无响应是因为没有任何注册在窗口上的事件
    # 为当前窗口增加事件
    # 利用pygame注册事件,其返回值是一个列表,
    # 存放当前注册时获取的所有事件
    while True:  
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()  # 如果没有sys.exit()系统还会运行下去,但是pygame已经卸载了。
import pygame import random import sys # 初始化pygame pygame.init() # 游戏配置 WIDTH, HEIGHT = 800, 600 # 窗口大小 BLOCK_SIZE = 20 # 蛇身和食物的方块大小 SPEED = 15 # 游戏速度 # 颜色定义(RGB) BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) # 食物颜色 GREEN = (0, 255, 0) # 蛇身颜色 BLUE = (0, 0, 255) # 蛇头颜色 # 创建窗口 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("经典贪吃蛇游戏") # 时钟(控制游戏速度) clock = pygame.time.Clock() # 字体(显示分数和游戏结束信息) font = pygame.font.SysFont(None, 55) def draw_snake(snake): """绘制贪吃蛇""" for block in snake[:-1]: pygame.draw.rect(screen, GREEN, (block[0], block[1], BLOCK_SIZE, BLOCK_SIZE)) # 蛇头用不同颜色区分 pygame.draw.rect(screen, BLUE, (snake[-1][0], snake[-1][1], BLOCK_SIZE, BLOCK_SIZE)) def draw_food(food): """绘制食物""" pygame.draw.rect(screen, RED, (food[0], food[1], BLOCK_SIZE, BLOCK_SIZE)) def show_score(score): """显示分数""" text = font.render(f"分数: {score}", True, WHITE) screen.blit(text, (10, 10)) def game_over(score): """游戏结束界面""" screen.fill(BLACK) text1 = font.render(f"游戏结束!最终分数: {score}", True, RED) text2 = font.render("按 Q 退出 | 按 R 重新开始", True, WHITE) screen.blit(text1, (WIDTH//6, HEIGHT//3)) screen.blit(text2, (WIDTH//8, HEIGHT//2)) pygame.display.update() # 游戏结束后的操作 while True: for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: # 退出游戏 pygame.quit() sys.exit() if event.key == pygame.K_r: # 重新开始 main() def main(): """游戏主函数""" # 蛇的初始状态(列表存储每个方块的坐标,最后一个元素是蛇头) snake = [ [WIDTH//2, HEIGHT//2], [WIDTH//2 - BLOCK_SIZE, HEIGHT//2], [WIDTH//2 - 2*BLOCK_SIZE, HEIGHT//2] ] direction = "RIGHT" # 初始移动方向 next_direction = direction # 缓冲方向(防止快速转向) # 食物初始位置(随机生成,与蛇身不重叠) def generate_food(): while True: food_x = random.randint(0, (WIDTH - BLOCK_SIZE) // BLOCK_SIZE) * BLOCK_SIZE food_y = random.randint(0, (HEIGHT - BLOCK_SIZE) // BLOCK_SIZE) * BLOCK_SIZE food = [food_x, food_y] if food not in snake: return food food = generate_food() score = 0 # 初始分数 while True: # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: # 关闭窗口 pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: # 键盘控制方向 if event.key == pygame.K_UP and direction != "DOWN": next_direction = "UP" elif event.key == pygame.K_DOWN and direction != "UP": next_direction = "DOWN" elif event.key == pygame.K_LEFT and direction != "RIGHT": next_direction = "LEFT" elif event.key == pygame.K_RIGHT and direction != "LEFT": next_direction = "RIGHT" # 更新移动方向 direction = next_direction # 计算蛇头新位置 head_x, head_y = snake[-1] if direction == "UP": head_y -= BLOCK_SIZE elif direction == "DOWN": head_y += BLOCK_SIZE elif direction == "LEFT": head_x -= BLOCK_SIZE elif direction == "RIGHT": head_x += BLOCK_SIZE # 添加新蛇头 snake.append([head_x, head_y]) # 碰撞检测 # 1. 撞墙 if (head_x < 0 or head_x >= WIDTH or head_y < 0 or head_y >= HEIGHT): game_over(score) # 2. 撞自己 if [head_x, head_y] in snake[:-1]: game_over(score) # 吃食物判断 if [head_x, head_y] == food: score += 10 # 分数增加 food = generate_food() # 重新生成食物 else: snake.pop(0) # 没吃到食物,删除蛇尾(蛇移动) # 绘制画面 screen.fill(BLACK) # 清空屏幕 draw_snake(snake) # 画蛇 draw_food(food) # 画食物 show_score(score) # 显示分数 pygame.display.update() # 更新画面 # 控制游戏速度 clock.tick(SPEED) # 启动游戏 if __name__ == "__main__": main() 这个代码在pycharm怎么运行不了
最新发布
11-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值