请帮解答下问题在哪

请帮解答下问题在哪

请问一下如果不封装war文件,代码如下为什么无法正常运行r.broken_down(),

main.py

import pygame,sys

import constants

from game.plane import Plane, OurPlane , SmallEnemyPlane


def main():
   """游戏入口"""
   #初始化
   pygame.init()

   width,height = 480,852
   #屏幕对象
   screen = pygame.display.set_mode((width,height))

   #设置标题
   pygame.display.set_caption('飞机大战')

   #加载背景图片
   bg = pygame.image.load(constants.BG_IMG)
   #游戏标题
   img_game_title = pygame.image.load(constants.IMG_GAME_TITLE)
   img_game_title_rect = img_game_title.get_rect()
   t_width,t_height = img_game_title.get_size()
   img_game_title_rect.topleft = (int((width-t_width)/2),int(height/2-t_height))

   #开始按钮
   btn_start = pygame.image.load(constants.IMG_GAME_START_BTN)
   btn_start_rect = btn_start.get_rect()
   b_width,b_height = btn_start.get_size()
   btn_start_rect.topleft =(int((width-b_width)/2),int(height/2+b_height))

   #加载背景音乐
   pygame.mixer_music.load(constants.BG_MUSIC)
   # 循环播放
   pygame.mixer_music.play(-1)
   #调整音量
   pygame.mixer_music.set_volume(0.2)

   #游戏状态 (准备中为0,游戏中为1,游戏结束为2)
   status = 0

   small_enemies = pygame.sprite.Group()
   enemies = pygame.sprite.Group()

   our_plane = OurPlane(screen,20)

   frame = 0  #播放帧数

   clock = pygame.time.Clock()
   #一架飞机可以属于多个精灵组

   for i in range(6):
       plane = SmallEnemyPlane(screen,4)
       plane.add(small_enemies,enemies)

   while True:
       clock.tick(60)
       frame += 1
       if frame >= 60:
           frame = 0
       #1监听事件
       for event in pygame.event.get():
           #退出游戏
           if event.type == pygame.QUIT:
               pygame.quit()
               sys.exit()
           elif event.type == pygame.MOUSEBUTTONDOWN:
               #鼠标点击进入游戏
               #游戏正在准备中,点击才能进入游戏
               if status == 0:
                   status = 1
           elif event.type == pygame.KEYDOWN:
               #键盘事件
               #游戏正在游戏中
               if status == 1:
                   if event.key == pygame.K_w or event.key == pygame.K_UP:
                       our_plane.move_up()
                   elif event.key == pygame.K_s or event.key == pygame.K_DOWN:
                       our_plane.move_down()
                   elif event.key == pygame.K_a or event.key == pygame.K_LEFT:
                       our_plane.move_left()
                   elif event.key == pygame.K_d or event.key == pygame.K_RIGHT:
                       our_plane.move_right()
                   elif event.key == pygame.K_SPACE:
                       #发射子弹
                       our_plane.shoot()
       #更新游戏状态
       if status == 0:
           #游戏准备中
           # 绘制背景
           screen.blit(bg, bg.get_rect())
           #绘制标题
           screen.blit(img_game_title,img_game_title_rect)
           #开始按钮
           screen.blit(btn_start,btn_start_rect)

       elif status == 1:
           #游戏进行中
           #绘制背景
           screen.blit(bg, bg.get_rect())
           #绘制飞机
           our_plane.update(frame)
           #绘制子弹
           our_plane.bullets.update(enemies)
           #绘制敌方飞机
           small_enemies.update()



       pygame.display.update()
if __name__ == '__main__':
   main()


plane.py

import random

import pygame

import constants
from game.bullet import Bullet


class Plane(pygame.sprite.Sprite):
   '''飞机的基类'''
   # 飞机的图片
   plane_images = []
   # 飞机爆炸的图片
   destroy_images = []
   # 飞机爆炸的音效地址
   down_sound_src = None
   # 飞机的状态:True,活的,False,死的
   active = True
   # 子弹精灵组
   bullets = pygame.sprite.Group()

   def __init__(self, screen,speed=None):
       super().__init__()
       self.screen = screen
       # self.enemies = enemies
       # 加载静态资源
       self.img_list = []
       self._destroy_img_list = []
       self.down_sound_src = None
       self.load_src()
       # 飞机速度
       self.speed = speed or 10

       # 获取飞机位置
       self.rect = self.img_list[0].get_rect()

       #飞机大小
       self.plane_w,self.plane_h = self.img_list[0].get_size()

       #游戏窗口的尺寸
       self.width,self.height = self.screen.get_size()

       # 改变飞机初始位置
       self.rect.x = int((self.width - self.plane_w) / 2)
       self.rect.y = int(self.height/2)


   def load_src(self):
       '''加载静态资源'''
       # 飞机图片
       for img in self.plane_images:
           self.img_list.append(pygame.image.load(img))
       # 飞机坠毁图片
       for img in self.destroy_images:
           self._destroy_img_list.append(pygame.image.load(img))
       # 坠毁的音乐
       if self.down_sound_src:
           self.down_sound = pygame.mixer.Sound(self.down_sound_src)

   @property
   def image(self):
       return self.img_list[0]

   def blit_me(self):
       self.screen.blit(self.image, self.rect)

   def move_up(self):
       '''向上移动'''
       self.rect.y -= self.speed

   def move_down(self):
       '''向下移动'''
       self.rect.y += self.speed

   def move_left(self):
       '''向左移动'''
       self.rect.x -= self.speed

   def move_right(self):
       '''向右移动'''
       self.rect.x += self.speed

   def broken_down(self):
       """飞机坠毁"""
       # 1.播放坠毁音乐
       if self.down_sound:
           self.down_sound.play()
       # 2.播放坠毁动画
       for img in self._destroy_img_list:
           self.screen.blit(img, self.rect)
       # 3坠毁后
       self.active = False

   def shoot(self):
       '''发射子弹'''
       bullet = Bullet(self.screen,self,30)
       self.bullets.add(bullet)

class OurPlane(Plane):
   '''我方飞机'''
   # 飞机的图片
   plane_images = [constants.OUR_PLANE_IMG_1, constants.OUR_PLANE_IMG_2]
   # 飞机爆炸的图片
   destroy_images = constants.OUR_DESTROY_IMG_LIST
   # 飞机爆炸的音效地址
   down_sound_src = None

   def update(self, frame):
       '''更新飞机动画'''
       if frame % 5:
           self.screen.blit(self.img_list[0],self.rect)
       else:
           self.screen.blit(self.img_list[1],self.rect)

   def move_up(self):
       '''向上移动,控制不超出边境'''
       super().move_up()
       if self.rect.y <= 0:
           self.rect.y = 0
   def move_down(self):
       '''向下移动,控制不超出边境'''
       super().move_down()
       if self.rect.y >= self.height - self.plane_h :
           self.rect.y = self.height - self.plane_h
   def move_left(self):
       '''向左移动,控制不超出边境'''
       super().move_left()
       if self.rect.x <= 0:
           self.rect.x = 0
   def move_right(self):
       '''向右移动,控制不超出边境'''
       super().move_right()
       if self.rect.x >= self.width - self.plane_w:
           self.rect.x = self.width - self.plane_w


class SmallEnemyPlane(Plane):
   """敌方小型飞机"""
   # 飞机的图片
   plane_images = [constants.SMALL_ENEMY_PLANE_IMG]
   # 飞机爆炸的图片
   destroy_images = constants.SMALL_ENEMY_DESTROY_IMG_LIST
   # 飞机爆炸的音效地址
   down_sound_src = constants.SMALL_ENEMY_PLANE_DOWN_SOUND

   def __init__(self,screen,speed):
       super().__init__(screen,speed)
       #每生成一架新的小型飞机,随机出现位置
       self.rect.x = random.randint(0,self.width - self.plane_w)
       self.rect.y = random.randint(-5*self.plane_h,-self.plane_h)

   def update(self, *args):
       '''更新飞机移动'''
       super().move_down()

       #画在屏幕上
       self.blit_me()
       #超出范围
       if self.rect.y >= self.height:
           self.active = False
           #self.kill()
           self.reset()

   def reset(self):
       '''重置飞机'''
       self.active = True
       #改变飞机位置
       self.rect.x = random.randint(0, self.width - self.plane_w)
       self.rect.y = random.randint(-5 * self.plane_h, -self.plane_h)

   def broken_down(self):
       """飞机爆炸"""
       super().broken_down()
       self.reset()


bullet.py

import pygame

import  constants



class Bullet(pygame.sprite.Sprite):
   '''子弹类'''

   #子弹的状态,True为活着
   active = True

   def __init__(self, screen,plane,speed = None):
       super().__init__()
       self.screen = screen
       # self.enemies = enemies

       #速度
       self.speed = speed or 10
       self.plane = plane

       #加载子弹图片
       self.image = pygame.image.load(constants.BULLET_IMG)

       #改变子弹位置
       self.rect = self.image.get_rect()
       self.rect.centerx = plane.rect.centerx
       self.rect.y = plane.rect.y

       #发射音效
       self.shoot_sound = pygame.mixer.Sound(constants.BULLET_SOUND)
       self.shoot_sound.set_volume(0.3)
       self.shoot_sound.play()

   def update(self, enemies):
       '''更新子弹位置'''
       self.rect.y -= self.speed
       #超出屏幕
       if self.rect.y < 0:
           self.remove(self.plane.bullets)
       #绘制子弹
       self.screen.blit(self.image,self.rect)

       #碰撞检测
       rest = pygame.sprite.spritecollide(self,enemies,False)

       for r in rest:
           #1.子弹消失
           print(r)
           self.kill()
           #2.飞机爆炸
           r.broken_down()
           #3.统计成绩

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好。

关于该问题所触发的错误,请附上以下两项信息,从而方便我们定位问题,更快为你解决:

(1)错误信息(pycharm中的错误信息)

(2)项目结构的截图信息(完整)

或者你可在问答区按照上述要求重新提问。


  • 慕沐2042916 提问者 #1
    我等了一天就等到这么个回答实在失望,你们这提问还不能直接上传附件,真是十分麻烦,我到这节课为止代码基本都复制在这里了,我只是不明白一个问题,我没有封装war文件,在bullet文件这样去定义update方法运行到 for r in rest: r.broken_down()就报错是为什么,其他的我都跟课程里教的写的代码没有区别 以下是错误信息: C:\envs\chapter12\Scripts\python.exe G:/pycharm/untitled/main.py pygame 1.9.6 Hello from the pygame community. https://www.pygame.org/contribute.html Traceback (most recent call last): File "G:/pycharm/untitled/main.py", line 114, in <module> main() File "G:/pycharm/untitled/main.py", line 106, in main our_plane.bullets.update(enemies) File "C:\envs\chapter12\lib\site-packages\pygame\sprite.py", line 463, in update <SmallEnemyPlane sprite(in 2 groups)> s.update(*args) File "G:\pycharm\untitled\game\bullet.py", line 53, in update r.broken_down() File "G:\pycharm\untitled\game\plane.py", line 173, in broken_down super().broken_down() File "G:\pycharm\untitled\game\plane.py", line 86, in broken_down if self.down_sound: AttributeError: 'SmallEnemyPlane' object has no attribute 'down_sound' Process finished with exit code 1
    2020-02-11 00:45:47
  • 慕之熠_灿烈 回复 提问者 慕沐2042916 #2
    根据错误原因显示:在plane.py中SmallEnemyPlane没有down_sound实例属性,所以在调用父类broken_down( )方法时,因为无法匹配self.down_sound属性而致使错误。 你可以在SmallEnemyPlane中手动调用父类(Plane)的load( )方法进行down_sound属性的设置或者在本来中自行实现一个加载飞机爆炸的音效地址的方法,并赋值给down_sound(也就是说给SmallEnemyPlane类添加一个属性)。
    2020-02-11 11:13:08
  • 慕沐2042916 提问者 回复 慕之熠_灿烈 #3
    十分感谢您,我终于找到了错在哪里,原来是我plane基类的init里self.down_sound = None我打成了self.down_sound_src = None所以读不出来那爆炸音效
    2020-02-11 17:09:05
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师