首页 > 解决方案 > 外星人移动功能中的pygame python'break loop'导致不同的效果

问题描述

更新:修改代码仍然不正确:

 def edge(self,setting,aliens):  
        for alien in aliens.sprites():
            if alien.x > setting.w or alien.x < 0:
                return True
    def ck_edge(setting,aliens):
        for alien in aliens.sprites():
            if alien.edge(setting,aliens):
                alien.change_direction()
                break    # cant use break here,why

self如果他们不在def edge(setting,aliens):

如何在#<<中调用如何修改这个命令??
def ck_edge(setting,aliens): for alien in aliens.sprites():
if alien.edge(setting,aliens):


我参考这本书让外星人移动,当他们触摸屏幕时向下移动并转向另一个方向。

我创建了我的代码并使其工作,然后我发现与书中的代码有些不同

在我的代码中,函数是:

def ck_edge(setting,aliens):
       for alien in aliens.sprites():
           if alien.x > setting.w:
              alien.change_direction()
           elif alien.x < 0:
              alien.change_direction()

    def change_direction(self):
        self.rect.y +=50
        self.direction *= -1

书中的相同功能是:

 def _check_fleet_edges(self):
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break                       #this break is my question

    def _change_fleet_direction(self):
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

我不知道为什么需要break在这个循环中使用,如果我break在自己的代码中使用,它只会导致一排外星人动作,但在书中这个函数是正确的

为什么在书的代码中需要使用break,我尝试标记break,功能也正确,是什么原因造成的?因为在我的代码中我不能使用'break',因为它只会检查一个if但在书中它是正确的

这是我的代码:

#!/usr/bin/python
import sys
import pygame as p


class Setting():
    def __init__(self,width,height):
        self.w=width
        self.h=height
        self.flag=p.RESIZABLE
        self.screen=p.display.set_mode((self.w,self.h),self.flag)
        p.display.set_caption("Muhaha")


class Alien(p.sprite.Sprite):
    def __init__(self):
        super().__init__()
        pic=p.image.load("../image/ship.jpg").convert_alpha()
        self.image=p.transform.smoothscale(pic,(100,100))
        self.rect=self.image.get_rect()
        self.x = float(self.rect.x)
        self.rect.x=(self.rect.width)
        self.speed=1
        self.direction = 1

    def create(self,setting,aliens):
        spacex=setting.w-(self.rect.x)*2
        spacey=(setting.h)/2-self.rect.y
        alien_number=int(spacex/(2*(self.rect.width)))
        alien_row=int(spacey/(2*(self.rect.height)))
        for row in range(alien_row):
           for number in range(alien_number):
               alien=Alien()
               alien.x=alien.rect.x+2*alien.rect.width*number
               alien.rect.x=alien.x
               alien.rect.y=alien.rect.y+2*alien.rect.height*row
               aliens.add(alien)
    def ck_edge(setting,aliens):
       for alien in aliens.sprites():
           if alien.x > setting.w:
              alien.change_direction()
           elif alien.x < 0:
              alien.change_direction()

    def change_direction(self):
        self.rect.y +=50
        self.direction *= -1

    def update(self):
        self.x += (self.speed*self.direction)
        self.rect.x =self.x
    def position(setting,aliens):
        Alien.ck_edge(setting,aliens)
        aliens.update()
    def blit(setting,aliens):
        aliens.draw(setting.screen)

def game():
    p.init()
    setting=Setting(1200,800)
    alien=Alien()
    aliens=p.sprite.Group()
    alien.create(setting,aliens)
    while True:
         for event in p.event.get():
             if event.type == p.QUIT:
                 sys.exit()
         setting.screen.fill((255,0,0))
         Alien.blit(setting,aliens)
         Alien.position(setting,aliens)
         p.display.flip()
game()

这里是书中的代码(只在屏幕上保持外星人)

#! /usr/bin/python

import sys

import pygame
from pygame.sprite import Sprite

class Settings:

    def __init__(self):
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230, 230, 230)

        self.alien_speed = 1.0
        self.fleet_drop_speed = 10
        self.fleet_direction = 1

class Alien(Sprite):

    def __init__(self, ai_game):
        super().__init__()
        self.screen = ai_game.screen
        self.settings = ai_game.settings

        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 check_edges(self):
        screen_rect = self.screen.get_rect()
        if self.rect.right >= screen_rect.right or self.rect.left <= 0:
            return True

    def update(self):
        self.x += (self.settings.alien_speed *  self.settings.fleet_direction)
        self.rect.x = self.x



class AlienInvasion:
    def __init__(self):
        pygame.init()
        self.settings = Settings()

        self.screen = pygame.display.set_mode((1200, 800), pygame.RESIZABLE)
        self.settings.screen_width = self.screen.get_rect().width
        self.settings.screen_height = self.screen.get_rect().height
        pygame.display.set_caption("Alien Invasion")
        self.aliens = pygame.sprite.Group()
        self._create_fleet()

    def run_game(self):
        while True:
            self._check_events()
            self._update_aliens()
            self._update_screen()

    def _check_events(self):
        """Respond to keypresses and mouse events."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()


    def _update_aliens(self):
        self._check_fleet_edges()
        self.aliens.update()

    def _create_fleet(self):
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        available_space_y = (self.settings.screen_height -
                                (3 * alien_height))
        number_rows = available_space_y // (2 * alien_height)

        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        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
        self.aliens.add(alien)

    def _check_fleet_edges(self):
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _change_fleet_direction(self):
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _update_screen(self):
        self.screen.fill(self.settings.bg_color)
        self.aliens.draw(self.screen)

        pygame.display.flip()


if __name__ == '__main__':
    # Make a game instance, and run the game.
    ai = AlienInvasion()
    ai.run_game()

标签: pythonpygame

解决方案


推荐阅读