pygame游戏,信计2班17曾向嵩

import pygame
import sys
import random
import math

# 初始化pygame
pygame.init()

# 设置中文字体
pygame.font.init()
try:
    font = pygame.font.Font("simhei.ttf", 36)
except FileNotFoundError:
    # 如果找不到指定字体,使用系统默认字体
    pygame.font.init()
    font = pygame.font.SysFont(["SimHei", "WenQuanYi Micro Hei", "Heiti TC"], 36)

# 游戏窗口设置
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("大便超人")

# 颜色定义
WHITE = (255, 255, 255)  
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BROWN = (139, 69, 19)
SKYBLUE = (135, 206, 235)
YELLOW = (255, 255, 0)

# 游戏变量
FPS = 60
player_speed = 8
enemy_speed = 5
poop_speed = 10
score = 0
lives = 3
game_over = False
start_time = pygame.time.get_ticks()
game_time = 60  # 游戏时间(秒)

# 玩家类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 创建玩家图像
        self.image = pygame.Surface((50, 70))
        self.image.fill(YELLOW)
        # 绘制简单的人形
        pygame.draw.rect(self.image, RED, (15, 10, 20, 20))  # 头部
        pygame.draw.line(self.image, RED, (25, 30), (25, 50), 3)  # 身体
        pygame.draw.line(self.image, RED, (25, 35), (10, 45), 3)  # 左臂
        pygame.draw.line(self.image, RED, (25, 35), (40, 45), 3)  # 右臂
        pygame.draw.line(self.image, RED, (25, 50), (15, 65), 3)  # 左腿
        pygame.draw.line(self.image, RED, (25, 50), (35, 65), 3)  # 右腿
        self.rect = self.image.get_rect()
        self.rect.centerx = SCREEN_WIDTH // 2
        self.rect.bottom = SCREEN_HEIGHT - 10
        self.speed_x = 0
        self.speed_y = 0

    def update(self):
        self.speed_x = 0
        self.speed_y = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speed_x = -player_speed
        if keystate[pygame.K_RIGHT]:
            self.speed_x = player_speed
        if keystate[pygame.K_UP]:
            self.speed_y = -player_speed
        if keystate[pygame.K_DOWN]:
            self.speed_y = player_speed
        self.rect.x += self.speed_x
        self.rect.y += self.speed_y
        
        # 保持在屏幕内
        if self.rect.right > SCREEN_WIDTH:
            self.rect.right = SCREEN_WIDTH
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.top < 0:
            self.rect.top = 0
        if self.rect.bottom > SCREEN_HEIGHT:
            self.rect.bottom = SCREEN_HEIGHT

    def shoot(self):
        poop = Poop(self.rect.centerx, self.rect.top)
        all_sprites.add(poop)
        poops.add(poop)

# 敌人(大便)类
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 创建大便图像
        self.image = pygame.Surface((40, 40))
        self.image.fill(BROWN)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(SCREEN_WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        self.speedy = random.randrange(3, 7)
        self.speedx = random.randrange(-3, 3)

    def update(self):
        self.rect.y += self.speedy
        self.rect.x += self.speedx
        if (self.rect.top > SCREEN_HEIGHT + 10 or
            self.rect.left < -25 or
            self.rect.right > SCREEN_WIDTH + 25):
            self.rect.x = random.randrange(SCREEN_WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(3, 7)
            self.speedx = random.randrange(-3, 3)

# 便便子弹类
class Poop(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((10, 20))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.bottom = y
        self.speedy = -poop_speed

    def update(self):
        self.rect.y += self.speedy
        # 如果子弹超出屏幕顶部,删除它
        if self.rect.bottom < 0:
            self.kill()

# 创建精灵组
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
poops = pygame.sprite.Group()

# 创建玩家
player = Player()
all_sprites.add(player)

# 创建敌人
for i in range(8):
    enemy = Enemy()
    all_sprites.add(enemy)
    enemies.add(enemy)

# 游戏主循环
clock = pygame.time.Clock()
running = True

while running:
    # 保持游戏运行速度
    clock.tick(FPS)
    
    # 处理输入事件
    for event in pygame.event.get():
        # 关闭窗口
        if event.type == pygame.QUIT:
            running = False
        # 发射便便
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE and not game_over:
                player.shoot()
            # 游戏结束后按R键重新开始
            elif event.key == pygame.K_r and game_over:
                # 重置游戏状态
                score = 0
                lives = 3
                game_over = False
                start_time = pygame.time.get_ticks()
                
                # 清空并重新创建精灵
                all_sprites.empty()
                enemies.empty()
                poops.empty()
                
                player = Player()
                all_sprites.add(player)
                
                for i in range(8):
                    enemy = Enemy()
                    all_sprites.add(enemy)
                    enemies.add(enemy)
    
    # 游戏逻辑
    if not game_over:
        # 更新所有精灵
        all_sprites.update()
        
        # 检查子弹是否击中敌人
        hits = pygame.sprite.groupcollide(enemies, poops, True, True)
        for hit in hits:
            score += 1
            enemy = Enemy()
            all_sprites.add(enemy)
            enemies.add(enemy)
        
        # 检查敌人是否击中玩家
        hits = pygame.sprite.spritecollide(player, enemies, True)
        for hit in hits:
            lives -= 1
            enemy = Enemy()
            all_sprites.add(enemy)
            enemies.add(enemy)
            if lives <= 0:
                game_over = True
        
        # 检查游戏时间
        elapsed_time = (pygame.time.get_ticks() - start_time) // 1000
        remaining_time = game_time - elapsed_time
        if remaining_time <= 0:
            game_over = True
    
    # 绘制/渲染
    screen.fill(SKYBLUE)
    all_sprites.draw(screen)
    
    # 显示分数
    score_text = font.render(f"分数: {score}", True, BLACK)
    screen.blit(score_text, (10, 10))
    
    # 显示生命值
    lives_text = font.render(f"生命值: {lives}", True, BLACK)
    screen.blit(lives_text, (10, 50))
    
    # 显示剩余时间
    if not game_over:
        time_text = font.render(f"时间: {remaining_time}", True, BLACK)
        screen.blit(time_text, (SCREEN_WIDTH - 150, 10))
    
    # 游戏结束画面
    if game_over:
        game_over_text = font.render("游戏结束!按R键重新开始", True, RED)
        screen.blit(game_over_text, (SCREEN_WIDTH // 2 - game_over_text.get_width() // 2, 
                                    SCREEN_HEIGHT // 2 - game_over_text.get_height() // 2))
        final_score_text = font.render(f"最终分数: {score}", True, BLACK)
        screen.blit(final_score_text, (SCREEN_WIDTH // 2 - final_score_text.get_width() // 2, 
                                      SCREEN_HEIGHT // 2 + 50))
    
    # 刷新屏幕
    pygame.display.flip()

pygame.quit()
sys.exit()    

 

posted @ 2025-06-23 12:30  吃不胖的曾小明  阅读(39)  评论(0)    收藏  举报