|
|
发表于 2025-7-10 14:48:50
|
显示全部楼层
import pygame
import random
import math
# 初始化Pygame
pygame.init()
# 设置窗口大小
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
# 玩家类
class Player:
def __init__(self):
self.x = WIDTH // 2
self.y = HEIGHT // 2
self.width = 50
self.height = 50
self.zoomed = False
def draw(self, screen):
pygame.draw.rect(screen, WHITE, (self.x, self.y, self.width, self.height))
def aim(self, target_x, target_y):
if self.zoomed:
target_x = (target_x - self.x) * 0.5 + self.x
target_y = (target_y - self.y) * 0.5 + self.y
pygame.draw.line(screen, RED, (self.x + self.width // 2, self.y + self.height // 2), (target_x, target_y), 1)
return (target_x, target_y)
return None
# 子弹类
class Bullet:
def __init__(self, x, y, target_x, target_y):
self.x = x
self.y = y
self.speed = 10
dx = target_x - x
dy = target_y - y
distance = math.hypot(dx, dy)
self.dx = (dx / distance) * self.speed
self.dy = (dy / distance) * self.speed
def move(self):
self.x += self.dx
self.y += self.dy
def draw(self, screen):
pygame.draw.circle(screen, RED, (int(self.x), int(self.y)), 5)
# 敌人基类
class Enemy:
def __init__(self, x, y, width, height, health, speed):
self.x = x
self.y = y
self.width = width
self.height = height
self.health = health
self.speed = speed
def move(self):
# 随机移动敌人
self.x += random.choice([-self.speed, self.speed])
self.y += random.choice([-self.speed, self.speed])
# 确保敌人在窗口内
self.x = max(0, min(WIDTH - self.width, self.x))
self.y = max(0, min(HEIGHT - self.height, self.y))
def draw(self, screen):
pygame.draw.rect(screen, GREEN, (self.x, self.y, self.width, self.height))
# 敌人类型
class FastEnemy(Enemy):
def __init__(self):
super().__init__(random.randint(0, WIDTH), random.randint(0, HEIGHT), 40, 40, health=1, speed=3)
class StrongEnemy(Enemy):
def __init__(self):
super().__init__(random.randint(0, WIDTH), random.randint(0, HEIGHT), 60, 60, health=3, speed=2)
class TankEnemy(Enemy):
def __init__(self):
super().__init__(random.randint(0, WIDTH), random.randint(0, HEIGHT), 80, 80, health=5, speed=1)
# 游戏类
class Game:
def __init__(self):
self.clock = pygame.time.Clock()
self.player = Player()
self.bullets = []
self.enemies = []
self.score = 0
self.font = pygame.font.Font(None, 36)
self.level = 1
self.enemy_count = 5 # 每个关卡的敌人数量
self.spawn_enemies()
def spawn_enemies(self):
self.enemies = []
for _ in range(self.enemy_count):
enemy_type = random.choice([FastEnemy, StrongEnemy, TankEnemy])
self.enemies.append(enemy_type())
def draw_score(self):
score_text = self.font.render(f"Score: {self.score}", True, WHITE)
level_text = self.font.render(f"Level: {self.level}", True, WHITE)
screen.blit(score_text, (10, 10))
screen.blit(level_text, (10, 40))
def next_level(self):
self.level += 1
self.enemy_count += 2 # 每个关卡增加2个敌人
self.spawn_enemies()
def run(self):
running = True
while running:
screen.fill(BLACK)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_w]: # 上
self.player.y -= 5
if keys[pygame.K_s]: # 下
self.player.y += 5
if keys[pygame.K_a]: # 左
self.player.x -= 5
if keys[pygame.K_d]: # 右
self.player.x += 5
if keys[pygame.K_z]: # 开镜
self.player.zoomed = True
if keys[pygame.K_x]: # 关镜
self.player.zoomed = False
mouse_x, mouse_y = pygame.mouse.get_pos()
# 绘制玩家
self.player.draw(screen)
aim_target = self.player.aim(mouse_x, mouse_y)
# 射击子弹
if keys[pygame.K_SPACE] and aim_target:
bullet = Bullet(self.player.x + self.player.width // 2, self.player.y + self.player.height // 2, aim_target[0], aim_target[1])
self.bullets.append(bullet)
# 更新和绘制子弹
for bullet in self.bullets[:]:
bullet.move()
bullet.draw(screen)
# 移除出屏幕的子弹
if bullet.x < 0 or bullet.x > WIDTH or bullet.y < 0 or bullet.y > HEIGHT:
self.bullets.remove(bullet)
else:
# 检测子弹与敌人碰撞
for enemy in self.enemies[:]:
if (bullet.x >= enemy.x and bullet.x <= enemy.x + enemy.width and
bullet.y >= enemy.y and bullet.y <= enemy.y + enemy.height):
self.bullets.remove(bullet)
enemy.health -= 1
# 如果敌人生命值为0,就移除敌人
if enemy.health <= 0:
self.enemies.remove(enemy)
self.score += 1 # 增加得分
# 更新和绘制敌人
for enemy in self.enemies[:]:
enemy.move()
enemy.draw(screen)
# 检查是否击杀所有敌人
if not self.enemies:
self.next_level()
# 绘制得分和关卡
self.draw_score()
pygame.display.flip()
self.clock.tick(60)
pygame.quit()
if __name__ == "__main__":
game = Game()
game.run()
|
|