先发给他好不好 2019-05-13 19:40 采纳率: 0%
浏览 440

python编程从入门到实践,13.4节,Alien检索不到Settings中的速度设置?

class Settings():
    """存储《外星人入侵的所有设置的类"""

    def __init__(self):
        """初始化游戏的设置"""
        #屏幕设置
        self.screen_width = 1000
        self.screen_height = 700
        self.bg_color = (255,255,255)

        #飞船的设置
        self.ship_speed_factor = 4

        #子弹设置
        self.bullet_speed_factor = 3
        self.bullet_width = 3
        self.bullet_height = 15
        self.bullet_color = 60,60,60
        self.bullets_allowed = 3

        # 外星人设置
        self.alien_speed_factor = 1
        self.fleet_drop_speed = 10
        self.fleet_direction = 1

import sys
import pygame
from pygame.sprite import Group
from settings import Settings
from ship import Ship
from alien import Alien
import game_functions as gf

def run_game():
# 初始化pygame、设置和屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode(
(ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption(("Alien Invasion"))

# 创建一艘飞船
ship = Ship(ai_settings, screen)
# 创建一个用于储存子弹的编组
bullets = Group()
# 创建一个外星人
aliens = Group()

#创建外星人群
gf.create_fleet(ai_settings,screen,ship,aliens)

while True:
    gf.check_event(ai_settings, screen, ship, bullets)
    ship.update()
    gf.update_bullets(bullets)
    gf.update_aliens(aliens)
    gf.update_screen(ai_settings, screen, ship, aliens, bullets)

run_game()

#alien.py

import pygame
from pygame.sprite import Sprite


class Alien(Sprite):
    def __init__(self,ai_settings, screen ):
        """初始化外星人并且设置起始位置"""
        super().__init__()
        self.ai_settings = ai_settings
        self.screen = screen
        #加载外星人图像,并且设置其rect属性
        self.image = pygame.image.load('images/alien.bmp')
        self.rect = self.image.get_rect()

        #每个外星人最初都在屏幕左上角附近
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height

        #存储外星人的准确位置
        self.x = float(self.rect.x)


    def blitme(self):
        """在指定位置绘制外星人"""
        self.screen.blit(self.image, self.rect)

    def check_edges(self):
        """如果外星人出于屏幕边缘,就返回True"""
        screen_rect = self.screen.get_rect()
        if self.rect.right >= screen_rect.right:
            return True
        elif self.rect.left <= 0:
            return True

    def update(self):
        """向左或者右移动的外星人"""
        self.x += self.ai_settings.alien_speed_factor
        self.rect.x = self.x

import sys

import pygame
from bullet import Bullet
from alien import Alien

def check_keydown_events(event, ai_settings, screen, ship, bullets):
"""响应按键"""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
fire_bullet(ai_settings, screen, ship, bullets)

def fire_bullet(ai_settings,screen,ship,bullets):
"""如果没达到限制,就发射一颗子弹"""
# 创建新的子弹,并将其加入到编组bullets中
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)

def check_keyup_events(event,ship):
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False

def check_event(ai_settings, screen, ship, bullets):
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys,exit()

    elif event.type == pygame.KEYDOWN:
        check_keydown_events(event, ai_settings,screen,ship,bullets)

    elif event.type == pygame.KEYUP:
        check_keyup_events(event, ship)

def update_screen(ai_settings,screen,ship,aliens,bullets):
"""更新屏幕上的图像,并切换到新屏幕"""
# 让每次绘制的屏幕都可见
screen.fill(ai_settings.bg_color)
#在飞船和外星人后面重绘所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
aliens.draw(screen)

# 让每次绘制的屏幕都可见
pygame.display.flip()

def update_bullets(bullets):
"""更新子弹位置,并删除已消失的子弹"""
# 更新子弹位置
bullets.update()

for bullet in bullets.copy():
    if bullet.rect.bottom <= 0:
        bullets.remove(bullet)
print(len(bullets))


# 让每次绘制的屏幕都可见
pygame.display.flip()

def get_number_aliens_x(ai_settings, alien_width):
"""计算每行能容纳的外星人"""
available_space_x = ai_settings.screen_width - 2 * alien_width
number_aliens_x = int(available_space_x / (2 * alien_width))
return number_aliens_x

def get_number_rows(ai_settings,ship_height,alien_height):
available_space_y = (ai_settings.screen_height -
(3 * alien_height) - ship_height)
number_rows = int(available_space_y / (2 * alien_height))
return number_rows

def create_aliens(ai_settings, screen, aliens,alien_number,row_number):
"""创建一个外星人置于当行"""
alien = Alien(ai_settings, screen)
alien_width = alien.rect.width
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
aliens.add(alien)

def create_fleet(ai_settings,screen,ship,aliens):
"""创建外星人群"""
# 创建一个外星人,并计算一行可容纳多少个外星人
alien = Alien(ai_settings,screen)
number_aliens_x = get_number_aliens_x(ai_settings,alien.rect.width)
number_rows = get_number_rows(ai_settings,ship.rect.height,alien.rect.height)

for row_number in range(number_rows):
    for alien_number in range(number_aliens_x):
        # 创建一个外星人并将其加入当前行
        create_aliens(alien,screen,aliens,alien_number,row_number)

def update_aliens(aliens):
"""
检查是否外星人位于屏幕边缘,并更新外星人群中所有外星人的位置
"""
aliens.update()

  • 写回答

1条回答 默认 最新

  • 「已注销」 2019-05-13 20:24
    关注

    照着书上敲应该不会错吧,我的就可以运行

    评论

报告相同问题?

悬赏问题

  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试