太空射击小游戏
import pygame
import random
import sys
初始化 Pygame
pygame.init()
屏幕设置
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("太空射击游戏——包小棵")
颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
玩家飞船
player_img = pygame.Surface((50, 40))
player_img.fill(BLUE)
player_x = WIDTH // 2 - 25
player_y = HEIGHT - 60
player_speed = 5
子弹
bullets = []
bullet_speed = 7
bullet_width = 5
bullet_height = 15
敌机
enemies = []
enemy_speed = 2
enemy_width = 40
enemy_height = 40
enemy_spawn_rate = 30 # 数值越小,敌机出现越频繁
游戏状态
score = 0
lives = 3
game_over = False
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 36)
def draw_player(x, y):
screen.blit(player_img, (x, y))
def fire_bullet(x, y):
bullets.append([x + 22, y]) # 调整子弹位置,使其从飞船中心发射
def draw_bullets():
for bullet in bullets:
pygame.draw.rect(screen, GREEN, (bullet[0], bullet[1], bullet_width, bullet_height))
def move_bullets():
for bullet in bullets[:]:
bullet[1] -= bullet_speed
if bullet[1] < 0:
bullets.remove(bullet)
def spawn_enemy():
x = random.randint(0, WIDTH - enemy_width)
y = -enemy_height
enemies.append([x, y])
def draw_enemies():
for enemy in enemies:
pygame.draw.rect(screen, RED, (enemy[0], enemy[1], enemy_width, enemy_height))
def move_enemies():
for enemy in enemies[:]:
enemy[1] += enemy_speed
if enemy[1] > HEIGHT:
enemies.remove(enemy)
def check_bullet_collision():
global score
for bullet in bullets[:]:
for enemy in enemies[:]:
if (bullet[0] < enemy[0] + enemy_width and
bullet[0] + bullet_width > enemy[0] and
bullet[1] < enemy[1] + enemy_height and
bullet[1] + bullet_height > enemy[1]):
bullets.remove(bullet)
enemies.remove(enemy)
score += 10
break
def check_player_collision():
global lives, game_over
for enemy in enemies[:]:
if (player_x < enemy[0] + enemy_width and
player_x + 50 > enemy[0] and
player_y < enemy[1] + enemy_height and
player_y + 40 > enemy[1]):
enemies.remove(enemy)
lives -= 1
if lives <= 0:
game_over = True
def show_game_stats():
score_text = font.render(f"得分: {score}", True, WHITE)
lives_text = font.render(f"生命: {lives}", True, WHITE)
screen.blit(score_text, (10, 10))
screen.blit(lives_text, (10, 50))
def show_game_over():
game_over_text = font.render("游戏结束! 按 R 键重新开始", True, WHITE)
screen.blit(game_over_text, (WIDTH // 2 - 180, HEIGHT // 2 - 18))
游戏主循环
running = True
while running:
screen.fill(BLACK) # 清屏
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE and not game_over:
fire_bullet(player_x, player_y)
if event.key == pygame.K_r and game_over:
# 重置游戏
game_over = False
score = 0
lives = 3
bullets = []
enemies = []
player_x = WIDTH // 2 - 25
player_y = HEIGHT - 60
if not game_over:
# 玩家移动
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and player_x > 0:
player_x -= player_speed
if keys[pygame.K_RIGHT] and player_x < WIDTH - 50:
player_x += player_speed
# 随机生成敌机
if random.randint(1, enemy_spawn_rate) == 1:
spawn_enemy()
# 更新子弹和敌机
move_bullets()
move_enemies()
# 检测碰撞
check_bullet_collision()
check_player_collision()
# 绘制游戏元素
draw_player(player_x, player_y)
draw_bullets()
draw_enemies()
show_game_stats()
if game_over:
show_game_over()
pygame.display.flip() # 更新屏幕
clock.tick(60) # 60 FPS
pygame.quit()
sys.exit()