猫史档案馆


【Python作品分享】飞机大战【作品秀】

用户:编程之魂的复活编程之魂的复活查看:0 回复:0 评论:0 创建时间:2023-04-08T15:08:26


【作品展示】

center_image

 

【作品介绍】

 

【作品源代码】

import pygame
import random
import os
import pathlib

FPS = 60
WIDTH = 500
HEIGHT = 600
BLACK = (0,0,0)
GREEN = (0,255,0)
RED = (255,0,0)
YELLOW = (255,255,0)
WHITE = (255,255,255)

pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("飞机大战")
clock = pygame.time.Clock()

folder= pathlib.Path(__file__).parent.resolve()

background_img = pygame.image.load(os.path.join(folder,"su","img","background.png")).convert()
player_img = pygame.image.load(os.path.join(folder,"su","img","player.png")).convert()
player_mini_img = pygame.transform.scale(player_img,(25,20))
player_mini_img.set_colorkey(BLACK)

rock_img = pygame.image.load(os.path.join(folder,"su","img","rock.png")).convert()
bullet_img = pygame.image.load(os.path.join(folder,"su","img","bullet.png")).convert()
rock_imges =[]
for i in range(7):
    rock_imges.append(pygame.image.load(os.path.join(folder,"su","img",f"rock{i}.png")).convert())

expl_anim = {}
expl_anim['lg'] = []
expl_anim['喵'] = []
expl_anim['player'] = []
for i in range(9):
    expl_img = pygame.image.load(os.path.join(folder,"su","img",f"expl{i}.png")).convert()
    expl_img.set_colorkey(BLACK)
    expl_anim["lg"].append(pygame.transform.scale(expl_img,(75,75)))
    expl_anim["喵"].append(pygame.transform.scale(expl_img,(30,30)))
    player_expl_img = pygame.image.load(os.path.join(folder,"su","img",f"player_expl{i}.png")).convert()
    player_expl_img.set_colorkey(BLACK)
    expl_anim['player'].append(player_expl_img)

power_imgs = {}
power_imgs['shield'] = pygame.image.load(os.path.join(folder,"su","img","shield.png")).convert()
power_imgs['喵'] = pygame.image.load(os.path.join(folder,"su","img","喵.png")).convert()

shoot_sound = pygame.mixer.Sound(os.path.join(folder,"su","sound","shoot.wav"))
expl_sound = [
    pygame.mixer.Sound(os.path.join(folder,"su","sound","expl0.wav")),
    pygame.mixer.Sound(os.path.join(folder,"su","sound","expl1.wav"))
]
die_sound = pygame.mixer.Sound(os.path.join(folder,"su","sound","rumble.ogg"))
shield_sound = pygame.mixer.Sound(os.path.join(folder,"su","sound","pow0.wav"))
喵_sound = pygame.mixer.Sound(os.path.join(folder,"su","sound","pow1.wav"))

pygame.mixer.music.load(os.path.join(folder,"su","sound","background.ogg"))
pygame.mixer.music.set_volume(0.5)

font_name = os.path.join(folder,"su","font.ttf")

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 draw_health(surf,hp,x,y):
    if hp<0:
        hp=0
    BAR_LENGTH = 100
    BAR_HIGHT = 10
    fill = (hp/100)*BAR_LENGTH
    outline_rect = pygame.Rect(x,y,BAR_LENGTH,BAR_HIGHT)
    fill_rect = pygame.Rect(x,y,fill,BAR_HIGHT)
    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 new_rock():
    rock = Rock()
    all_sprites.add(rock)
    rocks.add(rock)

def draw_init():
    screen.blit(background_img,(0,0))
    draw_text(screen,"飞机大战",62,WIDTH/2,HEIGHT/4)
    draw_text(screen,"左右键移动,空格键发射",22,WIDTH/2,HEIGHT/2)
    draw_text(screen,"任意键开始",15,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()
               return True
            elif event.type == pygame.KEYUP:
               waiting = False
               return False

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.transform.scale(player_img,(50,40))
        self.image.set_colorkey(BLACK)
        #半径
        self.rect = self.image.get_rect()
        self.radius = 26

        #pygame.draw.circle(self.image,RED,self.rect.center,self.radius)
        self.rect.centerx = WIDTH/2
        self.rect.bottom = HEIGHT - 100

        self.speedx = 8
        self.health = 100
        self.lives = 3
        self.hidden = False
        self.喵 = 1
        
    def update(self):
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_RIGHT]:
            self.rect.x += self.speedx
        if key_pressed[pygame.K_LEFT]:
            self.rect.x -= self.speedx
        
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0
    
        now=pygame.time.get_ticks()
        
        if self.hidden and now - self.hide_time > 1000:
            self.hidden = False
            self.rect.centerx = WIDTH/2
            self.rect.bottom = HEIGHT - 100

        if self.gun > 1 and now - self.gun_times > 5000:
            self.gun = 1

    def shoot(self):
        if not (self.hidden):
            if self.gun == 1:
               bullet = Bullet(self.rect.centerx,self.rect.centery)
               all_sprites.add(bullet)
               Bullets.add(bullet)
               shoot_sound.play()
            elif 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()


    def hide(self):
        self.hidden = True
        self.hide_time = pygame.time.get_ticks()
        self.rect.center = (WIDTH/2,HEIGHT+500)

    def group(self):
        self.gun = self.gun + 1
        self.gun_times = pygame.time.get_ticks()

class Rock(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image_origin = random.choice(rock_imges)
        self.image_origin.set_colorkey(BLACK)
        self.image = self.image_origin.copy()

        self.rect = self.image.get_rect()

        self.radius = self.rect.width/2.2
        #pygame.draw.circle(self.image,RED,self.rect.center,self.radius)

        self.rect.x = random.randrange(0,WIDTH - self.rect.width)
        self.rect.y = random.randrange(-180,-100)

        self.speedy = random.randrange(2,10)
        self.speedx = random.randrange(-3,3)

        self.total_degree = 0
        self.rot_orgree = random.randrange(-3,3)

    def rotate(self):
        self.total_degree = self.total_degree + self.rot_orgree
        self.total_degree = self.total_degree % 360
        self.image = pygame.transform.rotate(self.image_origin,self.total_degree)
        center = self.rect.center
        self.rect = self.image.get_rect()
        self.rect.center = center

    def update(self):
        self.rotate()
        self.rect.y += self.speedy
        self.rect.x += self.speedx
        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 Bullet(pygame.sprite.Sprite):
    def __init__(self,x,y):
        pygame.sprite.Sprite.__init__(self)
        self.image = bullet_img
        self.image.set_colorkey(BLACK)

        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

        
        self.speedy = -10

    def update(self):
        self.rect.y += self.speedy
        if self.rect.bottom < 0:
            self.喵()

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

    def update(self):
        now =pygame.time.get_ticks()
        if now - self.last_update > 50:
            self.last_update = now
            self.frame = self.frame + 1
            if self.frame == len(expl_anim[self.size]):
               self.喵()
            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'])
        self.image = power_imgs[self.type]
        self.image.set_colorkey(BLACK)
        if self.type == 'shield':
            shield_sound.play()
        elif self.type == 'gun':
            gun_sound.play()

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

show_init = True    
running = True
while running:
    if show_init:
        close = draw_init()
        if close:
            break
        show_init = False
    
        all_sprites = pygame.sprite.Group()
        rocks = pygame.sprite.Group()
        powers = pygame.sprite.Group()
        Bullets = pygame.sprite.Group()
        player = Player()
        all_sprites.add(player)
        score = 0
        a = 0
        pygame.mixer.music.play(-1)
        for i in range(8):
            new_rock()    
    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:
              player.shoot()  
    
    all_sprites.update()

    hits_rockandbullet = pygame.sprite.groupcollide(rocks,Bullets,True,True)
    for hit in hits_rockandbullet:
        random.choice(expl_sound).play()
        expl = Explosion(hit.rect.center,'lg')
        all_sprites.add(expl)
        new_rock()
        score = score + int(hit.radius)
        a=a+1
        print(a)
        if score <= 1500:
            if random.random() < 1:
              p = Power(hit.rect.center)
              all_sprites.add(p)
              powers.add(p)
        if score <= 3500:
            if random.random() < 0.7:
              p = Power(hit.rect.center)
              all_sprites.add(p)
              powers.add(p)
        if score <= 5000:
            if random.random() < 0.5:
              p = Power(hit.rect.center)
              all_sprites.add(p)
              powers.add(p)
        if score <= 7500:
            if random.random() < 0.25:
              p = Power(hit.rect.center)
              all_sprites.add(p)
              powers.add(p)
        if score >= 7500:
            if random.random() < 0.154:
              p = Power(hit.rect.center)
              all_sprites.add(p)
              powers.add(p)

    hits_playerandpower = pygame.sprite.spritecollide(player,powers,True)
    for hit in hits_playerandpower:
        if hit.type == 'shield':
            player.health = player.health + 25
            if player.health > 100:
                player.health = 100
        elif hit.type == '喵':
            player.group()

    hits_playerandrock = pygame.sprite.spritecollide(player,rocks,True,pygame.sprite.collide_circle)
    for hit in hits_playerandrock:
        player.health = player.health - int(hit.radius*2)
        new_rock()
        expl = Explosion(hit.rect.center,'喵')
        all_sprites.add(expl)
        if player.health<=0:
           death_expl = Explosion(player.rect.center,'player')
           all_sprites.add(death_expl)
           die_sound.play()
           player.lives =player.lives - 1
           player.health = 100
           player.hide()
        if player.lives == 0:
           show_init = True

    screen.fill(BLACK)
    screen.blit(background_img,(0,0))
    all_sprites.draw(screen)
    draw_text(screen,str(score),20,WIDTH/2,0)
    draw_health(screen,player.health,10,30)
    draw_lives(screen,player.lives,player_mini_img,WIDTH-100,15)
    pygame.display.update()
pygame.quit()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 0下一页