外星人入侵地球游戏中,开始游戏的按钮无法显示,如何解决

如题,感谢

import pygame
import sys
from pygame.sprite import Sprite
import time

class Button:
    def __init__(self,ai,words):
        self.screen = ai
        self.rect = pygame.Rect(0,0,100,100)
        self.screen_rect = self.screen.get_rect()
        self.rect.center = self.screen_rect.center
        pygame.draw.rect(self.screen, (255,255,255), self.rect)
        self._prepare_words(words)
    def _prepare_words(self,words):
        font = pygame.font.Font(None,100)
        msg= font.render(words,True,(12,12,21),(0,0,0))
        msg_rect = msg.get_rect()
        msg_rect.center = self.rect.center
        self.screen.blit(msg, msg_rect)
class Alien(Sprite):
    def __init__(self, ai_game):
        super().__init__()
        self.screen = ai_game.screen
        self.screen_rect = self.screen.get_rect()
        self.settings = Settings()
        self.image = pygame.image.load("D:\python\ship.bmp")
        self.rect = self.image.get_rect()
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height

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

    def check_edges(self):
        if self.rect.right >= self.screen_rect.right or self.rect.left <= 0:
            self.settings.fleet_direction *= -1
            self.rect.y += 25


class Bullet(Sprite):
    def __init__(self, ai_game):
        super().__init__()
        self.screen = ai_game.screen
        self.settings = Settings()
        self.ship = Ship(ai_game)
        self.rect = pygame.Rect(0, 0, self.settings.bullet_width, self.settings.bullet_height)

    def show(self):
        pygame.draw.rect(self.screen, self.settings.bullet_color, self.rect)

    def move(self):
        self.rect.centery -= self.settings.bullet_speed


class Settings:
    """存储游戏设置的类"""

    def __init__(self):
        self.screen_width = 800
        self.screen_height = 800
        self.bg_color = (230, 230, 230)
        self.ship_speed = 1
        self.bullet_width = 10
        self.bullet_height = 10
        self.bullet_color = (60, 60, 60)
        self.bullet_speed = 0.1
        self.alien_speed = 1
        self.fleet_drop_speed = 1
        self.fleet_direction = 1
        self.ship_lives = 3


class Ship:
    """控制飞船的类"""

    def __init__(self, ai_game):
        self.screen = ai_game.screen
        self.screen_rect = ai_game.screen.get_rect()
        self.settings = Settings()
        self.ship_image = pygame.image.load("D:\python\ship.bmp")
        self.rect = self.ship_image.get_rect()
        self.rect.midbottom = self.screen_rect.midbottom
        self.moving_right = False
        self.moving_left = False

    def show(self):
        self.screen.blit(self.ship_image, self.rect)

    def move(self):
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.rect.centerx += self.settings.ship_speed
        if self.moving_left and self.rect.left > self.screen_rect.left:
            self.rect.centerx -= self.settings.ship_speed


class AlienInvasion:
    """操控游戏的主类"""

    def __init__(self):
        pygame.init()
        self.settings = Settings()
        self.bullets = pygame.sprite.Group()
        self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
        self.ship = Ship(self)
        self.aliens = pygame.sprite.Group()
        self.create_fleets()
        self.active = True
        pygame.display.set_caption("飞机大站")

    def update_aliens(self):
        self.aliens.update()

    def create_fleets(self):
        b = Ship(self)
        a = Alien(self)
        available_space_x = self.settings.screen_width - a.rect.width * 2
        available_space_y = self.settings.screen_height - b.rect.height - 3 * a.rect.height
        number_rows = available_space_y // (a.rect.height * 2)
        number_aliens = available_space_x // (a.rect.width)
        for row in range(number_rows):
            for i in range(number_aliens):
                alien = Alien(self)
                alien.rect.x = alien.rect.width + i * alien.rect.width
                alien.rect.y = alien.rect.height + row * alien.rect.height
                self.aliens.add(alien)

    def check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    self.fire_bullets()
                if event.key == pygame.K_RIGHT:
                    self.ship.moving_right = True
                if event.key == pygame.K_LEFT:
                    self.ship.moving_left = True

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_SPACE:
                    self.fire_bullets()
                if event.key == pygame.K_RIGHT:
                    self.ship.moving_right = False
                if event.key == pygame.K_LEFT:
                    self.ship.moving_left = False

    def fire_bullets(self):
        a_bullet = Bullet(self)
        a_bullet.rect.midtop = self.ship.rect.midtop
        self.bullets.add(a_bullet)

    def update_events(self):
        self.screen.fill(self.settings.bg_color)
        self.ship.show()
        self.aliens.draw(self.screen)
        for bullet in self.bullets.sprites():
            bullet.show()
            bullet.move()
        pygame.display.flip()

    def ship_collide(self):
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self.aliens.empty()
            self.settings.ship_lives -= 1
            time.sleep(1)
            self.create_fleets()

    def aliens_bottom(self):
        for alien in self.aliens.sprites():
            if alien.rect.y >= self.settings.screen_height:
                self.aliens.remove(alien)
                self.aliens.empty()
                self.settings.ship_lives -= 1
                time.sleep(1)
                self.create_fleets()

    def ship_alive(self):
        if self.settings.ship_lives == 0:
            self.active = True

    def run_game(self):
        while True:

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
            if not self.active:
                self.button_play.create_words("Play")
            else:
                break
        while self.active:
            self.check_events()
            self.ship.move()
            for bullet in self.bullets.copy():
                if bullet.rect.top < 0:
                    self.bullets.remove(bullet)
            for alien in self.aliens.sprites():
                alien.check_edges()

            collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)
            if not self.aliens:
                self.create_fleets()
            self.ship_alive()
            self.ship_collide()
            self.aliens_bottom()
            self.update_aliens()
            self.update_events()
    def game_state(self):
        while True:
            self.play_button = Button(self.screen, "Play")
            self.check_events()



ai = AlienInvasion()
ai.game_state()
ai.run_game()


这个程序中的Button类实现了一个矩形按钮,但是并没有显示出来。您的问题是如何让按钮显示出来。
Button类中的代码没有问题,问题在于这个类并没有在游戏主循环中被使用。您需要在游戏主循环中添加下面这行代码,以显示按钮:




```Copy code
play_button = Button(screen, "Play")
这行代码会创建一个名为play_button的按钮,并将其显示在屏幕上。您需要将这行代码添加到游戏主循环的while循环中,具体位置应该是在屏幕刷新之前。例如:
蟒复制代码
    # 检查事件
    gf.check_events()

    # 更新游戏状态
    ...

    # 绘制屏幕
    ...

    # 显示按钮
    play_button = Button(screen, "Play")

    # 刷新屏幕
    pygame.display.flip()
注意,这个程序中的按钮没有实现任何功能,因此点击按钮并不会有任何效果。如果您想为按钮添加功能,您需要在Button类中添加一个click方法,并在check_events方法中检查鼠标点击事件是否发生在按钮上。
- 

1. ****


以下答案引用自GPT-3大模型,请合理使用:

import pygame
 
WIDTH = 800
HEIGHT = 800
FPS = 60
 
# define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)    
 
# initialize pygame and create window
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Alien Invasion")
clock = pygame.time.Clock()
 
class Button:
    def __init__(self, ai_game, words, x, y):
        self.screen = ai_game.screen
        self.screen_rect = self.screen.get_rect()
        self.rect = pygame.Rect(0, 0, 100, 100)
        self.rect.x = x
        self.rect.y = y
        pygame.draw.rect(self.screen, RED, self.rect)
        self._prepare_words(words)
 
    def _prepare_words(self, words):
        font = pygame.font.Font(None, 100)
        msg = font.render(words, True, (12, 12, 21), (0, 0, 0))
        msg_rect = msg.get_rect()
        msg_rect.center = self.rect.center
        self.screen.blit(msg, msg_rect)
 
    def check_clicked(self, position):
        if self.rect.collidepoint(position):
            return True
        else:
            return False
 
def game_state():
    intro = True
    while intro:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = event.pos
                if button.check_clicked(mouse_pos):
                    print("Clicked!")
                    intro = False
        screen.fill(WHITE)
        button.show()
        pygame.display.update()
 
# Game loop
running = True
button = Button(ai_game, "Play", WIDTH/2-50, HEIGHT/2-50)
while running:
    game_state()
 
    # keep loop running at the right speed
    clock.tick(FPS)
    # Process input (events)
    for event in pygame.event.get():
        # check for closing window
        if event.type == pygame.QUIT:
            running = False
 
 
pygame.quit()

如果我的回答解决了您的问题,请采纳我的回答