大作业之pygame做小游戏
import pygame
import random
import sys
pygame.init()
pygame.mixer.init()
shoot_sound = pygame.mixer.Sound("D:\CY的Python课作业\pygame\assets\sounds\effect\shoot\sfx_laser1.ogg")
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("太空射击游戏")
BACKGROUND_IMG = pygame.image.load("D:\CY的Python课作业\pygame\assets\images\background\darkPurple.png").convert()
BACKGROUND_IMG = pygame.transform.scale(BACKGROUND_IMG, (WIDTH, HEIGHT))
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
font_big = pygame.font.SysFont('arial', 60) # 大字体(开始/结束界面)
font_medium = pygame.font.SysFont('arial', 36) # 中字体(提示文字)
class Player(pygame.sprite.Sprite):
def init(self):
super().init()
self.image = pygame.image.load("D:\CY的Python课作业\pygame\assets\images\charcters\player\player_ship.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (50, 40))
self.rect = self.image.get_rect(center=(WIDTH//2, HEIGHT-10))
self.base_speed = 8 # 基础速度
self.current_speed = self.base_speed # 当前速度(新增)
self.boost_active = False # 加速是否生效(新增)
self.health = 100
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect.x -= self.current_speed
if keys[pygame.K_RIGHT] and self.rect.right < WIDTH:
self.rect.x += self.current_speed
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
shoot_sound.play() # 射击音效
def apply_powerup(self, powerup_type):
if powerup_type == "speed":
if not self.boost_active: # 避免叠加效果
self.current_speed = self.base_speed * 1.5 # 1.5倍速
self.boost_active = True
# 设置定时器(每秒触发一次事件,持续5秒)
pygame.time.set_timer(pygame.USEREVENT + 1, 1000) # 1000ms=1秒
elif powerup_type == "health":
self.health = min(self.health + 30, 100) # 恢复生命,不超过100
class Meteor(pygame.sprite.Sprite):
def init(self):
super().init()
self.image = pygame.image.load("D:\CY的Python课作业\pygame\assets\images\charcters\meteor\meteorBrown.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (30, 30))
self.rect = self.image.get_rect()
self.reset()
def update(self):
self.rect.y += self.speedy
self.rect.x += self.speedx
if self.rect.top > HEIGHT or self.rect.left < -25 or self.rect.right > WIDTH + 25:
self.reset()
def reset(self):
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 5)
self.speedx = random.randrange(-2, 2)
class Enemy(pygame.sprite.Sprite):
def init(self):
super().init()
self.image = pygame.image.load("D:\CY的Python课作业\pygame\assets\images\charcters\enemy\enemy_ship.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (40, 40))
self.rect = self.image.get_rect()
self.reset()
def update(self):
self.rect.y += self.speedy
if self.rect.top > HEIGHT:
self.reset()
def reset(self):
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 3)
class Bullet(pygame.sprite.Sprite):
def init(self, x, y):
super().init()
self.image = pygame.image.load("D:\CY的Python课作业\pygame\assets\images\effects\laser\laserRed01.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (5, 10))
self.rect = self.image.get_rect(center=(x, y))
self.speedy = -10
def update(self):
self.rect.y += self.speedy
if self.rect.bottom < 0:
self.kill()
class Powerup(pygame.sprite.Sprite):
def init(self, type):
super().init()
self.type = type
self.speed = 3
if self.type == "speed":
self.image = pygame.image.load("D:\\CY的Python课作业\\pygame\\assets\\images\\charcters\\powerup\\health_powerup.png").convert_alpha()
else:
self.image = pygame.image.load("D:\\CY的Python课作业\\pygame\\assets\\images\\charcters\\powerup\\speed_powerup.png").convert_alpha()
if self.image.get_width() == 0:
raise Exception(f"道具 {type} 图片加载失败!路径可能错误")
self.image = pygame.transform.scale(self.image, (30, 30))
self.rect = self.image.get_rect()
)
self.rect.x = random.randrange(0, WIDTH - 30)
self.rect.y = random.randrange(-100, -40)
def update(self):
self.rect.y += self.speed
if self.rect.top > HEIGHT:
self.kill()
def draw_start_screen():
screen.blit(BACKGROUND_IMG, (0, 0))
title_text = font_big.render("SpaceShoot", True, WHITE)
hint_text = font_medium.render("Press nay Key to Enter", True, WHITE)
screen.blit(title_text, (WIDTH//2 - title_text.get_width()//2, 200))
screen.blit(hint_text, (WIDTH//2 - hint_text.get_width()//2, 300))
pygame.display.flip()
def draw_game_over_screen(score):
screen.blit(BACKGROUND_IMG, (0, 0))
game_over_text = font_big.render("GameOver", True, RED)
score_text = font_medium.render(f"Final Score: {score}", True, WHITE)
hint_text = font_medium.render("Press any Key to Exit", True, WHITE)
screen.blit(game_over_text, (WIDTH//2 - game_over_text.get_width()//2, 200))
screen.blit(score_text, (WIDTH//2 - score_text.get_width()//2, 300))
screen.blit(hint_text, (WIDTH//2 - hint_text.get_width()//2, 400))
pygame.display.flip()
all_sprites = pygame.sprite.Group()
meteors = pygame.sprite.Group()
enemies = pygame.sprite.Group()
bullets = pygame.sprite.Group()
powerups = pygame.sprite.Group()
all_sprites.add(powerups)
player = Player()
all_sprites.add(player)
for _ in range(8):
meteor = Meteor()
all_sprites.add(meteor)
meteors.add(meteor)
def main():
clock = pygame.time.Clock()
score = 0
running = True
game_active = False
enemy_spawn_timer = 0
draw_start_screen()
while not game_active:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
game_active = True
while running and game_active:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
player.shoot()
all_sprites.update()
)
hits_meteor = pygame.sprite.groupcollide(meteors, bullets, True, True)
for _ in hits_meteor:
score += 10
new_meteor = Meteor()
all_sprites.add(new_meteor)
meteors.add(new_meteor)
hits_enemy = pygame.sprite.groupcollide(enemies, bullets, True, True)
for _ in hits_enemy:
score += 50
hits_player_meteor = pygame.sprite.spritecollide(player, meteors, True)
for _ in hits_player_meteor:
player.health -= 10
new_meteor = Meteor()
all_sprites.add(new_meteor)
meteors.add(new_meteor)
if player.health <= 0:
running = False
hits_player_enemy = pygame.sprite.spritecollide(player, enemies, True)
for _ in hits_player_enemy:
player.health -= 20
if player.health <= 0:
running = False
hits_powerup = pygame.sprite.spritecollide(player, powerups, True)
for powerup in hits_powerup:
player.apply_powerup(powerup.type)
pickup_sound = pygame.mixer.Sound("D:\\CY的Python课作业\\pygame\\assets\\sounds\\effect\\powerup\\sfx_shieldUp.ogg")
pickup_sound.play()
enemy_spawn_timer += 1
if enemy_spawn_timer > 180:
new_enemy = Enemy()
all_sprites.add(new_enemy)
enemies.add(new_enemy)
enemy_spawn_timer = 0
if random.random() < 0.02:
powerup_type = random.choice(["speed", "health"])
new_powerup = Powerup(powerup_type)
powerups.add(new_powerup)
all_sprites.add(new_powerup)
hits_powerup = pygame.sprite.spritecollide(player, powerups, True)
for powerup in hits_powerup:
player.apply_powerup(powerup.type)
screen.blit(BACKGROUND_IMG, (0, 0))
all_sprites.draw(screen)
score_text = font_medium.render(f"Score: {score}", True, WHITE)
health_text = font_medium.render(f"Health: {player.health}", True, WHITE)
screen.blit(score_text, (10, 10))
screen.blit(health_text, (10, 50))
pygame.display.flip()
font = pygame.font.Font("D:\\CY的Python课作业\\pygame\\assets\\fonts\\kenvector_future.ttf", 30)
if not running or player.health <= 0:
draw_game_over_screen(score)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN):
pygame.quit()
sys.exit()
if name == "main":
main()



浙公网安备 33010602011771号