import pygame
import random
# 初始化Pygame
pygame.init()
# 定义颜色
WHITE = (255, 255, 255) # 白色
BLACK = (0, 0, 0) # 黑色
RED = (255, 0, 0) # 红色
GREEN = (0, 255, 0) # 绿色
BLUE = (0, 0, 255) # 蓝色
# 设置屏幕尺寸
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) # 创建窗口
pygame.display.set_caption('Contra with Enemy Attack') # 设置窗口标题
# 定义玩家属性
PLAYER_WIDTH = 40
PLAYER_HEIGHT = 60
PLAYER_SPEED = 5
JUMP_HEIGHT = 15
PLAYER_HEALTH = 1000 # 玩家生命值
# 定义子弹属性
BULLET_WIDTH = 5
BULLET_HEIGHT = 5
BULLET_SPEED = 7
# 定义敌人属性
ENEMY_WIDTH = 40
ENEMY_HEIGHT = 60
ENEMY_SPEED = 3
ENEMY_BULLET_SPEED = 5 # 敌人子弹速度
# 玩家类
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__() # 调用父类构造函数
self.image = pygame.Surface([PLAYER_WIDTH, PLAYER_HEIGHT]) # 创建玩家的矩形图像
self.image.fill(GREEN) # 填充颜色
self.rect = self.image.get_rect() # 获取矩形区域
self.rect.x = 100 # 初始x位置
self.rect.y = SCREEN_HEIGHT - PLAYER_HEIGHT # 初始y位置
self.change_x = 0 # x方向的变化量
self.change_y = 0 # y方向的变化量
self.jumping = False # 跳跃状态
self.health = PLAYER_HEALTH # 玩家生命值
def update(self):
# 更新玩家的位置
self.rect.x += self.change_x
self.rect.y += self.change_y
# 重力作用
if self.jumping:
self.change_y += 1 # 模拟重力
# 防止掉出屏幕
if self.rect.y > SCREEN_HEIGHT - PLAYER_HEIGHT:
self.rect.y = SCREEN_HEIGHT - PLAYER_HEIGHT
self.jumping = False
self.change_y = 0 # 重置y方向变化量
def jump(self):
if not self.jumping: # 如果没有跳跃
self.jumping = True # 设置为跳跃状态
self.change_y = -JUMP_HEIGHT # 向上跳跃
def shoot(self):
# 创建子弹并添加到组中
bullet = Bullet(self.rect.x + PLAYER_WIDTH, self.rect.y + PLAYER_HEIGHT // 2)
all_sprites.add(bullet) # 将子弹添加到所有精灵组
bullets.add(bullet) # 将子弹添加到玩家子弹组
def take_damage(self):
self.health -= 1 # 玩家受伤,生命值减少
if self.health <= 0:
print("Game Over!") # 游戏结束提示
pygame.quit() # 退出Pygame
quit() # 退出程序
# 子弹类(玩家的子弹)
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__() # 调用父类构造函数
self.image = pygame.Surface([BULLET_WIDTH, BULLET_HEIGHT]) # 创建子弹的矩形图像
self.image.fill(RED) # 填充颜色
self.rect = self.image.get_rect() # 获取矩形区域
self.rect.x = x # 设置x位置
self.rect.y = y # 设置y位置
def update(self):
self.rect.x += BULLET_SPEED # 子弹向右移动
if self.rect.x > SCREEN_WIDTH: # 如果子弹超出屏幕
self.kill() # 删除子弹
# 敌人的子弹类
class EnemyBullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__() # 调用父类构造函数
self.image = pygame.Surface([BULLET_WIDTH, BULLET_HEIGHT]) # 创建敌人子弹的矩形图像
self.image.fill(BLACK) # 填充颜色
self.rect = self.image.get_rect() # 获取矩形区域
self.rect.x = x # 设置x位置
self.rect.y = y # 设置y位置
def update(self):
self.rect.x -= ENEMY_BULLET_SPEED # 敌人子弹向左移动
if self.rect.x < 0: # 如果子弹超出屏幕
self.kill() # 删除子弹
# 敌人类
class Enemy(pygame.sprite.Sprite):
def __init__(self):
super().__init__() # 调用父类构造函数
self.image = pygame.Surface([ENEMY_WIDTH, ENEMY_HEIGHT]) # 创建敌人的矩形图像
self.image.fill(BLUE) # 填充颜色
self.rect = self.image.get_rect() # 获取矩形区域
self.rect.x = random.randint(SCREEN_WIDTH, SCREEN_WIDTH + 100) # 随机生成x位置
self.rect.y = SCREEN_HEIGHT - ENEMY_HEIGHT # 设置y位置
self.speed = ENEMY_SPEED # 敌人移动速度
def update(self):
self.rect.x -= self.speed # 敌人向左移动
if self.rect.x < -ENEMY_WIDTH: # 如果敌人超出屏幕
self.kill() # 删除敌人
def shoot(self):
if random.randint(1, 100) < 2: # 敌人有1%的几率发射子弹
enemy_bullet = EnemyBullet(self.rect.x, self.rect.y + ENEMY_HEIGHT // 2)
all_sprites.add(enemy_bullet) # 将敌人子弹添加到所有精灵组
enemy_bullets.add(enemy_bullet) # 将敌人子弹添加到敌人子弹组
# 初始化游戏
all_sprites = pygame.sprite.Group() # 所有精灵组
bullets = pygame.sprite.Group() # 玩家子弹组
enemies = pygame.sprite.Group() # 敌人组
enemy_bullets = pygame.sprite.Group() # 敌人子弹组
player = Player() # 创建玩家实例
all_sprites.add(player) # 将玩家添加到所有精灵组
# 创建时钟对象,控制帧率
clock = pygame.time.Clock()
# 游戏主循环
running = True
while running:
# 事件处理
for event in pygame.event.get():
if event.type == pygame.QUIT: # 检测退出事件
running = False
elif event.type == pygame.KEYDOWN: # 检测按键按下事件
if event.key == pygame.K_LEFT:
player.change_x = -PLAYER_SPEED # 向左移动
elif event.key == pygame.K_RIGHT:
player.change_x = PLAYER_SPEED # 向右移动
elif event.key == pygame.K_UP:
player.jump() # 跳跃
elif event.key == pygame.K_SPACE:
player.shoot() # 射击
elif event.type == pygame.KEYUP: # 检测按键松开事件
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
player.change_x = 0 # 停止移动
# 更新游戏对象
all_sprites.update()
# 检测子弹与敌人碰撞
for bullet in bullets:
enemy_hit_list = pygame.sprite.spritecollide(bullet, enemies, True) # 检测子弹与敌人碰撞
for enemy in enemy_hit_list:
bullet.kill() # 碰撞后删除子弹
# 敌人随机生成子弹
for enemy in enemies:
enemy.shoot()
# 检测玩家与敌人子弹碰撞
player_hit_list = pygame.sprite.spritecollide(player, enemy_bullets, True) # 检测玩家与敌人子弹碰撞
for bullet in player_hit_list:
player.take_damage() # 玩家受伤
# 随机生成敌人
if random.randint(1, 100) < 3: # 3%的几率生成敌人
enemy = Enemy()
all_sprites.add(enemy) # 将敌人添加到所有精灵组
enemies.add(enemy) # 将敌人添加到敌人组
# 绘制游戏场景
screen.fill(WHITE) # 清屏,填充白色背景
all_sprites.draw(screen) # 绘制所有精灵
# 刷新屏幕
pygame.display.flip()
# 控制游戏帧率
clock.tick(60)
# 退出Pygame
pygame.quit()