鱼C论坛

 找回密码
 立即注册
查看: 1456|回复: 5

出现了一个error,求助大神

[复制链接]
发表于 2018-12-30 15:44:45 | 显示全部楼层 |阅读模式

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

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

x
在看一本书,Python编程 从入门到实践

遇到了一个问题,就是我下面的算法(功能:实现飞船的左右移动,按住空格进行射击),
问题::Ship()里面没有对于 bullet_width 的描述,不需要,但是为什么提示弹出错误??


代码如下:(初学者 代码比较混乱)

  1. import pygame
  2. import sys
  3. from pygame.sprite import Sprite
  4. from pygame.sprite import Group

  5. #事件检查
  6. def check_keydown_events(event,ai_setting,screen,ship,bullets):
  7. #按下键盘
  8.         if event.key==pygame.K_RIGHT:
  9.                 ship.moving_right=True
  10.         elif event.key==pygame.K_LEFT:
  11.                 ship.moving_left=True
  12.         elif event.key==pygame.K_SPACE:
  13.                 new_bullet=Bullet(ai_setting,screen,ship)
  14.                 bullets.add(new_bullet)
  15.                
  16. def check_keyup_events(event,ship):
  17. #按键反馈
  18.         if event.key==pygame.K_RIGHT:
  19.                 ship.moving_right=False
  20.         if event.key==pygame.K_LEFT:
  21.                 ship.moving_left=False       

  22. def check_event(ai_setting,screen,ship,bullets):
  23.         for event in pygame.event.get():#利用pygame里面的事件获取机制,判断退出/按下/弹起
  24.                 if event.type==pygame.QUIT:
  25.                         sys.exit()
  26.                 elif event.type==pygame.KEYDOWN:
  27.                         check_keydown_events(event,ship,screen,ship,bullets)
  28.                         check_keydown_events(event,ai_setting,screen,ship,bullets)
  29.                 elif event.type==pygame.KEYUP:
  30.                         check_keyup_events(event,ship)       
  31.        
  32. #屏幕更新
  33. def update_screen(ai_setting,bg_color,screen,ship,bullets):
  34.         screen.fill(bg_color)
  35.         for bullet in bullets.sprites():
  36.                 bullet.draw_bullet()
  37.         ship.blitme()
  38.         #让最近的屏幕可视
  39.         pygame.display.flip()
  40.        
  41. class Settings():
  42.         #储存关于游戏的初始化的变量
  43.         def __init__(self):
  44.                 #初始化页面
  45.                 self.screen_width=1200
  46.                 self.screen_height=800
  47.                 self.bg_color=(230,230,230)# R/G/B
  48.                 self.ship_speed_factor=1.5#飞船的移动速度
  49.                 #子弹设置
  50.                 self.bullet_speed_factor=1
  51.                 self.bullet_width=3
  52.                 self.bullet_height=15
  53.                 self.bullet_color=60,60,60

  54. class Ship():
  55.         #储存关于飞船的信息
  56.         def __init__(self,ai_setting,screen):
  57.                 self.screen=screen
  58.                 self.ai_setting=ai_setting
  59.                 self.image=pygame.image.load("D:/PY/py6/aline_invasion/images/ship.bmp")
  60.                 self.rect=self.image.get_rect()
  61.                 self.screen_rect=screen.get_rect()
  62.                 #飞船的位置
  63.                 self.rect.centerx=self.screen_rect.centerx
  64.                 self.rect.bottom=self.screen_rect.bottom
  65.                 #移动标志
  66.                 self.moving_right=False
  67.                 self.moving_left=False
  68.                 #在飞船的属性里面设置存储
  69.                 self.center=float(self.rect.centerx)
  70.        
  71.         def update(self):
  72.         #根据移动的标志调整飞船的位置
  73.                 if self.moving_right and self.rect.right < self.screen_rect.right:
  74.                         #self.rect.centerx += 1
  75.                         self.center+=self.ai_setting.ship_speed_factor

  76.                 if self.moving_left and self.rect.left > 0:
  77.                         #self.rect.centerx -= 1
  78.                         self.center-=self.ai_setting.ship_speed_factor
  79.                
  80.                 #根据中间的 self.center 更新 self.rect.center
  81.                 self.rect.centerx=self.center
  82.        
  83.         def blitme(self):
  84.         #在主屏幕绘制成像
  85.                 self.screen.blit(self.image,self.rect)

  86. class Bullet(Sprite):
  87. #继承了pygame里面的Sprite的类
  88. #这是对于子弹进行管理的类
  89.         def __init__(self,ai_setting,screen,ship):
  90.                 super(Bullet,self).__init__()                #继承
  91.                 self.screen=screen
  92.                 #在(0,0)那里创建一个子弹的矩形框。
  93.                 self.rect=pygame.rect(0,0,ai_setting.bullet_width,ai_setting.bullet_height)
  94.                 self.rect.centerx=ship.rect.centerx
  95.                 self.rect.top=ship.rect.top
  96.                 #存储用小数表示子弹
  97.                 self.y=float(self.rect.y)
  98.                 self.color=ai_setting.bullet_color
  99.                 self.speed_factor=ai_setting.bullet_speed_factor
  100.         def update(self):
  101.                 #向上移动子弹
  102.                 #更新表示子弹位置的小数
  103.                 self.y-=self.speed_factor
  104.                 #更新表示子弹的rect的位置
  105.                 self.rect.y=self.y
  106.         def draw_bullet(self):
  107.                 #在屏幕上面绘制子弹
  108.                 pygame.draw.rect(self.screen,self.color,self.rect)
  109.                
  110. #主函数               
  111. def run_time():
  112.         pygame.init()#初始化屏幕screen
  113.         ai_setting=Settings()#实例化
  114.         screen=pygame.display.set_mode((ai_setting.screen_width,ai_setting.screen_height))
  115.         #元组意味着不可以修改
  116.         pygame.display.set_caption("郭真真吃香肠")#标题
  117.         ship=Ship(ai_setting,screen)
  118.         #创建一个存储子弹的编组,借用pygame的子弹pygame.sprite.Group
  119.         bullets=Group()
  120.        
  121.         #捕捉退出机制
  122.         while True:
  123.                 check_event(ai_setting,screen,ship,bullets)
  124.                 #这里需要导入第三方的函数ship作为形式参数。
  125.                 #下面的是刷新界面
  126.                 ship.update()
  127.                 #更新子弹位置
  128.                 bullets.update()
  129.                 #依据键盘输入更改坐标
  130.                 update_screen(ai_setting,ai_setting.bg_color,screen,ship,bullets)
  131.                 # screen.fill(ai_setting.bg_color)#在每次循环的时候自动填充背景               
  132.                 # ship.blitme() #飞船
  133.                 # #让最近的屏幕可视
  134.                 # pygame.display.flip()


  135. run_time()
复制代码


然后运行的时候,左右移动是没有问题的,但是按住空格按键准备射击的时候出现报错,错误如下:

  1. pygame 1.9.4
  2. Hello from the pygame community. https://www.pygame.org/contribute.html
  3. Traceback (most recent call last):
  4.   File "D:\PY\py6\aline_invasion\cha 项目1.py", line 142, in <module>
  5.     run_time()
  6.   File "D:\PY\py6\aline_invasion\cha 项目1.py", line 128, in run_time
  7.     check_event(ai_setting,screen,ship,bullets)
  8.   File "D:\PY\py6\aline_invasion\cha 项目1.py", line 29, in check_event
  9.     check_keydown_events(event,ship,screen,ship,bullets)
  10.   File "D:\PY\py6\aline_invasion\cha 项目1.py", line 14, in check_keydown_events

  11.     new_bullet=Bullet(ai_setting,screen,ship)
  12.   File "D:\PY\py6\aline_invasion\cha 项目1.py", line 98, in __init__
  13.     self.rect=pygame.rect(0,0,ai_setting.bullet_width,ai_setting.bullet_height)

  14. AttributeError: 'Ship' object has no attribute 'bullet_width'

  15. 请按任意键继续. . .

复制代码


求大神告知bug在哪里???感激。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-30 16:08:55 From FishC Mobile | 显示全部楼层
前面的标点错误,应该是逗号而不是.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-30 16:23:45 | 显示全部楼层
BngThea 发表于 2018-12-30 16:08
前面的标点错误,应该是逗号而不是.

大哥 能不能指一下是第几行???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-30 17:41:33 | 显示全部楼层
                        check_keydown_events(event,ship,screen,ship,bullets)
                        check_keydown_events(event,ai_setting,screen,ship,bullets)
这2行才是问题主要
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-30 20:22:27 | 显示全部楼层
塔利班 发表于 2018-12-30 17:41
check_keydown_events(event,ship,screen,ship,bullets)
                       ...

我改成了下面的,然后报错变更了。
  1. #事件检查机制函数
  2. def check_keydown_events(event,ship,screen,bullets,ai_setting):
  3. #按下键盘
  4.         if event.key==pygame.K_RIGHT:
  5.                 ship.moving_right=True
  6.         elif event.key==pygame.K_LEFT:
  7.                 ship.moving_left=True
  8.         elif event.key==pygame.K_SPACE:
  9.                 new_bullet=Bullet(ai_setting,screen,ship)
  10.                 bullets.add(new_bullet)
复制代码

报错变成下面的内容:
  1. pygame 1.9.4
  2. Hello from the pygame community. https://www.pygame.org/contribute.html
  3. Traceback (most recent call last):
  4.   File "D:\PY\py6\aline_invasion\cha 项目1.py", line 141, in <module>
  5.     run_time()
  6.   File "D:\PY\py6\aline_invasion\cha 项目1.py", line 127, in run_time
  7.     check_event(ai_setting,screen,ship,bullets)
  8.   File "D:\PY\py6\aline_invasion\cha 项目1.py", line 29, in check_event
  9.     check_keydown_events(event,ai_setting,screen,ship,bullets)
  10.   File "D:\PY\py6\aline_invasion\cha 项目1.py", line 14, in check_keydown_events

  11.     new_bullet=Bullet(ai_setting,screen,ship)
  12.   File "D:\PY\py6\aline_invasion\cha 项目1.py", line 97, in __init__
  13.     self.rect=pygame.rect(0,0,ai_setting.bullet_width,ai_setting.bullet_height)
  14. AttributeError: 'Group' object has no attribute 'bullet_width'

  15. 请按任意键继续. . .
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-12 18:22:29 | 显示全部楼层
删掉29行
95行 super(Sprite,self)改为super()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 09:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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