import pygameimport randomimport sys# 初始化pygamepygame.init()# 游戏窗口尺寸WIDTH = 480HEIGHT = 600screen = pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption("打飞机小游戏")# 颜色定义BLACK = (0, 0, 0)WHITE = (255, 255, 255)RED = (255, 0, 0)GREEN = (0, 255, 0)BLUE = (0, 120, 255)YELLOW = (255, 255, 0)# 游戏时钟clock = pygame.time.Clock()FPS = 60# 玩家飞机类class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((50, 40))
self.image.fill(BLUE)
# 绘制飞机形状
pygame.draw.polygon(self.image, WHITE, [(25, 0), (0, 40), (50, 40)])
pygame.draw.rect(self.image, BLUE, (15, 15, 20, 25))
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH // 2
self.rect.bottom = HEIGHT - 10
self.speed = 8
self.health = 100
def update(self):
# 获取按键
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect.x -= self.speed if keys[pygame.K_RIGHT] and self.rect.right < WIDTH:
self.rect.x += self.speed if keys[pygame.K_UP] and self.rect.top > 0:
self.rect.y -= self.speed if keys[pygame.K_DOWN] and self.rect.bottom < HEIGHT:
self.rect.y += self.speed
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)# 敌机类class Enemy(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((30, 30))
self.image.fill(RED)
# 绘制敌机形状
pygame.draw.polygon(self.image, YELLOW, [(15, 0), (0, 30), (30, 30)])
self.rect = self.image.get_rect()
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 5)
self.speedx = random.randrange(-2, 2)
def update(self):
self.rect.y += self.speedy
self.rect.x += self.speedx # 如果敌机飞出屏幕底部或侧面,重新生成一个
if self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 25:
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 5)
self.speedx = random.randrange(-2, 2)# 子弹类class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((5, 15))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.bottom = y
self.speedy = -10
def update(self):
self.rect.y += self.speedy # 如果子弹飞出屏幕顶部,删除它
if self.rect.bottom < 0:
self.kill()# 爆炸效果类class Explosion(pygame.sprite.Sprite):
def __init__(self, center):
super().__init__()
self.size = 30
self.image = pygame.Surface((self.size, self.size))
self.image.fill(YELLOW)
self.rect = self.image.get_rect()
self.rect.center = center
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == 8:
self.kill()
else:
self.size = max(5, 30 - self.frame * 4)
old_center = self.rect.center
self.image = pygame.Surface((self.size, self.size))
self.image.fill(YELLOW)
self.rect = self.image.get_rect()
self.rect.center = old_center# 创建精灵组all_sprites = pygame.sprite.Group()enemies = pygame.sprite.Group()bullets = pygame.sprite.Group()# 创建玩家player = Player()all_sprites.add(player)# 创建敌机for i in range(8):
enemy = Enemy()
all_sprites.add(enemy)
enemies.add(enemy)# 分数score = 0font = pygame.font.SysFont('arial', 24)# 游戏主循环running = Truewhile running:
# 保持游戏运行的速度
clock.tick(FPS)
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
player.shoot()
# 更新所有精灵
all_sprites.update()
# 检查子弹是否击中敌机
hits = pygame.sprite.groupcollide(enemies, bullets, True, True)
for hit in hits:
score += 10
explosion = Explosion(hit.rect.center)
all_sprites.add(explosion)
enemy = Enemy()
all_sprites.add(enemy)
enemies.add(enemy)
# 检查敌机是否撞到玩家
hits = pygame.sprite.spritecollide(player, enemies, True)
for hit in hits:
player.health -= 20
explosion = Explosion(hit.rect.center)
all_sprites.add(explosion)
enemy = Enemy()
all_sprites.add(enemy)
enemies.add(enemy)
if player.health <= 0:
running = False
# 渲染
screen.fill(BLACK)
all_sprites.draw(screen)
# 显示分数
score_text = font.render(f'分数: {score}', True, WHITE)
screen.blit(score_text, (10, 10))
m.ddjrszb.com
wap.ddjrszb.com
tsl.ddjrszb.com
gov.ddjrszb.com
govzb.ddjrszb.com
vip.ddjrszb.com
gcdr.ddjrszb.com
ddjrszb.cn
m.ddjrszb.cn
wap.ddjrszb.cn
tsl.ddjrszb.cn
# 显示生命值
health_text = font.render(f'生命值: {player.health}', True, WHITE)
screen.blit(health_text, (10, 40))
# 显示控制说明
controls_text = font.render('方向键移动, 空格键射击', True, WHITE)
screen.blit(controls_text, (WIDTH // 2 - controls_text.get_width() // 2, HEIGHT - 30))
# 刷新屏幕
pygame.display.flip()# 游戏结束pygame.quit()sys.exit()