太空射击小游戏

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()

posted @ 2025-06-17 16:46  kk/  阅读(26)  评论(0)    收藏  举报