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()