ERROR_ERRORs 2023-01-01 12:57 采纳率: 25%
浏览 182
已结题

python飞机大战: Fatal Python error: (pygame parachute) Segmentation Fault

python飞机大战运行时总会抛出:
Fatal Python error: (pygame parachute) Segmentation Fault
Python runtime state: initialized
在程序运行不到半分钟就报错,而且在此期间每一次游戏运行越来越慢
不知为何,求解

  1. Alien.py
  2. import pygame
  3. import sys
  4. import ship
  5. import settings
  6. from enemy import Enemy
  7. from Bullet import Bullet
  8. class Alien_invasion:
  9. """游戏主程序"""
  10. def __init__(self):
  11. """初始化"""
  12. pygame.init()
  13. self.settings = settings.Settings()
  14. # self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
  15. # self.settings.screen_width = self.screen.get_rect().width
  16. # self.settings.screen_height = self.screen.get_rect().height
  17. self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
  18. pygame.display.set_caption('Alien_invasion')
  19. self.ship = ship.Ship(self)
  20. self.bullets = pygame.sprite.Group()
  21. self.enemies = pygame.sprite.Group()
  22. def run_game(self):
  23. """运行游戏"""
  24. while True:
  25. self._check_event()
  26. self._update_screen()
  27. self.ship.update()
  28. self._update_bullet()
  29. self._create_enemy()
  30. def _check_event(self):
  31. """检索事件"""
  32. for event in pygame.event.get():
  33. if event.type == pygame.QUIT:
  34. sys.exit()
  35. elif event.type == pygame.KEYDOWN:
  36. self._check_keydown_events(event)
  37. elif event.type == pygame.KEYUP:
  38. self._check_keyup_events(event)
  39. def _check_keydown_events(self, event): # 传入参数event供访问event.key 属性
  40. """响应按键"""
  41. if event.key == pygame.K_RIGHT:
  42. self.ship.moving_right = True
  43. if event.key == pygame.K_LEFT:
  44. self.ship.moving_left = True
  45. if event.key == pygame.K_q:
  46. sys.exit()
  47. if event.key == pygame.K_SPACE:
  48. self._fire_bullet()
  49. def _check_keyup_events(self, event): # 传入参数event供访问event.key 属性
  50. """响应按键"""
  51. if event.key == pygame.K_RIGHT:
  52. self.ship.moving_right = False
  53. if event.key == pygame.K_LEFT:
  54. self.ship.moving_left = False
  55. def _fire_bullet(self):
  56. new_bullet = Bullet(self)
  57. self.bullets.add(new_bullet)
  58. def _update_bullet(self):
  59. self.bullets.update()
  60. for bullet in self.bullets.copy():
  61. if bullet.rect.bottom <= 0:
  62. self.bullets.remove(bullet)
  63. def _create_enemy(self):
  64. enemy = Enemy(self)
  65. enemy_width = enemy.rect.width
  66. availzble_space_x = self.settings.screen_width - (2 * enemy_width)
  67. number_enemy_x = availzble_space_x // (2 * enemy_width)
  68. for enemy_number in range(number_enemy_x):
  69. enemy = Enemy(self)
  70. enemy.x = enemy_width + 2 * enemy_width * enemy_number
  71. enemy.rect.x = enemy.x
  72. self.enemies.add(enemy)
  73. def _update_screen(self):
  74. """翻新屏幕"""
  75. self.screen.fill(self.settings.bg_color)
  76. self.ship.blitme()
  77. for bullet in self.bullets.sprites():
  78. bullet.draw_bullets()
  79. self.enemies.draw(self.screen)
  80. pygame.display.flip()
  81. if __name__ == '__main__':
  82. ai = Alien_invasion()
  83. ai.run_game()
  84. ############ship.py#############
  85. import pygame
  86. class Ship:
  87. def __init__(self, ai_game):
  88. self.screen = ai_game.screen
  89. self.screen_rect = ai_game.screen.get_rect()
  90. self.image = pygame.image.load('images/Ship_right.bmp') # 加载飞船图片
  91. self.rect = self.image.get_rect()
  92. self.rect.midbottom = self.screen_rect.midbottom
  93. self.settings = ai_game.settings
  94. self.x = float(self.rect.x)
  95. # 移动标志
  96. self.moving_left = False
  97. self.moving_right = False
  98. self.moving_up = False
  99. self.moving_down = False
  100. def update(self):
  101. """根据移动标志移动飞船"""
  102. if self.moving_right and self.rect.right < self.screen_rect.right:
  103. self.x += self.settings.ship_speed
  104. if self.moving_left and self.rect.left > 0:
  105. self.x -= self.settings.ship_speed
  106. self.rect.x = self.x
  107. def blitme(self):
  108. """构建飞船图像"""
  109. self.screen.blit(self.image, self.rect)
  110. ###############Bullet.py#################
  111. import pygame
  112. from pygame.sprite import Sprite
  113. class Bullet(Sprite):
  114. """管理飞船所发射子弹的类"""
  115. def __init__(self, ai_game):
  116. """在飞船当前位置传建一个子弹对象"""
  117. super().__init__()
  118. self.screen = ai_game.screen
  119. self.settings = ai_game.settings
  120. self.color = self.settings.bullet_color
  121. # 在(0,0)处创建一个表示子弹的矩形,再设置正确的位置
  122. self.rect = pygame.Rect(0, 0, self.settings.bullet_width,
  123. self.settings.bullet_height)
  124. self.rect.midtop = ai_game.ship.rect.midtop
  125. # 储存用小数表示的子弹的位置
  126. self.y = float(self.rect.y)
  127. def update(self):
  128. """向上移动子弹"""
  129. # 更新表示子弹位置的小数值
  130. self.y -= self.settings.bullet_speed
  131. # 更新表示子弹的rect位置
  132. self.rect.y = self.y
  133. def draw_bullets(self):
  134. """在屏幕上绘制子弹"""
  135. pygame.draw.rect(self.screen, self.color, self.rect)
  136. ##########Enemy.py##########
  137. import pygame
  138. from pygame.sprite import Sprite
  139. class Enemy(Sprite):
  140. def __init__(self, game):
  141. super().__init__()
  142. self.screen = game.screen
  143. self.screen_rect = game.screen.get_rect()
  144. self.image = pygame.image.load('images/enemy_ship.bmp')
  145. self.rect = self.image.get_rect()
  146. self.rect.x = self.rect.width
  147. self.rect.y = self.rect.height
  148. self.x = float(self.rect.x)
  149. ###########settings.py##########
  150. class Settings:
  151. def __init__(self):
  152. self.screen_width = 1200
  153. self.screen_height = 800
  154. self.bg_color = (230,230,230)
  155. self.ship_speed = 3.3
  156. self.bullet_speed = 3.5
  157. self.bullet_width = 3
  158. self.bullet_height = 15
  159. self.bullet_color = (60,60,60)

展开全部

  • 写回答

2条回答 默认 最新

  • Flashang_sg 2023-01-01 15:25
    关注

    這段代碼可以修改為:

    1. def run_game(self):
    2. """运行游戏"""
    3. self._create_enemy()
    4. while True:
    5. self._check_event()
    6. self._update_screen()
    7. self.ship.update()
    8. self._update_bullet()
    9. # self._create_enemy()

    self._create_enemy() 一開始呼叫一次就好。
    否則會一直消耗記憶。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    FUXII 2023-01-10 06:19

    是这样的,谢谢

    回复
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 1月9日
  • 已采纳回答 1月2日
  • 创建了问题 1月1日

悬赏问题

  • ¥50 有偿求qftp工具。能连接,下载文件,发送代码,windows环境,最好qt6 要qt creator写的
  • ¥70 刚刚看到一个人的网站居然是通过cname访问的
  • ¥15 Attributeerror:super object has no attribute '__sklearn_tags__'_'
  • ¥15 逆置单链表输出不完整
  • ¥15 宇视vms-B200-A16@R启动不了,如下图所示,在软件工具搜不到,如何解决?(操作系统-linux)
  • ¥500 寻找一名电子工程师完成pcb主板设计(拒绝AI生成式答案)
  • ¥15 关于#mysql#的问题:UNION ALL(相关搜索:sql语句)
  • ¥15 matlab二位可视化能否针对不同数值范围分开分级?
  • ¥15 已经创建了模拟器但是不能用来运行app 怎么办😭自己搞两天了
  • ¥15 关于#极限编程#的问题,请各位专家解答!
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部