Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python速成课程,第二版。侧身射手。外星人一直向下移动,直到第一排撞到底部_Python_Loops_Pygame - Fatal编程技术网

Python速成课程,第二版。侧身射手。外星人一直向下移动,直到第一排撞到底部

Python速成课程,第二版。侧身射手。外星人一直向下移动,直到第一排撞到底部,python,loops,pygame,Python,Loops,Pygame,你好,我正在努力让我的侧身射击游戏加速。但是当我试图将外星人舰队向下移动到左边时,我遇到了一个问题。我已经设置了self.rect.bottom>=屏幕\u rect.bottom。但是这个代码只对我的第一排外星人做出响应。我尝试设置一个数值,但这并没有给我想要的结果。非常感谢您的帮助 这是我给外星人的密码: 外星人 def check_edges(self): """Return True if alien is at edge of screen.&qu

你好,我正在努力让我的侧身射击游戏加速。但是当我试图将外星人舰队向下移动到左边时,我遇到了一个问题。我已经设置了
self.rect.bottom>=屏幕\u rect.bottom
。但是这个代码只对我的第一排外星人做出响应。我尝试设置一个数值,但这并没有给我想要的结果。非常感谢您的帮助

这是我给外星人的密码:

外星人

def check_edges(self):
    """Return True if alien is at edge of screen."""
    screen_rect = self.screen.get_rect()
    if self.rect.bottom >= screen_rect.bottom or self.rect.top <= 0:
        return True

def update(self):
    """Move the alien up or down."""
    self.y += (self.settings.alien_speed *
                    self.settings.fleet_direction)

    self.rect.y = self.y

您的
for
-循环在第一个外星人之后立即中断

用于self.异形.sprites()中的异形:
如果是外星人。请检查_边()
自我改变车队方向()
打破
break
语句必须位于
if
-语句的代码块中。这是个问题

用于self.异形.sprites()中的异形:
如果是外星人。请检查_边()
自我改变车队方向()
打破

我建议您的代码更加健壮。如果外星人到达顶端,新的舰队方向应该是向下的。如果外星人到达底部,新的舰队方向应该是向上的

编写一个方法
\u设置车队方向
,而不是
\u更改车队方向
。该方法有一个指示新方向的
方向
参数。向下的参数必须为1,向上的参数必须为-1。新的
fleet\u方向可以用当前绝对值()乘以新方向来计算:

def设置车队方向(自身,方向):
self.settings.fleet\u方向=abs(self.settings.fleet\u方向)*方向
根据范围检查设置方向:

def\u check\u fleet\u边缘(自):
“”“如果有外星人到达边缘,请做出适当的反应。”“”
screen\u rect=self.screen.get\u rect()
对于自我中的外星人。外星人。精灵()
如果alien.top=屏幕右下角
自我。_设置_车队_方向(-1)#新方向向上
打破

所以我终于找到了解决方案。 这很有效,但我不确定这是最好的方法。 我最终还是保留了那本书
def\u更改车队方向(自身):

我应该将其保留为自己的帮助函数,还是可以将其包含在
def\u set\u fleet\u方向(self,direction):

我觉得这个游戏比我原来的外星人入侵游戏落后了一点

有什么建议吗

这就是我最终得到的解决方案:

def _check_fleet_edges(self):
    screen_rect = self.screen.get_rect()
    for alien in self.aliens.sprites():
        
        if alien.rect.top <= screen_rect.top:
            self._set_fleet_direction(1)  # new direction is down
            break

        elif alien.rect.bottom >= screen_rect.bottom:
            self._set_fleet_direction(-1) # new direction is up
            break

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


def _change_fleet_direction(self):
    """Moving the aliens left"""
    for alien in self.aliens.sprites():
        alien.rect.x -= self.settings.fleet_left_speed

def _set_fleet_direction(self, direction):
    self.settings.fleet_direction = abs(self.settings.fleet_direction) *     
    direction
def\u check\u fleet\u边缘(自):
screen\u rect=self.screen.get\u rect()
对于自我中的外星人。外星人。精灵()
如果alien.rect.top=屏幕_rect.bottom:
自我。_设置_车队_方向(-1)#新方向向上
打破
对于自我中的外星人。外星人。精灵()
如果是外星人。请检查_边()
自我改变车队方向()
打破
def_更改车队方向(自我):
“向左移动外星人”
对于自我中的外星人。外星人。精灵()
alien.rect.x-=self.settings.fleet\u left\u速度
def设置车队方向(自身,方向):
self.settings.fleet\u direction=abs(self.settings.fleet\u direction)*
方向

是的,谢谢。我两个都试过了,也许我应该说明一下。如果我打破了if语句中的循环,我的外星人就不会向下移动。他们只是直接向左移动。还有什么我需要更改的吗?@Vegpy如果最上面的外星人的顶部坐标在开始时为0,舰队将立即更改方向,因为
self.rect.top@Vegpy我在答案中添加了一些建议。非常感谢您的帮助。我不得不对你的代码进行一些修改以使其正常工作,但我真的不知道我在做什么。我发布了最终成为我的解决方案的内容,它很有效,但我对此不太自信。如果你能看一看,给我一些建议,那将是惊人的。
def _check_fleet_edges(self):
    screen_rect = self.screen.get_rect()
    for alien in self.aliens.sprites():
        
        if alien.rect.top <= screen_rect.top:
            self._set_fleet_direction(1)  # new direction is down
            break

        elif alien.rect.bottom >= screen_rect.bottom:
            self._set_fleet_direction(-1) # new direction is up
            break

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


def _change_fleet_direction(self):
    """Moving the aliens left"""
    for alien in self.aliens.sprites():
        alien.rect.x -= self.settings.fleet_left_speed

def _set_fleet_direction(self, direction):
    self.settings.fleet_direction = abs(self.settings.fleet_direction) *     
    direction