[Python] 纯文本查看 复制代码
import pygame
import random
import math
# 游戏窗口设置
WIDTH, HEIGHT = 800, 600
BACKGROUND_COLOR = (30, 30, 30)
PLAYER_COLOR = (0, 255, 0)
ENEMY_COLOR = (255, 0, 0)
BULLET_COLOR = (255, 255, 0)
# 初始化 Pygame
pygame.init()
window = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("射击游戏")
# 玩家类
class Player:
def __init__(self):
self.rect = pygame.Rect(WIDTH // 2, HEIGHT // 2, 50, 50)
self.speed = 5
self.health = 3
def move(self, dx, dy):
self.rect.x += dx * self.speed
self.rect.y += dy * self.speed
# 边界检查
self.rect.x = max(0, min(WIDTH - self.rect.width, self.rect.x))
self.rect.y = max(0, min(HEIGHT - self.rect.height, self.rect.y))
def draw(self, surface):
pygame.draw.rect(surface, PLAYER_COLOR, self.rect)
self.draw_health_bar(surface)
def draw_health_bar(self, surface):
health_bar_width = 50
health_bar_height = 10
health_ratio = self.health / 3
pygame.draw.rect(surface, (255, 0, 0), (self.rect.x,
self.rect.y - 15, health_bar_width, health_bar_height))
pygame.draw.rect(surface, (0, 255, 0), (self.rect.x, self.rect.y -
15, health_bar_width * health_ratio, health_bar_height))
# 敌人类
class Enemy:
def __init__(self):
self.rect = pygame.Rect(random.randint(
0, WIDTH - 50), random.randint(0, HEIGHT - 50), 50, 50)
self.last_shoot_time = pygame.time.get_ticks()
self.shoot_interval = 1000 # 每秒发射一次
def draw(self, surface):
pygame.draw.rect(surface, ENEMY_COLOR, self.rect)
def shoot(self, player):
current_time = pygame.time.get_ticks()
if current_time - self.last_shoot_time > self.shoot_interval:
self.last_shoot_time = current_time
# 计算发射方向
dir_x = player.rect.centerx - self.rect.centerx
dir_y = player.rect.centery - self.rect.centery
length = (dir_x ** 2 + dir_y ** 2) ** 0.5
# 标准化方向
if length > 0:
dir_x /= length
dir_y /= length
# 向玩家方向发射
return Bullet(self.rect.centerx, self.rect.centery, dir_x, dir_y)
return None
# 子弹类
class Bullet:
def __init__(self, x, y, dir_x, dir_y):
self.rect = pygame.Rect(x, y, 5, 5)
self.speed = 20
self.dir_x = dir_x
self.dir_y = dir_y
def update(self):
self.rect.x += self.dir_x * self.speed
self.rect.y += self.dir_y * self.speed
def draw(self, surface):
pygame.draw.rect(surface, BULLET_COLOR, self.rect)
# 游戏控制器
class GameController:
def __init__(self):
self.player = Player()
self.enemies = []
self.bullets = []
self.enemy_bullets = [] # 存储敌人的子弹
self.running = True
self.game_over = False
self.score = 0
self.enemy_spawn_time = 5000 # 增加到 5000 毫秒,使敌人出现得更慢
self.last_enemy_spawn_time = pygame.time.get_ticks()
self.score_font = pygame.font.SysFont(None, 36)
def handle_event(self, event):
if event.type == pygame.QUIT:
self.running = False
if self.game_over: # 游戏结束时处理输入
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r: # 按 R 重启
self.reset_game()
elif event.key == pygame.K_q: # 按 Q 退出
self.running = False
def update(self):
keys = pygame.key.get_pressed() # 获取按键状态
if keys[pygame.K_LEFT]:
self.player.move(-1, 0)
if keys[pygame.K_RIGHT]:
self.player.move(1, 0)
if keys[pygame.K_UP]:
self.player.move(0, -1)
if keys[pygame.K_DOWN]:
self.player.move(0, 1)
# 检测鼠标点击
mouse_buttons = pygame.mouse.get_pressed()
if mouse_buttons[0]: # 左键点击
self.shoot()
# 更新玩家的子弹
for bullet in self.bullets[:]:
bullet.update()
if bullet.rect.x < 0 or bullet.rect.x > WIDTH or bullet.rect.y < 0 or bullet.rect.y > HEIGHT:
self.bullets.remove(bullet)
# 更新敌人子弹
for enemy_bullet in self.enemy_bullets[:]:
enemy_bullet.update()
if enemy_bullet.rect.y > HEIGHT: # 超出屏幕则移除
self.enemy_bullets.remove(enemy_bullet)
# 检查玩家子弹与敌人的碰撞
for bullet in self.bullets[:]:
for enemy in self.enemies[:]:
if bullet.rect.colliderect(enemy.rect):
self.bullets.remove(bullet)
self.enemies.remove(enemy)
self.score += 1
break
# 检查玩家与敌人的碰撞
self.check_player_collision()
# 生成敌人
current_time = pygame.time.get_ticks()
if current_time - self.last_enemy_spawn_time > self.enemy_spawn_time:
self.enemies.append(Enemy())
self.last_enemy_spawn_time = current_time
# 敌人发射子弹
for enemy in self.enemies:
bullet = enemy.shoot(self.player) # 传递玩家对象
if bullet:
self.enemy_bullets.append(bullet)
def check_player_collision(self):
for enemy in self.enemies[:]:
if enemy.rect.colliderect(self.player.rect):
self.player.health -= 1
self.enemies.remove(enemy)
if self.player.health <= 0:
self.game_over = True
# 检查敌人子弹与玩家的碰撞
for enemy_bullet in self.enemy_bullets[:]:
if enemy_bullet.rect.colliderect(self.player.rect):
self.player.health -= 1
self.enemy_bullets.remove(enemy_bullet)
if self.player.health <= 0:
self.game_over = True
def shoot(self):
# 获取鼠标的位置
mouse_x, mouse_y = pygame.mouse.get_pos()
# 计算方向
dir_x = mouse_x - (self.player.rect.x + self.player.rect.width // 2)
dir_y = mouse_y - (self.player.rect.y + self.player.rect.height // 2)
length = (dir_x ** 2 + dir_y ** 2) ** 0.5
if length > 0:
dir_x /= length
dir_y /= length
# 创建子弹
self.bullets.append(Bullet(self.player.rect.x + self.player.rect.width // 2,
self.player.rect.y + self.player.rect.height // 2,
dir_x, dir_y))
def draw(self):
window.fill(BACKGROUND_COLOR)
if self.game_over:
self.draw_game_over()
else:
self.player.draw(window)
for bullet in self.bullets:
bullet.draw(window)
for enemy in self.enemies:
enemy.draw(window)
for enemy_bullet in self.enemy_bullets:
enemy_bullet.draw(window)
# 绘制分数
score_text = self.score_font.render(
f'Score: {self.score}', True, (255, 255, 255))
window.blit(score_text, (10, 10))
pygame.display.flip()
def draw_game_over(self):
game_over_text = self.score_font.render("Game Over", True, (255, 0, 0))
score_text = self.score_font.render(
f'Final Score: {self.score}', True, (255, 255, 255))
restart_text = self.score_font.render(
"Press R to Restart or Q to Quit", True, (255, 255, 255))
window.blit(game_over_text, (WIDTH // 2 - 50, HEIGHT // 2 - 50))
window.blit(score_text, (WIDTH // 2 - 80, HEIGHT // 2))
window.blit(restart_text, (WIDTH // 2 - 200, HEIGHT // 2 + 50))
def reset_game(self):
self.player = Player()
self.enemies = []
self.bullets = []
self.enemy_bullets = []
self.running = True
self.game_over = False
self.score = 0
self.enemy_spawn_time = 5000 # 重置生成速度
self.last_enemy_spawn_time = pygame.time.get_ticks()
def start_game(self):
clock = pygame.time.Clock() # 创建时钟对象
while self.running:
for event in pygame.event.get():
self.handle_event(event)
if not self.game_over:
self.update()
self.draw()
clock.tick(60) # 限制帧率为 60 FPS
pygame.quit()
def main():
controller = GameController()
controller.start_game()
if __name__ == "__main__":
main()