上视频先~
66666
import pygame
import random
import sys
import math
from pygame.locals import *
# 初始化pygame
pygame.init()
pygame.mixer.init()
# 屏幕设置
WIDTH, HEIGHT = 1480, 750
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("火影")
# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
GREEN = (0, 255, 0)
TRANSPARENT_WHITE = (255, 255, 255, 128)
# 设置中文字体
try:
font = pygame.font.SysFont('simhei', 36)
input_font = pygame.font.SysFont('simhei', 48)
except:
font = pygame.font.SysFont(None, 36)
input_font = pygame.font.SysFont(None, 48)
# 加载图片
try:
# 初始鸣人图片
naruto_img = pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744468674913.png")
naruto_img = pygame.transform.scale(naruto_img, (50, 50))
# 200分鸣人图片
naruto_img_200 = pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744511788643.png")
naruto_img_200 = pygame.transform.scale(naruto_img_200, (50, 50))
# 500分鸣人图片
naruto_img_500 = pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744512041653.png")
naruto_img_500 = pygame.transform.scale(naruto_img_500, (50, 50))
# 1000分鸣人图片
naruto_img_1000 = pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744512359608.png")
naruto_img_1000 = pygame.transform.scale(naruto_img_1000, (50, 50))
# 敌人图片
enemy_imgs = [
pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744468443623.png"),
pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744468370404.png"),
pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744468327157.png")
]
enemy_imgs = [pygame.transform.scale(img, (40, 40)) for img in enemy_imgs]
# 初始螺旋丸图片
rasengan_img = pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744469038888.png")
rasengan_img = pygame.transform.scale(rasengan_img, (30, 30))
# 1000分螺旋丸图片
rasengan_img_1000 = pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744512647483.png")
rasengan_img_1000 = pygame.transform.scale(rasengan_img_1000, (30, 30))
# 爆炸效果图片
explosion_img = pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744514677932.png")
explosion_img = pygame.transform.scale(explosion_img, (100, 100))
# 大大大Boss图片
boss_img = pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744515154318.png")
boss_img = pygame.transform.scale(boss_img, (150, 150))
# 激光图片
laser_img = pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744514421994.png")
# 医疗包图片
medkit_img = pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744515539778.png")
medkit_img = pygame.transform.scale(medkit_img, (25, 25))
# 队友图片
teammate_img = pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744525685869.png")
teammate_img = pygame.transform.scale(teammate_img, (50, 50))
# 队友子弹图片
teammate_bullet_img = pygame.image.load(r"C:\Users\Administrator\Desktop\GGY\图片\screenshot-1744525925999.png")
teammate_bullet_img = pygame.transform.scale(teammate_bullet_img, (30, 30))
except pygame.error as e:
print("图片加载失败:", e)
sys.exit()
# 加载背景音乐
try:
boss_music = pygame.mixer.Sound(r"C:\Users\Administrator\Desktop\GGY\SoundHelix-Song-1.mp3")
boss_music.set_volume(0.5)
except:
print("背景音乐加载失败")
boss_music = None
clock = pygame.time.Clock()
# 获取玩家昵称
def get_player_name():
name = ""
input_active = True
while input_active:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_RETURN:
input_active = False
elif event.key == K_BACKSPACE:
name = name[:-1]
else:
# 支持中文输入
if event.unicode.isprintable():
name += event.unicode
screen.fill(BLACK)
prompt_text = input_font.render("请输入你的昵称:", True, WHITE)
name_text = input_font.render(name, True, WHITE)
screen.blit(prompt_text, (WIDTH//2 - 150, HEIGHT//2 - 50))
screen.blit(name_text, (WIDTH//2 - 100, HEIGHT//2 + 20))
pygame.display.flip()
clock.tick(60)
return name if name else "匿名玩家"
# 爆炸效果类
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = explosion_img
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.lifetime = 10 # 爆炸效果持续时间
def update(self):
self.lifetime -= 1
if self.lifetime <= 0:
self.kill()
# 激光类
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y, target_x, target_y):
super().__init__()
# 计算激光方向和长度
dx = target_x - x
dy = target_y - y
distance = max(1, math.sqrt(dx*dx + dy*dy))
angle = math.degrees(math.atan2(dy, dx))
# 旋转激光图片
original_width = laser_img.get_width()
scaled_width = int(distance)
scaled_laser = pygame.transform.scale(laser_img, (scaled_width, 10))
self.image = pygame.transform.rotate(scaled_laser, -angle)
self.rect = self.image.get_rect()
self.rect.center = (x + dx/2, y + dy/2)
self.damage = 10
self.lifetime = 30 # 激光持续时间
def update(self):
self.lifetime -= 1
if self.lifetime <= 0:
self.kill()
# 医疗包类
class Medkit(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = medkit_img
self.rect = self.image.get_rect()
self.rect.x = random.randint(0, WIDTH - self.rect.width)
self.rect.y = random.randint(0, HEIGHT - self.rect.height)
self.lifetime = 600 # 医疗包存在时间(10秒)
def update(self):
self.lifetime -= 1
if self.lifetime <= 0:
self.kill()
# Boss类
class Boss(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = boss_img
self.rect = self.image.get_rect()
self.rect.x = WIDTH // 2
self.rect.y = HEIGHT // 2
self.health = 500
self.move_timer = 0
self.attack_timer = 0
self.lasers = pygame.sprite.Group()
def update(self, naruto):
# 每15秒移动一次
self.move_timer += 1
if self.move_timer >= 900: # 15秒(60帧/秒)
self.rect.x = random.randint(0, WIDTH - self.rect.width)
self.rect.y = random.randint(0, HEIGHT - self.rect.height)
self.move_timer = 0
# 每3秒攻击一次
self.attack_timer += 1
if self.attack_timer >= 180: # 3秒
self.shoot_laser(naruto)
self.attack_timer = 0
def shoot_laser(self, naruto):
laser = Laser(self.rect.centerx, self.rect.centery, naruto.rect.centerx, naruto.rect.centery)
self.lasers.add(laser)
return laser
# 队友类
class Teammate(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = teammate_img
self.rect = self.image.get_rect()
self.rect.center = (WIDTH // 2, HEIGHT // 2)
self.speed = 5
self.shoot_timer = 0
self.health = 200 # 队友有独立血量
self.max_health = 200
def update(self):
keys = pygame.key.get_pressed()
if keys[K_UP] and self.rect.top > 0:
self.rect.y -= self.speed
if keys[K_DOWN] and self.rect.bottom < HEIGHT:
self.rect.y += self.speed
if keys[K_LEFT] and self.rect.left > 0:
self.rect.x -= self.speed
if keys[K_RIGHT] and self.rect.right < WIDTH:
self.rect.x += self.speed
# 持续发射子弹
self.shoot_timer += 1
if self.shoot_timer >= 15: # 每0.25秒发射一次
self.shoot_timer = 0
return TeammateBullet(self.rect.right, self.rect.centery)
return None
# 队友子弹类
class TeammateBullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = teammate_bullet_img
self.rect = self.image.get_rect()
self.rect.left = x
self.rect.centery = y
self.speed = 10
self.damage = 15
def update(self):
self.rect.x += self.speed
if self.rect.left > WIDTH:
self.kill()
# 玩家设置 (鸣人)
class Naruto(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = naruto_img
self.rect = self.image.get_rect()
self.rect.center = (WIDTH // 4, HEIGHT // 2)
self.speed = 5
self.health = 100
self.max_health = 100
self.rasengan_cooldown = 0
self.current_level = 1 # 1:初始, 2:200分, 3:500分, 4:1000分
self.heal_timer = 0
def update(self, *args):
# 处理参数,允许不传score
score = args[0] if args else 0
# 根据分数更新角色状态
if score >= 1000 and self.current_level < 4:
self.image = naruto_img_1000
self.max_health = 500
self.health = 500
self.current_level = 4
elif score >= 500 and self.current_level < 3:
self.image = naruto_img_500
self.current_level = 3
elif score >= 200 and self.current_level < 2:
self.image = naruto_img_200
self.current_level = 2
# 每1秒恢复1点血
self.heal_timer += 1
if self.heal_timer >= 60: # 1秒
self.health = min(self.health + 1, self.max_health)
self.heal_timer = 0
keys = pygame.key.get_pressed()
if keys[K_w] and self.rect.top > 0: # W键上移
self.rect.y -= self.speed
if keys[K_s] and self.rect.bottom < HEIGHT: # S键下移
self.rect.y += self.speed
if keys[K_a] and self.rect.left > 0: # A键左移
self.rect.x -= self.speed
if keys[K_d] and self.rect.right < WIDTH: # D键右移
self.rect.x += self.speed
if self.rasengan_cooldown > 0:
self.rasengan_cooldown -= 1
def shoot_rasengan(self, score):
if self.rasengan_cooldown == 0:
cooldown = 20
if score >= 1000:
cooldown = 15 # 1000分后冷却时间缩短
self.rasengan_cooldown = cooldown
return Rasengan(self.rect.right, self.rect.centery, score)
return None
# 螺旋丸类
class Rasengan(pygame.sprite.Sprite):
def __init__(self, x, y, score):
super().__init__()
if score >= 1000:
self.image = rasengan_img_1000
else:
self.image = rasengan_img
self.rect = self.image.get_rect()
self.rect.left = x
self.rect.centery = y
self.speed = 7
self.damage = 25
self.score = score
self.explode_on_contact = (score >= 500) # 等级3、4会爆炸
def update(self):
self.rect.x += self.speed
if self.rect.left > WIDTH:
self.kill()
# 敌人类
class Enemy(pygame.sprite.Sprite):
def __init__(self, enemy_health=50):
super().__init__()
self.image = random.choice(enemy_imgs)
self.rect = self.image.get_rect()
self.rect.x = WIDTH
self.rect.y = random.randint(0, HEIGHT - self.rect.height)
self.speed = random.randint(1, 3)
self.health = enemy_health
def update(self):
self.rect.x -= self.speed
if self.rect.right < 0:
self.kill()
def draw_energy_bar(screen, energy):
bar_width = 200
bar_height = 20
outline_rect = pygame.Rect(WIDTH - 350, 20, bar_width, bar_height)
fill_rect = pygame.Rect(WIDTH - 350, 20, int(bar_width * (energy / 1000)), bar_height)
pygame.draw.rect(screen, BLACK, outline_rect, 2)
pygame.draw.rect(screen, BLUE, fill_rect)
energy_text = font.render(f"查克拉: {energy}/1000", True, YELLOW)
screen.blit(energy_text, (WIDTH - 350, 45))
def main():
clock = pygame.time.Clock()
# 获取玩家昵称
player_name = get_player_name()
# 创建精灵组
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
rasengans = pygame.sprite.Group()
explosions = pygame.sprite.Group()
medkits = pygame.sprite.Group()
teammate_bullets = pygame.sprite.Group()
# 创建玩家
naruto = Naruto()
all_sprites.add(naruto)
# 游戏变量
score = 0
energy = 0
enemy_spawn_timer = 0
game_over = False
boss_spawned = False
boss = None
medkit_timer = 0
teammate = None
teammate_summoned = False
boss_music_playing = False
enemy_health = 50 # 初始敌人血量
enemy_health_doubled = False
enemy_health_message_timer = 0
# 游戏主循环
running = True
while running:
# 事件处理
for event in pygame.event.get():
if event.type == QUIT:
running = False
elif event.type == KEYDOWN:
if event.key == K_j and not game_over: # J键攻击
rasengan = naruto.shoot_rasengan(score)
if rasengan:
all_sprites.add(rasengan)
rasengans.add(rasengan)
if event.key == K_r and game_over:
# 重新开始游戏
all_sprites.empty()
enemies.empty()
rasengans.empty()
explosions.empty()
medkits.empty()
teammate_bullets.empty()
naruto = Naruto()
all_sprites.add(naruto)
score = 0
energy = 0
game_over = False
boss_spawned = False
boss = None
teammate = None
teammate_summoned = False
enemy_health = 50
enemy_health_doubled = False
if boss_music and boss_music_playing:
boss_music.stop()
boss_music_playing = False
if event.key == K_k and not game_over and energy >= 1000: # K键清屏
for enemy in enemies:
enemy.kill()
energy = 0
if event.key == K_l and not game_over and energy >= 500 and not teammate_summoned: # L键召唤队友
teammate = Teammate()
all_sprites.add(teammate)
energy -= 500
teammate_summoned = True
if not game_over:
# 检查是否需要增加敌人血量
if score >= 500 and not enemy_health_doubled:
enemy_health = 100 # 敌人血量翻倍
enemy_health_doubled = True
enemy_health_message_timer = 180 # 3秒
# 更新
naruto.update(score)
rasengans.update()
enemies.update()
explosions.update()
medkits.update()
# 更新队友
if teammate:
bullet = teammate.update()
if bullet:
all_sprites.add(bullet)
teammate_bullets.add(bullet)
teammate_bullets.update()
# 生成敌人
enemy_spawn_timer += 1
if enemy_spawn_timer >= 60: # 每秒生成一个敌人
enemy = Enemy(enemy_health)
all_sprites.add(enemy)
enemies.add(enemy)
enemy_spawn_timer = 0
# 生成医疗包(每100秒)
medkit_timer += 1
if medkit_timer >= 6000: # 100秒
medkit = Medkit()
all_sprites.add(medkit)
medkits.add(medkit)
medkit_timer = 0
# 检测螺旋丸和敌人的碰撞
hits = pygame.sprite.groupcollide(enemies, rasengans, False, True)
for enemy, rasengan_list in hits.items():
for rasengan in rasengan_list:
# 根据分数决定伤害效果
if score >= 200: # 200分后一击必杀
enemy.health = 0
else:
enemy.health -= rasengan.damage
# 500分后可以一次打两个敌人
if score >= 500:
for other_enemy in enemies:
if other_enemy != enemy and abs(other_enemy.rect.x - enemy.rect.x) < 100:
other_enemy.health = 0
# 等级3、4的螺旋丸会爆炸
if rasengan.explode_on_contact:
explosion = Explosion(enemy.rect.centerx, enemy.rect.centery)
all_sprites.add(explosion)
explosions.add(explosion)
# 爆炸范围内的敌人都会死亡
for other_enemy in enemies:
if math.sqrt((other_enemy.rect.centerx - enemy.rect.centerx)**2 +
(other_enemy.rect.centery - enemy.rect.centery)**2) < 100:
other_enemy.health = 0
if enemy.health <= 0:
enemy.kill()
score += 10
energy = min(energy + 5, 1000) # 击杀敌人增加能量
# 检测队友子弹和敌人的碰撞
hits = pygame.sprite.groupcollide(enemies, teammate_bullets, False, True)
for enemy, bullet_list in hits.items():
for bullet in bullet_list:
enemy.health -= bullet.damage
if enemy.health <= 0:
enemy.kill()
score += 10
energy = min(energy + 5, 1000)
# 检测玩家和敌人的碰撞
hits = pygame.sprite.spritecollide(naruto, enemies, False)
for enemy in hits:
naruto.health -= 1
if naruto.health <= 0:
game_over = True
# 检测队友和敌人的碰撞
if teammate:
hits = pygame.sprite.spritecollide(teammate, enemies, False)
for enemy in hits:
teammate.health -= 1
if teammate.health <= 0:
teammate.kill()
teammate_summoned = False
# 检测玩家和医疗包的碰撞
hits = pygame.sprite.spritecollide(naruto, medkits, True)
for medkit in hits:
naruto.health = naruto.max_health
# 检测队友和医疗包的碰撞
if teammate:
hits = pygame.sprite.spritecollide(teammate, medkits, True)
for medkit in hits:
teammate.health = teammate.max_health
# 2000分生成Boss
if score >= 2000 and not boss_spawned:
boss = Boss()
all_sprites.add(boss)
boss_spawned = True
if boss_music:
boss_music.play(-1) # 循环播放
boss_music_playing = True
# 更新Boss
if boss_spawned:
boss.update(naruto)
# 更新Boss的激光
for laser in boss.lasers:
if not laser.alive():
all_sprites.add(laser)
boss.lasers.update()
# 检测玩家和激光的碰撞
hits = pygame.sprite.spritecollide(naruto, boss.lasers, False)
for laser in hits:
naruto.health -= laser.damage
laser.kill()
if naruto.health <= 0:
game_over = True
# 检测队友和激光的碰撞
if teammate:
hits = pygame.sprite.spritecollide(teammate, boss.lasers, False)
for laser in hits:
teammate.health -= laser.damage
laser.kill()
if teammate.health <= 0:
teammate.kill()
teammate_summoned = False
# 检测螺旋丸和Boss的碰撞
hits = pygame.sprite.spritecollide(boss, rasengans, True)
for rasengan in hits:
boss.health -= rasengan.damage
if rasengan.explode_on_contact:
explosion = Explosion(boss.rect.centerx, boss.rect.centery)
all_sprites.add(explosion)
explosions.add(explosion)
if boss.health <= 0:
boss.kill()
score += 500 # Boss死亡加500分
boss_spawned = False
if boss_music and boss_music_playing:
boss_music.stop()
boss_music_playing = False
# 检测队友子弹和Boss的碰撞
if teammate:
hits = pygame.sprite.spritecollide(boss, teammate_bullets, True)
for bullet in hits:
boss.health -= bullet.damage
if boss.health <= 0:
boss.kill()
score += 500 # Boss死亡加500分
boss_spawned = False
if boss_music and boss_music_playing:
boss_music.stop()
boss_music_playing = False
# 绘制
screen.fill(BLACK)
all_sprites.draw(screen)
# 显示玩家昵称
name_surface = font.render(f"玩家: {player_name}", True, WHITE)
name_rect = pygame.Rect(5, HEIGHT - 40, name_surface.get_width() + 10, name_surface.get_height() + 10)
pygame.draw.rect(screen, (0, 0, 0, 128), name_rect, border_radius=5)
screen.blit(name_surface, (10, HEIGHT - 35))
# 显示分数和生命值
score_text = font.render(f"分数: {score}", True, WHITE)
health_text = font.render(f"生命值: {naruto.health}/{naruto.max_health}", True, WHITE)
level_text = font.render(f"等级: {naruto.current_level}", True, WHITE)
screen.blit(score_text, (5, 10))
screen.blit(health_text, (5, 50))
screen.blit(level_text, (5, 90))
# 显示队友血量
if teammate:
teammate_health_text = font.render(f"队友生命值: {teammate.health}/{teammate.max_health}", True, GREEN)
screen.blit(teammate_health_text, (5, 130))
# 显示能量条
draw_energy_bar(screen, energy)
# 显示当前能力说明
if score >= 1000:
ability_text = font.render("能力: 一击必杀 + 范围爆炸 + 高血量", True, WHITE)
elif score >= 500:
ability_text = font.render("能力: 一击必杀 + 范围爆炸", True, WHITE)
elif score >= 200:
ability_text = font.render("能力: 一击必杀", True, WHITE)
else:
ability_text = font.render("能力: 普通攻击", True, WHITE)
screen.blit(ability_text, (5, 170 if teammate else 130))
# 显示敌人血量翻倍消息
if enemy_health_message_timer > 0:
enemy_health_message_timer -= 1
if enemy_health_message_timer % 30 < 15: # 闪烁效果
message_text = font.render("敌人血量为原来的2倍!", True, RED)
screen.blit(message_text, (WIDTH//2 - 150, 50))
# 显示操作提示
controls_text = font.render("移动:WASD 攻击:J 清屏:K(满能量) 召唤队友:L(500能量)", True, WHITE)
screen.blit(controls_text, (WIDTH//2 - 300, HEIGHT - 40))
# 显示Boss血量
if boss_spawned:
boss_health_text = font.render(f"Boss血量: {boss.health}", True, RED)
screen.blit(boss_health_text, (WIDTH - 350, 90))
else:
# 游戏结束画面
screen.fill(BLACK)
game_over_text = font.render("游戏结束! 按R键重新开始", True, WHITE)
final_score_text = font.render(f"最终分数: {score}", True, WHITE)
screen.blit(game_over_text, (WIDTH//2 - 180, HEIGHT//2 - 30))
screen.blit(final_score_text, (WIDTH//2 - 100, HEIGHT//2 + 20))
pygame.display.flip()
clock.tick(60)
pygame.quit()
sys.exit()
if __name__ == "__main__":
main()