python飞机大战给敌机加上血量

您所在的位置:网站首页 飞机大战编程python完整代码 python飞机大战给敌机加上血量

python飞机大战给敌机加上血量

2023-04-17 16:03| 来源: 网络整理| 查看: 265

python飞机大战给敌机加上血量,多次尝试,没有成功。原代码

import pygame import random import os FPS = 60 WHITE = (255, 255, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) YELLOW = (0, 0, 255) BLACK = (0, 0, 0) WIDTH = 500 HEIGHT = 600 pygame.init() pygame.mixer.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("飞机大战") clock = pygame.time.Clock() # 载入图片 background_img = pygame.image.load( os.path.join("img", "background.png")).convert() player_img = pygame.image.load(os.path.join("img", "player.png")).convert() player_mini_img = pygame.transform.scale(player_img, (25, 19)) player_mini_img.set_colorkey(WHITE) rock_img = pygame.image.load(os.path.join("img", "rock.png")).convert() bullet_img = pygame.image.load(os.path.join("img", "bullet.png")).convert() plane_img = pygame.image.load(os.path.join("img", "plane.png")).convert() # 音乐 shoot_sound = pygame.mixer.Sound(os.path.join("sound", "shoot.mp3")) gun_sound = pygame.mixer.Sound(os.path.join("sound", "gun.mp3")) shield_sound = pygame.mixer.Sound(os.path.join("sound", "gun.mp3")) speed_sound = pygame.mixer.Sound(os.path.join("sound", "gun.mp3")) live_sound = pygame.mixer.Sound(os.path.join("sound", "gun.mp3")) die_sound = pygame.mixer.Sound(os.path.join("sound", "rock1.mp3")) rock_sounds = [ pygame.mixer.Sound(os.path.join("sound", "rock1.mp3")), pygame.mixer.Sound(os.path.join("sound", "rock2.mp3")) ] pygame.mixer.music.load(os.path.join("sound", "background.mp3")) plane_sound = pygame.mixer.Sound(os.path.join("sound", "plane.mp3")) font_name = os.path.join('STXINGKA.TTF') # 爆炸动画 expl_anim = {} expl_anim['lg'] = [] expl_anim['sm'] = [] expl_anim['player'] = [] for i in range(9): expl_img = pygame.image.load(os.path.join("img", f"expl{i}.png")).convert() expl_img.set_colorkey(WHITE) expl_anim['lg'].append(pygame.transform.scale(expl_img, (75, 75))) expl_anim['sm'].append(pygame.transform.scale(expl_img, (30, 30))) player_expl_img = pygame.image.load(os.path.join("img", f"expl{i}.png")).convert() player_expl_img.set_colorkey(WHITE) expl_anim['player'].append(player_expl_img) # 道具 power_imgs = {} power_imgs['shield'] = pygame.image.load(os.path.join("img", "shield.png")).convert() power_imgs['gun'] = pygame.image.load(os.path.join("img", "gun.png")).convert() power_imgs['speed'] = pygame.image.load(os.path.join("img", "speed.png")).convert() power_imgs['live'] = pygame.image.load(os.path.join("img", "live.png")).convert() # 创建陨石事件 CREATE_ROCK_EVENT = pygame.USEREVENT pygame.time.set_timer(CREATE_ROCK_EVENT, 1000) def draw_text(surf, text, size, x, y): font = pygame.font.Font(font_name, size) text_surface = font.render(text, True, WHITE) text_rect = text_surface.get_rect() text_rect.centerx = x text_rect.top = y surf.blit(text_surface, text_rect) def new_rock(): r = Rock() all_sprites.add(r) rocks.add(r) def new_plane(): p = Plane() all_sprites.add(p) planes.add(p) def draw_health(surf, hp, x, y): BAR_LENGTH = 100 BAR_HEIGHT = 10 fill = (hp / 100) * BAR_LENGTH outline_rect = pygame.Rect(x, y, BAR_LENGTH, BAR_HEIGHT) fill_rect = pygame.Rect(x, y, fill, BAR_HEIGHT) pygame.draw.rect(surf, GREEN, fill_rect) pygame.draw.rect(surf, WHITE, outline_rect, 2) def draw_lives(surf, lives, img, x, y): for i in range(lives): img_rect = img.get_rect() img_rect.x = x + 30 * i img_rect.y = y surf.blit(img, img_rect) def draw_init(): screen.blit(background_img, (0, 0)) draw_text(screen,'飞机大战!',64,WIDTH/2,HEIGHT/4) draw_text(screen,'左右键移动飞船,空格键发射子弹。',22,WIDTH/2,HEIGHT/2) draw_text(screen,'按任意键开始游戏。',18,WIDTH/2,HEIGHT*3/4) pygame.display.update() waiting = True while waiting: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() elif event.type == pygame.KEYUP: waiting = False class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = player_img self.image.set_colorkey(WHITE) self.rect = self.image.get_rect() self.rect.centerx = WIDTH / 2 self.rect.bottom = HEIGHT - 10 self.speedx = 8 self.health = 100 self.lives = 3 self.hidden = False self.hide_time = 0 self.gun = 1 self.gun_time = 0 self.speed = 1 self.speed_time = 0 def update(self): now=pygame.time.get_ticks() if self.gun>1 and now - self.gun_time>5000: self.gun = 1 if self.speed>1 and now - self.speed_time>5000: self.speed = 1 if self.hidden and now-self.hide_time>1000: self.hidden=False self.rect.centerx=WIDTH/2 self.rect.bottom=HEIGHT-10 # 判断按键按住以及按下 - 元组 if self.speed == 1: keys_pressed = pygame.key.get_pressed() # 判断元组中对应的按键索引值,按为1 if keys_pressed[pygame.K_RIGHT]: player.speedx = 5 self.rect.x += 2 if keys_pressed[pygame.K_LEFT]: player.speedx = -5 self.rect.x -= 2 if self.speed >= 2: keys_pressed = pygame.key.get_pressed() # 判断元组中对应的按键索引值,按为1 if keys_pressed[pygame.K_RIGHT]: player.speedx = 5 self.rect.x += 8 if keys_pressed[pygame.K_LEFT]: player.speedx = -5 self.rect.x -= 8 # 限制英雄在屏幕内 if self.rect.x < 0: self.rect.x = 0 self.speedx = 0 def shoot(self): if not(self.hidden): if self.gun ==1: bullet=Bullet(self.rect.centerx, self.rect.top) all_sprites.add(bullet) bullets.add(bullet) shoot_sound.play() if self.gun ==2: bullet1=Bullet(self.rect.left, self.rect.centery) bullet2=Bullet(self.rect.right, self.rect.centery) all_sprites.add(bullet1) all_sprites.add(bullet2) bullets.add(bullet1) bullets.add(bullet2) shoot_sound.play() if self.gun >=3: bullet1=Bullet(self.rect.left, self.rect.centery) bullet2=Bullet(self.rect.right, self.rect.centery) bullet3=Bullet(self.rect.centerx, self.rect.top) all_sprites.add(bullet1) all_sprites.add(bullet2) all_sprites.add(bullet3) bullets.add(bullet1) bullets.add(bullet2) bullets.add(bullet3) shoot_sound.play() def hide(self): self.hidden = True self.hide_time = pygame.time.get_ticks() self.rect.center = (WIDTH / 2, HEIGHT + 500) def gunup(self): self.gun = self.gun + 1 self.gun_time = pygame.time.get_ticks() def speedup(self): self.speed=self.speed + 1 self.speed_time = pygame.time.get_ticks() class Bullet(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.image = bullet_img self.image.set_colorkey(WHITE) self.rect = self.image.get_rect() self.rect.centerx = x self.rect.bottom = y self.speedy = -10 def update(self): self.rect.y += self.speedy if self.rect.bottom < 0: self.kill() class Rock(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image_orig = rock_img self.image = self.image_orig.copy() # 复制一份新的Surface对象,避免图像变形 self.rect = self.image.get_rect() self.image.set_colorkey(WHITE) self.radius = int(self.rect.width * 0.85 / 2) self.rect.x = random.randrange(0, WIDTH - self.rect.width) self.rect.y = random.randrange(-180, -100) self.speedy = random.randrange(0, 6) self.speedx = random.randrange(-3, 3) self.rect.centerx = WIDTH / 2 self.degree = 0 # 初始化当前角度为0 self.rot_speed = random.randint(-10, 10) # 旋转变化的方向和角度随机 self.last_update = pygame.time.get_ticks() # 记录当前时间点 def rotate(self): now = pygame.time.get_ticks() # 获取当前时间点 if now - self.last_update > 50: # 间隔超过50毫秒时才旋转,以免转得过快 self.last_update = now # 刷新最后更新时间点 # 增加旋转角度,对360取余数是为了让角度数值不超过360度 self.degree = (self.degree + self.rot_speed * 10) % 360 # 旋转的是原始的Surface对象 new_image = pygame.transform.rotate(self.image_orig, self.degree) roate_image = pygame.transform.rotate(self.image_orig, self.degree) new_image = pygame.transform.scale( roate_image, (self.rect.width + 1, self.rect.height + 1)) old_center = self.rect.center # 将原始的rect中心坐标暂存到变量old_center self.image = new_image # 将旋转后的对象重新赋值给self.image self.rect = self.image.get_rect() # 重新获取rect self.rect.center = old_center # 旋转后的rect中心坐标仍然与原来的中心相同 def update(self): self.rotate() self.rect.y += self.speedy self.rect.x += self.speedx if self.rect.y >= HEIGHT or self.rect.x >= WIDTH or self.rect.x < 0: self.kill() if self.rect.top > HEIGHT or self.rect.left > WIDTH or self.rect.right < 0: self.rect.x = random.randrange(0, WIDTH - self.rect.width) self.rect.y = random.randrange(-100, -40) self.speedy = random.randrange(2, 10) self.speedx = random.randrange(-3, 3) class Plane(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = plane_img self.rect = self.image.get_rect() self.radius = int(self.rect.width * 0.85 / 2) self.image.set_colorkey(WHITE) self.rect.x = random.randrange(0, WIDTH - self.rect.width) self.rect.y = random.randrange(-100, -40) self.speedy = 2 def update(self): self.rect.y += self.speedy class Explosion(pygame.sprite.Sprite): def __init__(self, center, size): pygame.sprite.Sprite.__init__(self) self.size = size self.image = expl_anim[self.size][0] self.rect = self.image.get_rect() self.rect.center = center self.frame = 0 self.last_update = pygame.time.get_ticks() self.frame_rate = 50 def update(self): now = pygame.time.get_ticks() if now - self.last_update > self.frame_rate: self.last_update = now self.frame += 1 if self.frame == len(expl_anim[self.size]): self.kill() else: self.image = expl_anim[self.size][self.frame] center = self.rect.center self.rect = self.image.get_rect() self.rect.center = center class Power(pygame.sprite.Sprite): def __init__(self, center): pygame.sprite.Sprite.__init__(self) self.type = random.choice(['shield', 'gun','speed' ,'live']) self.image = power_imgs[self.type] self.image.set_colorkey(WHITE) self.rect = self.image.get_rect() self.rect.center = center self.speedy = 3 def update(self): self.rect.y += self.speedy if self.rect.top > HEIGHT: self.kill() all_sprites = pygame.sprite.Group() rocks = pygame.sprite.Group() bullets = pygame.sprite.Group() planes = pygame.sprite.Group() powers = pygame.sprite.Group() player = Player() all_sprites.add(player) for j in range(8): new_plane() for i in range(8): new_rock() score = 0 pygame.mixer.music.play(-1) running = True show_init = True running = True while running: if show_init: draw_init() show_init = False all_sprites = pygame.sprite.Group() rocks = pygame.sprite.Group() bullets = pygame.sprite.Group() planes = pygame.sprite.Group() powers = pygame.sprite.Group() player = Player() all_sprites.add(player) for j in range(8): new_plane() for i in range(8): new_rock() score = 0 clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == CREATE_ROCK_EVENT: r = Rock() rocks.add(r) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: player.shoot() # 石头和子弹 hits = pygame.sprite.groupcollide(rocks, bullets, True, True) for hit in hits: random.choice(rock_sounds).play() score += hit.radius expl = Explosion(hit.rect.center, 'lg') all_sprites.add(expl) if random.random() > 0.1: pow = Power(hit.rect.center) all_sprites.add(pow) powers.add(pow) new_rock() # 石头和飞船 hits = pygame.sprite.spritecollide(player, rocks, True, pygame.sprite.collide_circle) for hit in hits: new_rock() player.health -= hit.radius expl = Explosion(hit.rect.center, 'sm') all_sprites.add(expl) if player.health 100: player.health=100 shield_sound.play() if hit.type=='gun': player.gunup() gun_sound.play() if hit.type=='speed': player.speedup() speed_sound.play() if hit.type=='live': player.health +=50 if player.health>100: player.health=100 live_sound.play() if player.lives == 0 and not(die.alive()): show_init = True # 飞机与子弹 hits = pygame.sprite.groupcollide(planes, bullets, True, True) for hit in hits: plane_sound.play() score += hit.radius expl = Explosion(hit.rect.center, 'lg') all_sprites.add(expl) if random.random() > 0.1: pow = Power(hit.rect.center) all_sprites.add(pow) powers.add(pow) new_plane() # 飞船与飞机 hits = pygame.sprite.spritecollide( player, planes, True, pygame.sprite.collide_circle) for hit in hits: new_plane() player.health -= hit.radius*5 expl = Explosion(hit.rect.center, 'sm') all_sprites.add(expl) if player.health


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3