pygame的应用——python版飞机大战

利用pygame实现了简易版飞机大战。源代码如下:

# -*- coding:utf-8 -*-
import pygame
import sys
from pygame.locals import *
from pygame.font import *
import time
import random

class Hero(object):
    #玩家 英雄类
    def __init__(self, screen_temp):
        self.x = 210
        self.y = 700
        self.life = 21
        # self.life = 100
        self.image = pygame.image.load("./feiji/hero1.png")
        self.screen = screen_temp
        self.bullet_list = []#用来存储子弹对象的引用
        #爆炸效果用的如下属性
        self.hit = False #表示是否要爆炸
        self.bomb_list = [] #用来存储爆炸时需要的图片
        self.__create_images() #调用这个方法向bomb_list中添加图片
        self.image_num = 0 #用来记录while True的次数,当次数达到一定值时才显示一张爆炸的图,然后清空,,当这个次数再次达到时,再显示下一个爆炸效果的图片
        self.image_index = 0#用来记录当前要显示的爆炸效果的图片的序号

    def __create_images(self):
        #添加爆炸图片
        self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n1.png"))
        self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n2.png"))
        self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n3.png"))
        self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n4.png"))

    def display(self):
        #显示玩家的飞机
        #如果被击中,就显示爆炸效果,否则显示普通的飞机效果
        if self.hit == True:
            self.screen.blit(self.bomb_list[self.image_index], (self.x, self.y))#(self.x, self.y)是指当前英雄的位置
            #blit方法 (一个对象,左上角位置)
            self.image_num += 1
            print(self.image_num)
            if self.image_num == 7:
                self.image_num = 0
                self.image_index += 1
                print(self.image_index) #这里子弹打住英雄时没有被清除掉,所以打一下,就死了
            if self.image_index > 3:
                time.sleep(1)
                exit()#调用exit让游戏退出
                #self.image_index = 0
        else:
            if self.x< 0:   #控制英雄,不让它跑出界面
                self.x = 0
            elif self.x > 382:
                self.x = 382
            if self.y < 0:
                self.y = 0
            elif self.y > 750:
                self.y = 750
            self.screen.blit(self.image,(self.x, self.y))#z这里是只要没有被打中,就一直是刚开始的样子

        #不管玩家飞机是否被击中,都要显示发射出去的子弹
        for bullet in self.bullet_list:
            bullet.display()
            bullet.move()

    def move(self, move_x,move_y):
        self.x += move_x
        self.y += move_y

    def fire(self):
        #通过创建一个子弹对象,完成发射子弹
        bullet = Bullet(self.screen, self.x, self.y)#创建一个子弹对象
        self.bullet_list.append(bullet)

    def bomb(self):
        self.hit = True

    def judge(self):
        global life
        if life <= 0:
            self.bomb()

class Bullet(object):
    #玩家子弹类
    def __init__(self, screen_temp, x_temp, y_temp):
        self.x = x_temp + 40
        self.y = y_temp - 20
        self.image = pygame.image.load("./feiji/bullet.png")
        self.screen = screen_temp
        
    def display(self):
        self.screen.blit(self.image, (self.x, self.y))

    def move(self):
        self.y -= 10

class Bullet_Enemy(object):
    #敌机子弹类
    def __init__(self, screen_temp, x_temp, y_temp):
        self.x = x_temp + 25
        self.y = y_temp + 30
        self.image = pygame.image.load("./feiji/bullet1.png")
        self.screen = screen_temp
        
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
       
    def move(self, hero):
        self.y += 10
        global life
        if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
        #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):
            life -= 10
            #self.bullet_list.remove()
            print("---judge_enemy---")
            return True
            if life<=0:
                hero.bomb()
        return False

class Bullet_Boss(object):
    #boss子弹类1
    def __init__(self, screen_temp, x_temp, y_temp):
        self.x = x_temp + 80
        self.y = y_temp + 230
        self.image = pygame.image.load("./feiji/bullet2.png")
        self.screen = screen_temp

    def display(self):
        self.screen.blit(self.image, (self.x, self.y))

    def move(self, hero):
        self.y += 6
        self.x += 2
        global life
        if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
        #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):
            life -= 20
            #self.bullet_list.remove()
            print("---judge_boss---")
            return True
            if life<=0:
                hero.bomb()
        return False

class Bullet_Boss1(object):
    #boss子弹类2
    def __init__(self, screen_temp, x_temp, y_temp):
        self.x = x_temp + 80
        self.y = y_temp + 230
        self.image = pygame.image.load("./feiji/bullet2.png")
        self.screen = screen_temp

    def display(self):
        self.screen.blit(self.image, (self.x, self.y))

    def move(self, hero):
        self.y += 6
        self.x -= 2
        global life
        if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
        #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):
            life -= 20
            #self.bullet_list.remove()
            print("---judge_boss---")
            return True
            if life<=0:
                hero.bomb()
        return False

class Bullet_Boss2(object):
    #boss子弹类3
    def __init__(self, screen_temp, x_temp, y_temp):
        self.x = x_temp + 80
        self.y = y_temp + 230
        self.image = pygame.image.load("./feiji/bullet2.png")
        self.screen = screen_temp

    def display(self):
        self.screen.blit(self.image, (self.x, self.y))

    def move(self, hero):
        self.y += 6
        global life
        if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
        #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):
            life -= 20 
            #self.bullet_list.remove()
            print("---judge_boss---")
            return True
            if life<=0:
                hero.bomb()
        return False

class Base(object):
    #基类  类似于抽象类
    def __init__(self, screen_temp, x, y, image_name):
        self.x = x
        self.y = y 
        self.screen = screen_temp
        self.image = pygame.image.load(image_name)
        self.alive = True

    def display(self):
        if self.alive == True:
            self.screen.blit(self.image, (self.x, self.y))

    def move(self):
        self.y += 5

class bomb_bullet(Base):
    #炸弹类
    def __init__(self, screen_temp):
        Base.__init__(self, screen_temp, random.randint(45, 400), 0, "./feiji/bomb.png")

    def judge(self, hero):
        if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
            self.alive = False
            hero.bomb()

        if self.y >= 850:
            #self.alive = False
            self.y = 0
            self.x = random.randint(45, 400)
            #print("bomb.y = %d"%self.y)

class supply(Base):
    #补给类
    def __init__(self, screen_temp):
        Base.__init__(self, screen_temp, random.randint(45, 400), -300, "./feiji/bomb-1.gif")

    def judge(self, hero):
        global life
        if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
            self.alive = False
            life += 10

        if self.y >= 1500:
            self.y = 0
            self.x = random.randint(45, 400)
            self.alive = True

class clear_bullet(Base):
    def __init__(self, screen_temp):
        Base.__init__(self, screen_temp, random.randint(45, 400), 0, "./feiji/bomb-2.gif")
        self.alive = False

    def judge(self, hero, enemies):
        global q
        q += 1
        #self.move()
        if q == 20:
            #self.move()
            self.alive = True
            q = 0
            if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
                self.alive = False
                for enemy in enemies:
                    enemy.hit == True

            
class EnemyPlane(object):
    #敌机类
    def __init__(self, screen_temp):
        self.x = random.randint(15, 480)
        self.y = 0
        self.image = pygame.image.load("./feiji/enemy0.png")
        self.screen = screen_temp
        self.bullet_list = []#用来存储子弹对象的引用
        #self.direction = "right"#用来设置这个飞机默认的移动方向
        self.hit = False
        self.bomb_list = []
        self.__create_images()
        self.image_num = 0
        self.image_index = 0
        #利用产生的随机数,随机确定飞机初始移动方向
        self.k = random.randint(1, 20)
        if self.k <= 10:
            self.direction = "right"
        elif self.k > 10:
            self.direction = "left"

    def display(self, hero):
        #显示敌人的飞机
        if not self.hit:
            self.screen.blit(self.image, (self.x,self.y))
        else:
            self.screen.blit(self.bomb_list[self.image_index], (self.x,self.y))
            self.image_num += 1
            if self.image_num == 3 and self.image_index < 3:
                self.image_num = 0
                self.image_index += 1
                #print(self.image_index)
            # if self.image_index > 2:
            #     time.sleep(0.1)

        for bullet in self.bullet_list:
            bullet.display()
            if(bullet.move(hero)):
                self.bullet_list.remove(bullet)

    def move(self):
        #利用随机数来控制飞机移动距离,以及移动范围
        d1 = random.uniform(1,3)
        d2 = random.uniform(0.2,3)
        p1 = random.uniform(50,100)
        p2 = random.uniform(-200,0)
        if self.direction == "right":
            self.x += d1
        elif self.direction == "left":
            self.x -= d1

        if self.x > 480 - p1:
            #480 - 50
            self.direction="left"
        elif self.x < p2:
            self.direction = "right"
        self.y += d2

    def bomb(self):
        self.hit = True

    def __create_images(self):
        self.bomb_list.append(pygame.image.load("./feiji/enemy0_down1.png"))
        self.bomb_list.append(pygame.image.load("./feiji/enemy0_down2.png"))
        self.bomb_list.append(pygame.image.load("./feiji/enemy0_down3.png"))
        self.bomb_list.append(pygame.image.load("./feiji/enemy0_down4.png"))

    def fire(self):
        #利用随机数来控制敌机的开火,1/80的概率
        s = random.randint(0,800)
        bullet1 = Bullet_Enemy(self.screen, self.x, self.y)
        if s < 10:
            self.bullet_list.append(bullet1)

class EnemyPlanes(EnemyPlane):
    #敌机群类  继承自EnemyPlane类  
    def __init__(self, screen_temp):
        EnemyPlane.__init__(self, screen_temp)
        self.num = 0
        self.enemy_list = []  #用列表存储产生的多架敌机
        self.screen = screen_temp

    def add_enemy(self, num):  
    #产生多架敌机的函数
        self.num = num
        for i in range(num):
            enemy = EnemyPlane(self.screen)
            self.enemy_list.append(enemy)

    def display(self, hero):
        for i in range(self.num):
            self.enemy_list[i].display(hero)
    
    def move(self):
        for i in range(self.num): 
            self.enemy_list[i].move()

    def fire(self):
        #s = random.randint(0,1000)
        for i in range(self.num):
            self.enemy_list[i].fire()

class Boss(EnemyPlane):
    #boss敌机类 继承自EnemyPlane类
    def __init__(self,screen_temp):
        EnemyPlane.__init__(self,screen_temp)
        self.x = 150
        self.y = 0
        self.bomb_list = []
        self.__create_images()
        self.image = pygame.image.load("./feiji/enemy2.png")
        self.screen = screen_temp
        self.bullet_list = []

    def __create_images(self):
        #self.bomb_list.append(pygame.image.load("./feiji/enemy2.png"))
        self.bomb_list.append(pygame.image.load("./feiji/enemy2.png"))
        self.bomb_list.append(pygame.image.load("./feiji/enemy2_down1.png"))
        self.bomb_list.append(pygame.image.load("./feiji/enemy2_down2.png"))
        self.bomb_list.append(pygame.image.load("./feiji/enemy2_down3.png"))
        self.bomb_list.append(pygame.image.load("./feiji/enemy2_down4.png"))
        self.bomb_list.append(pygame.image.load("./feiji/enemy2_down5.png"))
        self.bomb_list.append(pygame.image.load("./feiji/enemy2_down6.png"))

    def display(self, hero):
        #显示敌人的飞机
        global g
        #print(g)
        self.screen.blit(self.bomb_list[g], (self.x,self.y))
        for bullet in self.bullet_list:
            bullet.display()
            if(bullet.move(hero)):
                self.bullet_list.remove(bullet)

    def move(self):
        d1 = 0
        self.y += 0

    def fire(self):
        global s
        s += 1
        bullet1 = Bullet_Boss(self.screen, self.x, self.y)
        bullet2 = Bullet_Boss1(self.screen, self.x, self.y)
        bullet3 = Bullet_Boss2(self.screen, self.x, self.y)
        if s == 20:
            s = 0 
            self.bullet_list.append(bullet1)
            self.bullet_list.append(bullet2)
            self.bullet_list.append(bullet3)

def judge1(hero,enemy):
    #判断敌机的炸毁
    for bullet1 in hero.bullet_list:
        if bullet1.y in range(int(enemy.y),int(enemy.y + 30)) and bullet1.x in range(int(enemy.x-10),int(enemy.x + 50)):
            hero.bullet_list.remove(bullet1)
            enemy.bomb()
        if bullet1.y < 0 or bullet1.x < 0 or bullet1.x > 480: #删除越界的玩家子弹
            hero.bullet_list.remove(bullet1) 

def judge3(hero,boss):
    #判断boss的炸毁
    global goal, g, goal0
    for bullet3 in hero.bullet_list:
        if bullet3.y in range(int(boss.y), int(boss.y + 60)) and bullet3.x in range(int(boss.x), int(boss.x + 100)):
            hero.bullet_list.remove(bullet3)
            g += 1
            boss.image = boss.bomb_list[g]
            print("g = %d"%g)
            if g >= 6:
                boss.y, g, goal = 0, 0, 0
                boss.bomb()
                goal0 += 10 
                
def clear_enemy(enemies):
    #清除敌机群类中被炸毁的敌机
    global goal, goal0
    for enemy in enemies.enemy_list:
        if enemy.hit == True and enemy.image_index == 3:
            enemies.enemy_list.remove(enemy)
            enemies.num -= 1
            goal += 1
            goal0 += 5
            print("goal = %d"%goal)
        if enemy.y >= 850:
            enemies.enemy_list.remove(enemy)
            enemies.num -= 1

def judge_num(enemies):
    #判断频幕上敌人的数量,如果为零,继续添加敌人
    n = random.randint(1,5)
    if len(enemies.enemy_list) == 0:
        enemies.add_enemy(n)

def show_text(screen_temp):
    #在屏幕上显示文字
    text = "GOAL:" + str(goal0) + "Life:" + str(life) 
    font_size = 50
    pos = (0,0)
    color = (0,255,0)
    cur_font = pygame.font.SysFont("宋体",font_size)
    text_fmt = cur_font.render(text, 1, color)
    screen_temp.blit(text_fmt, pos)

def creat_bomb(screen_temp):
    bomb = bomb_bullet(screen_temp)
    bomb_list = []
    bomb_list.apend(bomb)

#定义的全局变量
goal = 0  #玩家得分
goal0 = 0
g = 0 #击中boss的次数
life = 100#生命值
s = 0 #判断大boss是否发射子弹
q = 0

def main():
    #主函数执行
    #获取事件,比如按键等
    bb = False
    move_x = 0
    move_y = 0
    pygame.init()
    screen = pygame.display.set_mode((480,852),0,32)
    #                                 210,400
    background = pygame.image.load("./feiji/background.png")
    pygame.display.set_caption("飞机大战")
    atlas = pygame.image.load("./feiji/New Atlas.png")
    #创建玩家飞机
    hero = Hero(screen)
    #创建敌机群
    enemis = EnemyPlanes(screen)
    enemis.add_enemy(5)
    #创建boss对象
    boss = Boss(screen)
    #创建炸弹对象
    bomb = bomb_bullet(screen)
    #创建补给对象
    supply0 = supply(screen)
    clear = clear_bullet(screen)
    left_key, right_key, up_key, down_key, done = 0, 0, 0, 0, 0
    # mark = 0#用来判断boss发射子弹
    while True:
        if done:
            if done % 8 == 0:
                done = 1
                hero.fire()
            else:
                done += 1
        for event in pygame.event.get():
            #判断是否是点击了退出按钮
            if event.type == QUIT:
                print("exit")
                exit()
            #判断是否是按下了键
            if event.type == KEYDOWN :
                #down
                #检测按键是否是a或者left

                if event.key == K_a or event.key == K_LEFT:
                    #print('left')
                    move_x = -5
                    left_key += 1 

                #检测按键是否是d或者right
                elif event.key == K_d or event.key == K_RIGHT:
                    #print('right')
                    move_x = 5
                    right_key += 1

                elif event.key == K_w or event.key == K_UP:
                    move_y = -5
                    up_key += 1

                elif event.key == K_s or event.key == K_DOWN:
                    move_y = 5
                    down_key += 1

                #检测按键是否是空格键
                elif event.key == K_SPACE:
                    #print('space')
                    hero.fire()
                    done = 1
                    #enemis.fire()

                elif event.key == K_b:
                    print('b')
                    hero.bomb()

            if event.type == KEYUP:
                if event.key == K_a or event.key == K_LEFT:
                    left_key -= 1
                    if right_key == 0:
                        move_x = 0
                    else:
                        move_x = 5

                if event.key == K_d or event.key == K_RIGHT:
                    right_key -= 1
                    if left_key == 0:
                        move_x = 0
                    else:
                        move_x = -5

                if event.key == K_w or event.key == K_UP:
                    up_key -= 1
                    if down_key == 0:
                        move_y = 0
                    else:
                        move_y = 5  

                if event.key == K_s or event.key == K_DOWN:
                    down_key -= 1
                    if up_key == 0:
                        move_y = 0
                    else:
                        move_y = -5

                if event.key == K_SPACE:
                    done = 0 

        screen.blit(background, (0, 0))
        hero.move(move_x, move_y)
        hero.display()
        hero.judge()
        enemis.display(hero)
        enemis.move()
        enemis.fire()
        bomb.display()
        bomb.judge(hero)
        bomb.move()
        supply0.display()
        supply0.judge(hero)
        supply0.move()
        #clear.display()
        #clear.judge(hero, enemis)
        #clear.move()
        for i in range(enemis.num):
            judge1(hero, enemis.enemy_list[i])
            #enemis.enemy_list[i].judge(hero)
        clear_enemy(enemis)
        judge_num(enemis)
        show_text(screen)
        if goal >= 15:
            boss.display(hero)
            boss.move()
            # mark+=1
            # if mark==8:
            boss.fire()
                # mark = 0
            #boss.judge
            judge3(hero, boss)
        pygame.display.update()

if __name__ == "__main__":
    main()

方法是利用面向对象的思想,写了基本的敌机类、英雄类、武器类等,利用继承关系产生多架敌机。
相关文件、图片、素材、源代码下载
提取码:p453

上面链接已失效,新链接地址:

链接: https://pan.baidu.com/s/1guKzPpaPkbsz3dJZJlZl8g 提取码: 2uyb 复制这段内容后打开百度网盘手机App,操作更方便哦

  • 12
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangbowj123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值