鱼C论坛

 找回密码
 立即注册
查看: 47|回复: 3

pygame问题

[复制链接]
发表于 昨天 16:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

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

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

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

  21. # 加载并设置各种游戏音效
  22. bullet_sound=pygame.mixer.Sound("解压包/sound/bullet.wav")  # 加载子弹发射音效
  23. bullet_sound.set_volume(0.2)  # 设置子弹音效音量
  24. bomb_sound=pygame.mixer.Sound("解压包/sound/use_bomb.wav")  # 加载使用炸弹音效
  25. bomb_sound.set_volume(0.2)  # 设置炸弹音效音量
  26. supply_sound=pygame.mixer.Sound("解压包/sound/supply.wav")  # 加载补给品音效
  27. supply_sound.set_volume(0.2)  # 设置补给品音效音量
  28. get_bomb_sound=pygame.mixer.Sound("解压包/sound/get_bomb.wav")  # 加获获取炸弹音效
  29. get_bomb_sound.set_volume(0.2)  # 设置获取炸弹音效音量
  30. get_bullet_sound=pygame.mixer.Sound("解压包/sound/get_bullet.wav")  # 加载获取子弹音效
  31. get_bullet_sound.set_volume(0.2)  # 设置获取子弹音效音量
  32. upgrade_sound=pygame.mixer.Sound("解压包/sound/upgrade.wav")  # 加载升级音效
  33. upgrade_sound.set_volume(0.2)  # 设置升级音效音量
  34. enemy3_fly_sound=pygame.mixer.Sound("解压包/sound/enemy3_flying.wav")  # 加载敌机3飞行音效
  35. enemy3_fly_sound.set_volume(0.2)  # 设置敌机3飞行音效音量
  36. enemy1_down_sound=pygame.mixer.Sound("解压包/sound/enemy1_down.wav")  # 加载敌机1被击落音效
  37. enemy1_down_sound.set_volume(0.1)  # 设置敌机1被击落音效音量
  38. enemy2_down_sound=pygame.mixer.Sound("解压包/sound/enemy2_down.wav")  # 加载敌机2被击落音效
  39. enemy2_down_sound.set_volume(0.2)  # 设置敌机2被击落音效音量
  40. enemy3_down_sound=pygame.mixer.Sound("解压包/sound/enemy3_down.wav")  # 加载敌机3被击落音效
  41. enemy3_down_sound.set_volume(0.5)  # 设置敌机3被击落音效音量
  42. me_down_sound=pygame.mixer.Sound("解压包/sound/me_down.wav")  # 加载玩家飞机被击落音效
  43. me_down_sound.set_volume(0.2)  # 设置玩家飞机被击落音效音量

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

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

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


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

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

  65.     #生成地方飞机
  66.     enemies = pygame.sprite.Group()  # 创建敌机精灵组
  67.     #生成small敌方飞机
  68.     small_enemies = pygame.sprite.Group()  # 创建小型敌机精灵组
  69.     add_small_enemies(small_enemies,enemies,15)  # 调用函数生成小型敌机
  70.     #生成middle敌方飞机
  71.     middle_enemies = pygame.sprite.Group()  # 创建中型敌机精灵组
  72.     add_middle_enemies(middle_enemies,enemies,4)  # 调用函数生成小型敌机
  73.     #生成big敌方飞机
  74.     big_enemies = pygame.sprite.Group()  #
  75.     add_big_enemies(big_enemies,enemies,2)



  76.     running = True
  77.     clock = pygame.time.Clock()
  78.     #切换造型
  79.     switch_image = True
  80.     #设置延迟
  81.     delay = 100

  82.     while running:
  83.         # 处理游戏事件
  84.         for event in pygame.event.get():  # 获取所有事件
  85.             if event.type == pygame.QUIT:  # 如果点击关闭按钮
  86.                 pygame.quit()
  87.                 sys.exit()  # 退出程序
  88.             
  89.             if event.type == pygame.KEYDOWN:  # 如果按下键盘按键
  90.                 if event.key == pygame.K_ESCAPE:  # 如果按下ESC键
  91.                     pygame.quit()  # 退出pygame
  92.                     sys.exit()  # 退出程序
  93.         key_pressed = pygame.key.get_pressed()  # 获取当前按下的键盘按键

  94.         # 检测W键或上方向键是否被按下
  95.         if key_pressed[K_w] or key_pressed[K_UP]:
  96.             # 如果按下,则调用向上移动的方法
  97.             me.moveUp()
  98.         # 检测S键或下方向键是否被按下
  99.         if key_pressed[K_s] or key_pressed[K_DOWN]:
  100.             # 如果按下,则调用向下移动的方法
  101.             me.moveDown()
  102.         # 检测A键或左方向键是否被按下
  103.         if key_pressed[K_a] or key_pressed[K_LEFT]:
  104.             # 如果按下,则调用向左移动的方法
  105.             me.moveLeft()
  106.         # 检测D键或右方向键是否被按下
  107.         if key_pressed[K_d] or key_pressed[K_RIGHT]:
  108.             # 如果按下,则调用向右移动的方法
  109.             me.moveRight()
  110.             
  111.         # 绘制游戏画面
  112.         screen.blit(background,(0,0))  # 将背景图片绘制在屏幕上

  113.         for each in big_enemies:  # 遍历大敌机精灵组
  114.             each.move()  # 调用大敌机移动的方法
  115.             if switch_image:
  116.                 screen.blit(each.image1,each.rect)  # 将大敌机绘制在屏幕上
  117.             else:
  118.                 screen.blit(each.image2,each.rect)  # 将大敌机绘制在屏幕上
  119.             #音效
  120.             if each.rect.bottom == -50:
  121.                 enemy3_fly_sound.play()
  122.         
  123.         #绘制midle飞机
  124.         for each in middle_enemies:  # 遍历大敌机精灵组
  125.             each.move()  # 调用大敌机移动的方法
  126.             screen.blit(each.image,each.rect)
  127.         
  128.         #绘制small飞机
  129.         for each in small_enemies:  # 遍历大敌机精灵组
  130.             each.move()  # 调用大敌机移动的方法
  131.             screen.blit(each.image,each.rect)

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

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

  142.         delay -= 1  # 延迟减1
  143.         if not delay:
  144.             delay = 100  # 重置延迟

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

  147. if __name__ == '__main__':
  148.     try:
  149.         main()
  150.     except SystemExit:
  151.         pass
  152.     except:
  153.         traceback.print_exc()
  154.         pygame.quit()
  155.         input()
复制代码
错误原因:



感觉像系统错误
屏幕截图 2025-08-13 161616.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 16:22 | 显示全部楼层
你的代码中存在几个关键问题,导致运行时出错。以下是主要错误及修复方案:

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

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

  7. pygame.init()
  8. pygame.mixer.init()

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

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

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

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

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

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

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

  33. def main():
  34.     pygame.mixer.music.play(-1)
  35.    
  36.     me = myplane.MyPlane(bg_size)
  37.     enemies = pygame.sprite.Group()
  38.    
  39.     small_enemies = pygame.sprite.Group()
  40.     add_small_enemies(small_enemies, enemies, 15)
  41.    
  42.     middle_enemies = pygame.sprite.Group()
  43.     add_middle_enemies(middle_enemies, enemies, 4)
  44.    
  45.     big_enemies = pygame.sprite.Group()
  46.     add_big_enemies(big_enemies, enemies, 2)

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

  51.     while running:
  52.         for event in pygame.event.get():
  53.             if event.type == pygame.QUIT:
  54.                 pygame.quit()
  55.                 sys.exit()
  56.             if event.type == pygame.KEYDOWN:
  57.                 if event.key == pygame.K_ESCAPE:
  58.                     pygame.quit()
  59.                     sys.exit()
  60.         
  61.         # 修复2:正确检测具体按键
  62.         key_pressed = pygame.key.get_pressed()
  63.         if key_pressed[pygame.K_UP] or key_pressed[pygame.K_w]:
  64.             me.moveUp()
  65.         if key_pressed[pygame.K_DOWN] or key_pressed[pygame.K_s]:
  66.             me.moveDown()
  67.         if key_pressed[pygame.K_LEFT] or key_pressed[pygame.K_a]:
  68.             me.moveLeft()
  69.         if key_pressed[pygame.K_RIGHT] or key_pressed[pygame.K_d]:
  70.             me.moveRight()
  71.         
  72.         screen.blit(background, (0, 0))
  73.         
  74.         # 修复3:统一敌机绘制逻辑
  75.         for each in big_enemies:
  76.             each.move()
  77.             if switch_image:
  78.                 screen.blit(each.image1, each.rect)
  79.             else:
  80.                 screen.blit(each.image2, each.rect)
  81.             if each.rect.bottom <= 0:  # 修复音效触发条件
  82.                 enemy3_fly_sound.play()
  83.         
  84.         for each in middle_enemies:
  85.             each.move()
  86.             screen.blit(each.image, each.rect)
  87.         
  88.         for each in small_enemies:
  89.             each.move()
  90.             screen.blit(each.image, each.rect)
  91.         
  92.         # 修复4:玩家飞机绘制(移除重复绘制)
  93.         if switch_image:
  94.             screen.blit(me.image1, me.rect)
  95.         else:
  96.             screen.blit(me.image2, me.rect)
  97.         
  98.         # 简化延迟控制
  99.         delay += 1
  100.         if delay % 5 == 0:  # 每5帧切换一次
  101.             switch_image = not switch_image
  102.         
  103.         pygame.display.flip()
  104.         clock.tick(60)

  105. if __name__ == '__main__':
  106.     try:
  107.         main()
  108.     except SystemExit:
  109.         pass
  110.     except:
  111.         traceback.print_exc()
  112.         pygame.quit()
  113.         input()
复制代码


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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 17:20 | 显示全部楼层
报错其实跟代码无关,而是“运行方式”不对。

把这条PowerShell命令输到了Python解释器/Jupyter单元格子:
  1. & C:\Users\24734\AppData\Local\Microsoft\WindowsApps\python3.13.exe  C:\Users\24734\Desktop\code\pygame飞机大战\main.py
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 9 小时前 | 显示全部楼层
不二如是 发表于 2025-8-13 17:20
报错其实跟代码无关,而是“运行方式”不对。

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

赞同~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-14 11:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表