到达屏幕底部时游戏结束

问题描述 投票:0回答:1

这个游戏的重点是射击敌方船只。我需要添加一个损失条件。它包括这样的事实:当敌人到达屏幕底部后,游戏应该停止,子弹和敌人将从屏幕上消失。几秒钟后一切都会恢复 enter image description here

import pygame
import sys
from pygame.sprite import Group

pygame.init()

# screen parameters
height, width = 800, 650 
screen = pygame.display.set_mode((width, height))


# player
class Ship:
    def __init__(self, screen):
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.rect = pygame.Rect(300, 710, 80, 80)#creating a players square
        self.color = (255, 255, 255)

        self.move_left = False
        self.move_right = False

    def move(self):
        if self.move_left == True: #the True/False assignment condition occurs in the main game loop
            self.rect.centerx -= 1
        elif self.move_right == True:
            self.rect.centerx += 1
        if self.rect.right >= 650:
            self.rect.right = 650
        elif self.rect.left <= 0:
            self.rect.left = 0

    def output_s(self):
        pygame.draw.rect(self.screen, self.color, self.rect)


# bullets
class Bullet(pygame.sprite.Sprite):
    def __init__(self, screen, my_ship):
        super(Bullet, self).__init__()
        self.screen = screen
        self.rect = pygame.Rect(0, 0, 100, 10) #creating a bullet 
        self.speed = 5
        self.rect.centerx = my_ship.rect.centerx #bullet spawn coordinates
        self.rect.top = my_ship.rect.top
        self.y = self.rect.y

    def update(self):
        """bullet movement"""
        self.y -= self.speed
        self.rect.y = self.y

    def draw_bullet(self):
        pygame.draw.rect(self.screen, (255, 255, 255), self.rect)


# enemies
class Enemy(pygame.sprite.Sprite):
    def __init__(self, screen):
        super(Enemy, self).__init__()
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.rect = pygame.Rect(0, 0, 70, 70)
        self.rect.top = self.screen_rect.top
        self.rect.centerx = self.screen_rect.centerx
        self.x = float(self.rect.x)
        self.y = float(self.rect.y)

    def output_e(self):
        pygame.draw.rect(self.screen, (255, 255, 255), self.rect)

    def update(self):
        self.y += 0.1
        self.rect.y = self.y


# objects of classes and groups
my_ship = Ship(screen)
bullets = Group()
enemys = Group()

# creating a row of enemies 
def create_enemy(screen, enemys, width):
    enemy_width = Enemy(screen).rect.width
    e_numbers = (width - 50) // enemy_width #numbers of enemies in row
    for i in range(e_numbers):
        enemy = Enemy(screen)
        enemy.x = 25 + (enemy_width + 25) * i #distance of ships from each other
        enemy.rect.x = enemy.x
        enemys.add(enemy) #adding an enemy to in row-group


# bullets movement and bullets collision with enemies
def update_bullets(bullets, enemys):
    bullets.update()
    collision = pygame.sprite.groupcollide(bullets, enemys, True, True) #collision between enemy and bullet
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet) #remove a bullet that reaches the bottom of the screen


# rendering of bullets, player and enemies on the screen
def screen_update(screen, enemys, bullets):
    screen.fill((0, 0, 0))
    for enemy in enemys:
        enemy.output_e()
    for bullet in bullets:
        bullet.draw_bullet()
    my_ship.output_s()
    my_ship.move() #calling a move method
    pygame.display.flip()

#GAME LOOP
def main():
    create_enemy(screen, enemys, width)  #rendering a first row of enemies
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a:
                    my_ship.move_left = True
                elif event.key == pygame.K_d:
                    my_ship.move_right = True
                # shooting, creating a new bullet when pressing SPACE
                elif event.key == pygame.K_SPACE:

                    new_bullet = Bullet(screen, my_ship)
                    bullets.add(new_bullet)

            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_a:
                    my_ship.move_left = False
                elif event.key == pygame.K_d:
                    my_ship.move_right = False


        #creating rows following each other
        last_enemy = enemys.sprites()[-1] #tracking the last row that appeared
        if enemys and last_enemy.rect.y >= 100:
            create_enemy(screen, enemys, width)

        enemys.update() #enemies movement
        update_bullets(bullets, enemys) #bullets movement and bullets collision
        screen_update(screen, enemys, bullets) #rendering objects on screen and screen update


if __name__ == "__main__":
    main()

我试图提出这样的条件。但第一排总是被追踪,游戏结束,即使它被彻底摧毁。

for enemy in enemys.sprites():
    if enemy.rect.bottom >= screen.get_rect().bottom:
        #game_over

即使没有行到达屏幕末尾,game_over 的条件也有效

pygame
1个回答
-1
投票

您的代码不起作用的原因是因为窗外存在敌人。这就是为什么当没有敌人存在时你的代码会触发——你只是看不到他们。通过将

for i in range(e_numbers)
更改为
for i in range(e_numbers - 1)
,如原始帖子的评论所述,此问题得到解决。下面是在敌人到达底部后暂停游戏两秒钟并向用户显示消息的固定代码。

import pygame
import sys
from pygame.sprite import Group

pygame.init()

# screen parameters
height, width = 800, 650 
screen = pygame.display.set_mode((width, height))


# player
class Ship:
    def __init__(self, screen):
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.rect = pygame.Rect(300, 710, 80, 80)#creating a players square
        self.color = (255, 255, 255)

        self.move_left = False
        self.move_right = False

    def move(self):
        if self.move_left == True: #the True/False assignment condition occurs in the main game loop
            self.rect.centerx -= 1
        elif self.move_right == True:
            self.rect.centerx += 1
        if self.rect.right >= 650:
            self.rect.right = 650
        elif self.rect.left <= 0:
            self.rect.left = 0

    def output_s(self):
        pygame.draw.rect(self.screen, self.color, self.rect)


# bullets
class Bullet(pygame.sprite.Sprite):
    def __init__(self, screen, my_ship):
        super(Bullet, self).__init__()
        self.screen = screen
        self.rect = pygame.Rect(0, 0, 100, 10) #creating a bullet 
        self.speed = 5
        self.rect.centerx = my_ship.rect.centerx #bullet spawn coordinates
        self.rect.top = my_ship.rect.top
        self.y = self.rect.y

    def update(self):
        """bullet movement"""
        self.y -= self.speed
        self.rect.y = self.y

    def draw_bullet(self):
        pygame.draw.rect(self.screen, (255, 255, 255), self.rect)


# enemies
class Enemy(pygame.sprite.Sprite):
    def __init__(self, screen):
        super(Enemy, self).__init__()
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.rect = pygame.Rect(0, 0, 70, 70)
        self.rect.top = self.screen_rect.top
        self.rect.centerx = self.screen_rect.centerx
        self.x = float(self.rect.x)
        self.y = float(self.rect.y)

    def output_e(self):
        pygame.draw.rect(self.screen, (255, 255, 255), self.rect)

    def update(self):
        """Update enemy position and check if it has passed the bottom of the screen.

        Returns:
            bool: True if enemy is past the bottom of the screen, False if it is still valid.
        """
        self.y += 0.1
        self.rect.y = self.y
        if self.y > pygame.display.get_surface().get_height():
            return True
        return False

# objects of classes and groups
my_ship = Ship(screen)
bullets = Group()
enemys = Group()

# creating a row of enemies 
def create_enemy(screen, enemys, width):
    enemy_width = Enemy(screen).rect.width
    e_numbers = (width - 50) // enemy_width #numbers of enemies in row
    for i in range(e_numbers - 1):
        enemy = Enemy(screen)
        enemy.x = 25 + (enemy_width + 25) * i #distance of ships from each other
        enemy.rect.x = enemy.x
        enemys.add(enemy) #adding an enemy to in row-group


# bullets movement and bullets collision with enemies
def update_bullets(bullets, enemys:Group):
    bullets.update()
    collision = pygame.sprite.groupcollide(bullets, enemys, True, True) #collision between enemy and bullet
    for intersection in collision:
        enemys.remove(collision.get(intersection))
    for bullet in bullets:
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet) #remove a bullet that reaches the bottom of the screen


# rendering of bullets, player and enemies on the screen
def screen_update(screen, enemys, bullets):
    screen.fill((0, 0, 0))
    for enemy in enemys:
        enemy.output_e()
    for bullet in bullets:
        bullet.draw_bullet()
    my_ship.output_s()
    my_ship.move() #calling a move method
    pygame.display.flip()

def pause():
    frame = 0
    clock = pygame.time.Clock()

    #show game over message (or whatever else you want here!)
    game_over = pygame.font.Font(pygame.font.get_default_font(), 50).render('GAME OVER!', False, (250, 20, 20), (20, 20, 20))
    pygame.display.get_surface().blit(game_over, (pygame.display.get_surface().get_width() / 2 - game_over.get_width() / 2, pygame.display.get_surface().get_height() / 2 - game_over.get_height() / 2))
    pygame.display.flip()

    #wait for two seconds
    while frame < 60:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        frame += 1
        clock.tick(30)

#GAME LOOP
def main():
    global enemys
    reset = False

    while True:
            #reset groups
            bullets = Group()
            enemys = Group()
            create_enemy(screen, enemys, width)  #rendering a first row of enemies

            while not reset:
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        sys.exit()
                    if event.type == pygame.KEYDOWN:
                        if event.key == pygame.K_a:
                            my_ship.move_left = True
                        elif event.key == pygame.K_d:
                            my_ship.move_right = True
                        # shooting, creating a new bullet when pressing SPACE
                        elif event.key == pygame.K_SPACE:

                            new_bullet = Bullet(screen, my_ship)
                            bullets.add(new_bullet)

                    elif event.type == pygame.KEYUP:
                        if event.key == pygame.K_a:
                            my_ship.move_left = False
                        elif event.key == pygame.K_d:
                            my_ship.move_right = False


                #creating rows following each other
                last_enemy = enemys.sprites()[-1] #tracking the last row that appeared
                if enemys and last_enemy.rect.y >= 100:
                    create_enemy(screen, enemys, width)

                update_bullets(bullets, enemys) #bullets movement and bullets collision
                for enemy in enemys:
                    if enemy.update(): #enemies movement
                        reset = True
                        continue
                screen_update(screen, enemys, bullets) #rendering objects on screen and screen update

            pause()
            reset = False       #game is no longer being reset


if __name__ == "__main__":
    main()

希望这对您有所帮助,如果您对此有任何疑问,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.