大作业之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()



posted @ 2025-06-17 15:47  piuky  阅读(31)  评论(0)    收藏  举报