冲浪的口香糖 发表于 昨天 16:19

pygame问题

为啥我的pygame一运行就报错,错误原因还很奇怪,我改不好,ai也找不到{:10_266:},pygame也装了,所以到底是哪里错了
代码:
# 导入所需的库
import pygame# 导入pygame库,用于游戏开发
import sys# 导入sys库,用于系统相关操作
from pygame.locals import *# 从pygame.locals导入所有常量
import traceback# 导入traceback库,用于异常处理
import myplane# 导入自定义的myplane模块,用于玩家飞机相关操作
import enemy# 导入自定义的enemy模块,用于敌机相关操作

# 初始化pygame
pygame.init()# 初始化所有pygame模块
pygame.mixer.init()# 初始化音频模块

# 设置游戏窗口大小
bg_size = width,height = 480,700# 定义背景尺寸,宽度480像素,高度700像素

# 创建游戏窗口
screen = pygame.display.set_mode(bg_size)# 创建指定尺寸的游戏窗口
pygame.display.set_caption("飞机大战")# 设置窗口标题为"飞机大战"

# 加载游戏背景图片
background = pygame.image.load("解压包/images/background.png")# 加载背景图片

# 加载并设置游戏背景音乐
pygame.mixer.music.load("解压包/sound/game_music.ogg")# 加载背景音乐文件
pygame.mixer.music.set_volume(0.2)# 设置背景音乐音量为0.2

# 加载并设置各种游戏音效
bullet_sound=pygame.mixer.Sound("解压包/sound/bullet.wav")# 加载子弹发射音效
bullet_sound.set_volume(0.2)# 设置子弹音效音量
bomb_sound=pygame.mixer.Sound("解压包/sound/use_bomb.wav")# 加载使用炸弹音效
bomb_sound.set_volume(0.2)# 设置炸弹音效音量
supply_sound=pygame.mixer.Sound("解压包/sound/supply.wav")# 加载补给品音效
supply_sound.set_volume(0.2)# 设置补给品音效音量
get_bomb_sound=pygame.mixer.Sound("解压包/sound/get_bomb.wav")# 加获获取炸弹音效
get_bomb_sound.set_volume(0.2)# 设置获取炸弹音效音量
get_bullet_sound=pygame.mixer.Sound("解压包/sound/get_bullet.wav")# 加载获取子弹音效
get_bullet_sound.set_volume(0.2)# 设置获取子弹音效音量
upgrade_sound=pygame.mixer.Sound("解压包/sound/upgrade.wav")# 加载升级音效
upgrade_sound.set_volume(0.2)# 设置升级音效音量
enemy3_fly_sound=pygame.mixer.Sound("解压包/sound/enemy3_flying.wav")# 加载敌机3飞行音效
enemy3_fly_sound.set_volume(0.2)# 设置敌机3飞行音效音量
enemy1_down_sound=pygame.mixer.Sound("解压包/sound/enemy1_down.wav")# 加载敌机1被击落音效
enemy1_down_sound.set_volume(0.1)# 设置敌机1被击落音效音量
enemy2_down_sound=pygame.mixer.Sound("解压包/sound/enemy2_down.wav")# 加载敌机2被击落音效
enemy2_down_sound.set_volume(0.2)# 设置敌机2被击落音效音量
enemy3_down_sound=pygame.mixer.Sound("解压包/sound/enemy3_down.wav")# 加载敌机3被击落音效
enemy3_down_sound.set_volume(0.5)# 设置敌机3被击落音效音量
me_down_sound=pygame.mixer.Sound("解压包/sound/me_down.wav")# 加载玩家飞机被击落音效
me_down_sound.set_volume(0.2)# 设置玩家飞机被击落音效音量

def add_small_enemies(group1,group2,num):
    for i in range(num):
      e1=enemy.SmallEnemy(bg_size)
      group1.add(e1)
      group2.add(e1)

def add_middle_enemies(group1,group2,num):
    for i in range(num):
      e1=enemy.MiddleEnemy(bg_size)
      group1.add(e1)
      group2.add(e1)

def add_big_enemies(group1,group2,num):
    # 生成大敌机
    for i in range(num):
      e1=enemy.BigEnemy(bg_size)
      group1.add(e1)
      group2.add(e1)


# 游戏主循环
def main():
    pygame.mixer.music.play(-1)# 播放背景音乐,循环播放

    #生成我方飞机
    me = myplane.MyPlane(bg_size)# 创建玩家飞机对象

    #生成地方飞机
    enemies = pygame.sprite.Group()# 创建敌机精灵组
    #生成small敌方飞机
    small_enemies = pygame.sprite.Group()# 创建小型敌机精灵组
    add_small_enemies(small_enemies,enemies,15)# 调用函数生成小型敌机
    #生成middle敌方飞机
    middle_enemies = pygame.sprite.Group()# 创建中型敌机精灵组
    add_middle_enemies(middle_enemies,enemies,4)# 调用函数生成小型敌机
    #生成big敌方飞机
    big_enemies = pygame.sprite.Group()#
    add_big_enemies(big_enemies,enemies,2)



    running = True
    clock = pygame.time.Clock()
    #切换造型
    switch_image = True
    #设置延迟
    delay = 100

    while running:
      # 处理游戏事件
      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_ESCAPE:# 如果按下ESC键
                  pygame.quit()# 退出pygame
                  sys.exit()# 退出程序
      key_pressed = pygame.key.get_pressed()# 获取当前按下的键盘按键

      # 检测W键或上方向键是否被按下
      if key_pressed or key_pressed:
            # 如果按下,则调用向上移动的方法
            me.moveUp()
      # 检测S键或下方向键是否被按下
      if key_pressed or key_pressed:
            # 如果按下,则调用向下移动的方法
            me.moveDown()
      # 检测A键或左方向键是否被按下
      if key_pressed or key_pressed:
            # 如果按下,则调用向左移动的方法
            me.moveLeft()
      # 检测D键或右方向键是否被按下
      if key_pressed or key_pressed:
            # 如果按下,则调用向右移动的方法
            me.moveRight()
            
      # 绘制游戏画面
      screen.blit(background,(0,0))# 将背景图片绘制在屏幕上

      for each in big_enemies:# 遍历大敌机精灵组
            each.move()# 调用大敌机移动的方法
            if switch_image:
                screen.blit(each.image1,each.rect)# 将大敌机绘制在屏幕上
            else:
                screen.blit(each.image2,each.rect)# 将大敌机绘制在屏幕上
            #音效
            if each.rect.bottom == -50:
                enemy3_fly_sound.play()
      
      #绘制midle飞机
      for each in middle_enemies:# 遍历大敌机精灵组
            each.move()# 调用大敌机移动的方法
            screen.blit(each.image,each.rect)
      
      #绘制small飞机
      for each in small_enemies:# 遍历大敌机精灵组
            each.move()# 调用大敌机移动的方法
            screen.blit(each.image,each.rect)

      switch_image = not switch_image# 切换造型
      if switch_image:# 如果切换图像
            screen.blit(me.image1,me.rect)# 将玩家飞机绘制在屏幕上
      else:# 否则
            screen.blit(me.image2,me.rect)# 将玩家飞机绘制在屏幕上
      
      #绘制我方飞机
      

      if not(delay%10):
            switch_image = not switch_image# 切换造型

      delay -= 1# 延迟减1
      if not delay:
            delay = 100# 重置延迟

      pygame.display.flip()# 更新屏幕显示
      clock.tick(60)# 设置游戏帧率为60帧每秒

if __name__ == '__main__':
    try:
      main()
    except SystemExit:
      pass
    except:
      traceback.print_exc()
      pygame.quit()
      input()
错误原因:



感觉像系统错误{:10_266:}

FishC 发表于 昨天 16:22

你的代码中存在几个关键问题,导致运行时出错。以下是主要错误及修复方案:

### 主要问题分析:
1. **键盘检测逻辑错误**:`key_pressed` 检测未指定具体按键
2. **资源路径问题**:可能导致文件加载失败
3. **飞机绘制位置冲突**:重复绘制导致闪烁
4. **延迟控制逻辑错误**:`delay` 变量使用混乱

### 修复后的代码(修改部分已标注):
import pygame
import sys
from pygame.locals import *
import traceback
import myplane
import enemy

pygame.init()
pygame.mixer.init()

bg_size = width, height = 480, 700
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("飞机大战")

# 注意:确保资源路径正确!如果文件不存在会报错
background = pygame.image.load("解压包/images/background.png")

# 初始化音乐(同上确保路径正确)
pygame.mixer.music.load("解压包/sound/game_music.ogg")
pygame.mixer.music.set_volume(0.2)

# ...(音效加载部分保持不变)...

def add_small_enemies(group1, group2, num):
    for i in range(num):
      e1 = enemy.SmallEnemy(bg_size)
      group1.add(e1)
      group2.add(e1)

def add_middle_enemies(group1, group2, num):
    for i in range(num):
      e1 = enemy.MiddleEnemy(bg_size)
      group1.add(e1)
      group2.add(e1)

def add_big_enemies(group1, group2, num):
    for i in range(num):
      e1 = enemy.BigEnemy(bg_size)
      group1.add(e1)
      group2.add(e1)

def main():
    pygame.mixer.music.play(-1)
   
    me = myplane.MyPlane(bg_size)
    enemies = pygame.sprite.Group()
   
    small_enemies = pygame.sprite.Group()
    add_small_enemies(small_enemies, enemies, 15)
   
    middle_enemies = pygame.sprite.Group()
    add_middle_enemies(middle_enemies, enemies, 4)
   
    big_enemies = pygame.sprite.Group()
    add_big_enemies(big_enemies, enemies, 2)

    running = True
    clock = pygame.time.Clock()
    switch_image = True
    delay = 0# 修复1:简化延迟逻辑

    while running:
      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_ESCAPE:
                  pygame.quit()
                  sys.exit()
      
      # 修复2:正确检测具体按键
      key_pressed = pygame.key.get_pressed()
      if key_pressed or key_pressed:
            me.moveUp()
      if key_pressed or key_pressed:
            me.moveDown()
      if key_pressed or key_pressed:
            me.moveLeft()
      if key_pressed or key_pressed:
            me.moveRight()
      
      screen.blit(background, (0, 0))
      
      # 修复3:统一敌机绘制逻辑
      for each in big_enemies:
            each.move()
            if switch_image:
                screen.blit(each.image1, each.rect)
            else:
                screen.blit(each.image2, each.rect)
            if each.rect.bottom <= 0:# 修复音效触发条件
                enemy3_fly_sound.play()
      
      for each in middle_enemies:
            each.move()
            screen.blit(each.image, each.rect)
      
      for each in small_enemies:
            each.move()
            screen.blit(each.image, each.rect)
      
      # 修复4:玩家飞机绘制(移除重复绘制)
      if switch_image:
            screen.blit(me.image1, me.rect)
      else:
            screen.blit(me.image2, me.rect)
      
      # 简化延迟控制
      delay += 1
      if delay % 5 == 0:# 每5帧切换一次
            switch_image = not switch_image
      
      pygame.display.flip()
      clock.tick(60)

if __name__ == '__main__':
    try:
      main()
    except SystemExit:
      pass
    except:
      traceback.print_exc()
      pygame.quit()
      input()

### 关键修复说明:
1. **键盘检测**:原代码 `key_pressed or key_pressed` 缺少具体按键检测,现已修正为检测具体方向键(↑↓←→和WASD)
2. **资源路径**:确保 解压包/ 文件夹与py文件在同一目录
3. **绘制逻辑**:移除重复的玩家飞机绘制代码
4. **延迟控制**:简化 switch_image 切换逻辑,避免闪烁

### 常见问题排查:
1. 如果报错 FileNotFoundError → 检查图片/音效文件路径
2. 如果报错 AttributeError → 确保 myplane.py 和 enemy.py 存在且包含所需类
3. 如果飞机不移动 → 检查 MyPlane 类的 moveUp() 等方法实现

建议先确保资源文件路径正确,这是最常见的错误原因。如果仍有问题,请提供具体的错误信息(终端报错内容)。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

不二如是 发表于 昨天 17:20

报错其实跟代码无关,而是“运行方式”不对。

把这条PowerShell命令输到了Python解释器/Jupyter单元格子:
& C:\Users\24734\AppData\Local\Microsoft\WindowsApps\python3.13.exeC:\Users\24734\Desktop\code\pygame飞机大战\main.py

爱编程的我 发表于 7 小时前

不二如是 发表于 2025-8-13 17:20
报错其实跟代码无关,而是“运行方式”不对。

把这条PowerShell命令输到了Python解释器/Jupyter单元格子 ...

赞同~~~
页: [1]
查看完整版本: pygame问题