Python+Pygame制作飞机大战

大家好,最近又一款风靡一时的小游戏,叫做飞机大战,今天我们就用Python和Pygame来制作一个飞机大战的小游戏吧。

1.设计游戏大纲

我们可以见这个游戏分为三个程序,分别是:定义所需类、函数,定义main函数,调用main函数。将这三个部分添加到三个程序中就是sprite.py、main.py、game.py。

2.sprit.py的程序

首先,是定义类、函数的程序,这里我们将它命名为sprite.py,在这个程序里面,我们需要定义一下类:background、Bullet、Bomb_supply、Bullet_supply、EnemyPlane、MyPlane、Bomb、explode、Again、Gameover。

1.初始化

在定义之前,我们首先需要导入模块以及对一些模块进行初始化。由于Pygame模块是一个第三方模块,所以我们需要另外安装:

pip install pygame

程序: 

import pygame
import random
import sys

pygame.init()

window=pygame.display.set_mode((480,700))
pygame.display.set_caption('飞机大战')
pygame.display.set_icon(pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\me1.png'))

2.background类

class background():
    def __init__(self,is_alt=0):
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\background.png')
        self.rect=self.image.get_rect()
        self.rect.y=is_alt
    def update(self):
        self.rect.y+=1
        if self.rect.centery>=1050:
            self.rect.y=-700
    def draw(self,surface):
        surface.blit(self.image,self.rect)

3.Bullet类

class Bullet():
    def __init__(self,plane):
        self.name='bullet'
        self.plane=plane
        if self.plane.family=='my':
            self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\bullet1.png')
            self.family='my'
        if self.plane.family=='enemy':
            self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\bullet2.png')
            self.family='enemy'
        self.rect=self.image.get_rect()
        self.rect.left=self.plane.rect.left+self.plane.rect.width/2
        if self.plane.family=='my':
            self.rect.top=self.plane.rect.top-10
        if self.plane.family=='enemy':
            self.rect.top=self.plane.rect.bottom-10
        self.live=True
    def Move(self):
        if self.plane.family=='my':
            if self.rect.top>=0:
                self.rect.top-=4
            else:
                self.live=False
        if self.plane.family=='enemy':
            if self.rect.top<=700:
                self.rect.top+=4
            else:
                self.live=False
    def draw(self,surface):
        surface.blit(self.image,self.rect)

4.Bomb_supply类

class Bomb_supply():
    def __init__(self):
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\bomb_supply.png')
        self.rect=self.image.get_rect()
        self.rect.left=random.randint(60,420)
        self.rect.top=0
        self.name='bomb_supply'
        self.live=True
    def Move(self):
        if self.rect.top<=700:
            self.rect.top+=2
        else:
            self.live=False
    def draw(self,surface):
        surface.blit(self.image,self.rect)

5.Bullet_supply类

class Bullet_supply():
    def __init__(self):
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\bullet_supply.png')
        self.rect=self.image.get_rect()
        self.rect.left=random.randint(58,422)
        self.rect.top=0
        self.live=True
        self.name='bomb_supply'
    def Move(self):
        if self.rect.top<=700:
            self.rect.top+=2
        else:
            self.live=False
    def draw(self,surface):
        surface.blit(self.image,self.rect)

6.EnemyPlane类

class EnemyPlane():
    def __init__(self):
        self.type=random.randint(1,100)
        if self.type>=1 and self.type<=50:
            self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\enemy1.png')
            self.rect=self.image.get_rect()
            self.rect.left=random.randint(0,437)
            self.rect.top=0
            self.life=1
            self.nametype=1
        if self.type>50 and self.type<=90:
            self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\enemy2.png')
            self.rect=self.image.get_rect()
            self.rect.left=random.randint(0,411)
            self.rect.top=0
            self.life=3
            self.nametype=2
        if self.type>90 and self.type<=100:
            self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\enemy3_n1.png')
            self.rect=self.image.get_rect()
            self.rect.left=random.randint(0,311)
            self.rect.top=0
            self.life=5
            self.nametype=3
        self.live=True
        self.family='enemy'
        self.name='plane'
        self.bomb_images=[]
        self.bomb_rects=[]
    def shot(self):
        self.t=random.randint(1,1000)
        if self.t>=1 and self.t<=10:
            return Bullet(self)
    def Move(self):
        if self.rect.top<=700:
            self.rect.top+=2
        else:
            self.live=False
    def draw(self,surface):
        surface.blit(self.image,self.rect)
    def hit_return_score(self):
        if self.nametype==1:
            return 1
        elif self.nametype==2:
            return 3
        elif self.nametype==3:
            return 5

7.MyPlane类

class My_Plane():
    def __init__(self,left,top):
        self.bullet_number=10000
        self.name='plane'
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\me1.png')
        self.rect=self.image.get_rect()
        self.rect.left=left
        self.rect.top=top
        self.family='my'
        self.live=True
        self.life=3
        self.bomb=1000
        self.score=0
    def move_left(self):
        if self.rect.left>=0:
            self.rect.left=self.rect.left-3
    def move_right(self):
        if self.rect.left<=480-102:
            self.rect.left+=3
    def draw(self,surface):
        surface.blit(self.image,self.rect)
    def live_if(self,surface):
        if self.life<=0:
            self.live=False
            image1=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\gameover.png')
            image2=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\again.png')
            rect1=image1.get_rect()
            rect1.midleft=240
            rect1.midtop=300
            rect2=image2.get_rect()
            rect2.midleft=240
            rect2.midtop=350
            surface.blit(image1,rect1)
            surface.blit(image2,rect2)
    def draw_image_life(self,surface):
        for i in range(self.life):
            image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\life.png')
            surface.blit(image,(i*46,643))
    def draw_image_bullet(self,surface):
        font=pygame.font.Font('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\silly_younger.ttf', 30)
        text=font.render('Bullet:'+str(self.bullet_number),True,(255,255,255))
        surface.blit(text,(0,30))
    def draw_image_bomb(self,surface):
        font=pygame.font.Font('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\silly_younger.ttf', 30)
        text=font.render('Bomb:'+str(self.bomb),True,(255,255,255))
        surface.blit(text,(0,0))
    def draw_image_score(self,surface):
        font=pygame.font.Font('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\silly_younger.ttf', 30)
        text=font.render('Score:'+str(self.score),True,(255,255,255))
        surface.blit(text,(0,60))
    def shot(self):
        if self.bullet_number>0:
            self.bullet_number-=1
            return Bullet(self)

8.Bomb类

class Bomb():
    def __init__(self,plane):
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\gun_bomb.png')
        self.rect=self.image.get_rect()
        self.rect.left=plane.rect.left+plane.rect.width/2-self.rect.width/2
        self.rect.top=plane.rect.top-40
        self.live=True
    def draw(self,surface):
        surface.blit(self.image,self.rect)
    def Move(self):
        if self.rect.top>=0:
            self.rect.top-=3
        else:
            self.live=False

9.explode类

class explode():
    def __init__(self,plane):
        self.plane=plane
        self.rects=[]
        self.live=True
        self.index=0
        self.interval=4
        self.interval_index=0
        if self.plane.family=='enemy':
            if self.plane.nametype==1:
                self.images=[pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\enemy1_down'+str(v)+'.png') for v in range(1,5)]
            elif self.plane.nametype==2:
                self.images=[pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\enemy2_down'+str(v)+'.png') for v in range(1,5)]
            elif self.plane.nametype==3:
                self.images=[pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\enemy3_down'+str(v)+'.png') for v in range(1,7)]
        elif self.plane.family=='my':
            self.images=[pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\my_destory_'+str(v)+'.png') for v in range(1,5)]
    def set_position(self,x,y):
        self.x=x
        self.y=y
    def action(self):
        if not self.live:
            return
        self.interval_index += 1
        if self.interval_index < self.interval:
            return
        self.interval_index = 0
        self.index = self.index + 1
        if self.index >= len(self.images):
            self.index = 0
            self.live = False
    def draw(self,surface):
        if not self.live:
            return
        surface.blit(self.images[self.index],(self.x,self.y))

10.Again类

class Again():
    def __init__(self):
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\again.png')
        self.rect=self.image.get_rect()
        self.rect.top=250
        self.rect.left=70
        self.live=True
    def draw(self,surface):
        if not self.live:
            return
        surface.blit(self.image,self.rect)

11.Gameover类

class Gameover():
    def __init__(self):
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\gameover.png')
        self.rect=self.image.get_rect()
        self.rect.top=400
        self.rect.left=70
        self.live=True
    def draw(self,surface):
        if not self.live:
            return
        surface.blit(self.image,self.rect)
    def over(self):
        pygame.quit()
        sys.exit()

3.main.py的程序

我们现在就需要添加main函数了。

1.初始化

import pygame
import sys
from sprite import *
import datetime
import random

pygame.init()

left=False
right=False
start=datetime.datetime.now()

screen=window

my=My_Plane(189,700-126)
bullets=[]
bombs=[]
enemy1=None
enemy2=None
enemy3=None
again_type=False
clock=pygame.time.Clock()

back1=background()
back2=background(700)

bullet_supplys=[]
bomb_supplys=[]
explodes=[]

2.main函数

def main():
    global left,right,start,screen,my,bullets,bombs,enemy1,enemy2,enemy3,clock,back1,back2,bullet_supplys,bomb_supplys,explodes,again_type
    while True:
        while True:
            for event in pygame.event.get():
                if event.type==pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type==pygame.KEYDOWN:
                    if event.key==pygame.K_ESCAPE:
                        pygame.quit()
                        sys.exit()
                    if event.key==pygame.K_LEFT:
                        left=True
                    if event.key==pygame.K_RIGHT:
                        right=True
                    if event.key==pygame.K_SPACE:
                        bullet=my.shot()
                        bullets.append(bullet)
                if event.type==pygame.KEYUP:
                    left=right=False
                if event.type==pygame.MOUSEBUTTONDOWN:
                    if my.bomb>0:
                        bombs.append(Bomb(my))
                        my.bomb-=1
            if left==True:
                my.move_left()
            if right==True:
                my.move_right()

            back1.update()
            back1.draw(screen)

            back2.update()
            back2.draw(screen)

            if bullets!=[]:
                try:
                    for bullet in bullets:
                        if bullet!=None:
                            if bullet.live==False:
                                bullets.remove(bullet)
                            elif bullet.live==True:
                                bullet.Move()
                                bullet.draw(screen)
                        else:
                            continue
                except:
                    bullets=[]

            if bombs!=[]:
                try:
                    for bomb in bombs:
                        if bomb.live==False:
                            bombs.remove(bomb)
                        elif bomb.live==True:
                            bomb.Move()
                            bomb.draw(screen)
                except:
                    bombs=[]

            if (datetime.datetime.now()-start).seconds%2==0:
                if bullet_supplys==[]:
                    bullet_supplys.append(Bullet_supply())
            if (datetime.datetime.now()-start).seconds%5==0:
                if bomb_supplys==[]:
                    bomb_supplys.append(Bomb_supply())

            for i in bullet_supplys:
                i.Move()
                i.draw(screen)
                if my.rect.colliderect(i.rect):
                    my.bullet_number+=1
                    bullet_supplys.remove(i)
                if i.live==False:
                    bullet_supplys.remove(i)
            for j in bomb_supplys:
                j.Move()
                j.draw(screen)
                if my.rect.colliderect(j.rect):
                    my.bomb+=1
                    bomb_supplys.remove(j)
                if j.live==False:
                    bomb_supplys.remove(j)

            my.draw(screen)
            my.draw_image_life(screen)
            my.draw_image_bullet(screen)
            my.draw_image_bomb(screen)
            my.draw_image_score(screen)

            if enemy1==None:
                enemy1=EnemyPlane()
            else:
                if enemy1.life<=0:
                    enemy1.live=False
                if enemy1.live==False:
                    if enemy1.rect.top<=700:
                        explodes.append(explode(enemy1))
                        my.score+=enemy1.hit_return_score()
                    enemy1=None
                    continue
                enemy1.Move()
                enemy1.draw(screen)
                for k in bullets:
                    if k!=None:
                        if k.family=='my':
                            if enemy1.rect.colliderect(k.rect):
                                enemy1.life-=1
                                bullets.remove(k)
                for e in bombs:
                    if enemy1.rect.colliderect(e.rect):
                        enemy1.life-=3
                        bombs.remove(e)
                bullets.append(enemy1.shot())
            if enemy2==None:
                enemy2=EnemyPlane()
            else:
                if enemy2.life<=0:
                    enemy2.live=False
                if enemy2.live==False:
                    if enemy2.rect.top<=700:
                        explodes.append(explode(enemy2))
                        my.score+=enemy2.hit_return_score()
                    enemy2=None
                    continue
                enemy2.Move()
                enemy2.draw(screen)
                for k in bullets:
                    if k!=None:
                        if k.family=='my':
                            if enemy2.rect.colliderect(k.rect):
                                enemy2.life-=1
                                bullets.remove(k)
                for e in bombs:
                    if enemy2.rect.colliderect(e.rect):
                        enemy2.life-=3
                        bombs.remove(e)
                bullets.append(enemy2.shot())
            if enemy3==None:
                enemy3=EnemyPlane()
            else:
                if enemy3.life<=0:
                    enemy3.live=False
                if enemy3.live==False:
                    if enemy3.rect.top<=700:
                        explodes.append(explode(enemy3))
                        my.score+=enemy3.hit_return_score()
                    enemy3=None
                    continue
                enemy3.Move()
                enemy3.draw(screen)
                for k in bullets:
                    if k!=None:
                        if k.family=='my':
                            if enemy3.rect.colliderect(k.rect):
                                enemy3.life-=1
                                bullets.remove(k)
                for e in bombs:
                    if enemy3.rect.colliderect(e.rect):
                        enemy3.life-=3
                        bombs.remove(e)
                bullets.append(enemy3.shot())

            if enemy1.rect.colliderect(enemy2.rect):
                enemy1.rect.left=random.randint(0,437)
                enemy2.rect.left=random.randint(0,411)
                enemy1.rect.top=0
                enemy2.rect.top=0
            if enemy1.rect.colliderect(enemy3.rect):
                enemy1.rect.left=random.randint(0,437)
                enemy3.rect.left=random.randint(0,311)
                enemy1.rect.top=0
                enemy3.rect.top=0
            if enemy2.rect.colliderect(enemy3.rect):
                enemy2.rect.left=random.randint(0,411)
                enemy3.rect.left=random.randint(0,311)
                enemy2.rect.top=0
                enemy3.rect.top=0

            for l in bullets:
                if l!=None:
                    if l.family=='enemy':
                        if my.rect.colliderect(l.rect):
                            my.life-=1
                            bullets.remove(l)
            if my.rect.colliderect(enemy1.rect):
                my.life-=1
                enemy1=None
            if my.rect.colliderect(enemy2.rect):
                my.life-=1
                enemy2=None
            if my.rect.colliderect(enemy3.rect):
                my.life-=1
                enemy3=None
            if my.life<=0:
                my.live=False
            if my.live==False:
                break

            for m in explodes:
                m.set_position(m.plane.rect.left,m.plane.rect.top)
                m.draw(screen)
            for m in explodes:
                m.action()

            pygame.display.update()
            clock.tick(70)

        while True:
            back1.draw(screen)
            font=pygame.font.Font('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\silly_younger.ttf', 100)
            text=font.render('游戏失败!',True,'white')
            screen.blit(text,(50,100))
            again=Again()
            gameover=Gameover()
            again.draw(screen)
            gameover.draw(screen)
            for event in pygame.event.get():
                if event.type==pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type==pygame.KEYDOWN:
                    if event.key==pygame.K_ESCAPE:
                        pygame.quit()
                        sys.exit()
                if event.type==pygame.MOUSEBUTTONDOWN:
                    pos=pygame.mouse.get_pos()
                    if again.rect.collidepoint(pos[0],pos[1]):
                        again_type=True
                    if gameover.rect.collidepoint(pos[0],pos[1]):
                        gameover.over()
            if again_type:
                start=datetime.datetime.now()
                my = My_Plane(189, 700 - 126)
                bullets = []
                bombs = []
                enemy1 = None
                enemy2 = None
                enemy3 = None
                clock = pygame.time.Clock()

                back1 = background()
                back2 = background(700)
                right=False
                left=False
                bullet_supplys = []
                bomb_supplys = []
                explodes = []
                again.live=False
                gameover.live=False
                again_type=False
                break
            pygame.display.update()

4.game.py的程序

现在我们就需要调用main函数了。

1.初始化

import pygame
import sys
import random
import datetime
from sprite import *
from main import *

2.调用main函数

main()

5.最终程序

sprite.py

import pygame
import random
import sys

pygame.init()

window=pygame.display.set_mode((480,700))
pygame.display.set_caption('飞机大战')
pygame.display.set_icon(pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\me1.png'))

class background():
    def __init__(self,is_alt=0):
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\background.png')
        self.rect=self.image.get_rect()
        self.rect.y=is_alt
    def update(self):
        self.rect.y+=1
        if self.rect.centery>=1050:
            self.rect.y=-700
    def draw(self,surface):
        surface.blit(self.image,self.rect)

class Bullet():
    def __init__(self,plane):
        self.name='bullet'
        self.plane=plane
        if self.plane.family=='my':
            self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\bullet1.png')
            self.family='my'
        if self.plane.family=='enemy':
            self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\bullet2.png')
            self.family='enemy'
        self.rect=self.image.get_rect()
        self.rect.left=self.plane.rect.left+self.plane.rect.width/2
        if self.plane.family=='my':
            self.rect.top=self.plane.rect.top-10
        if self.plane.family=='enemy':
            self.rect.top=self.plane.rect.bottom-10
        self.live=True
    def Move(self):
        if self.plane.family=='my':
            if self.rect.top>=0:
                self.rect.top-=4
            else:
                self.live=False
        if self.plane.family=='enemy':
            if self.rect.top<=700:
                self.rect.top+=4
            else:
                self.live=False
    def draw(self,surface):
        surface.blit(self.image,self.rect)

class Bomb_supply():
    def __init__(self):
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\bomb_supply.png')
        self.rect=self.image.get_rect()
        self.rect.left=random.randint(60,420)
        self.rect.top=0
        self.name='bomb_supply'
        self.live=True
    def Move(self):
        if self.rect.top<=700:
            self.rect.top+=2
        else:
            self.live=False
    def draw(self,surface):
        surface.blit(self.image,self.rect)

class Bullet_supply():
    def __init__(self):
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\bullet_supply.png')
        self.rect=self.image.get_rect()
        self.rect.left=random.randint(58,422)
        self.rect.top=0
        self.live=True
        self.name='bomb_supply'
    def Move(self):
        if self.rect.top<=700:
            self.rect.top+=2
        else:
            self.live=False
    def draw(self,surface):
        surface.blit(self.image,self.rect)

class EnemyPlane():
    def __init__(self):
        self.type=random.randint(1,100)
        if self.type>=1 and self.type<=50:
            self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\enemy1.png')
            self.rect=self.image.get_rect()
            self.rect.left=random.randint(0,437)
            self.rect.top=0
            self.life=1
            self.nametype=1
        if self.type>50 and self.type<=90:
            self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\enemy2.png')
            self.rect=self.image.get_rect()
            self.rect.left=random.randint(0,411)
            self.rect.top=0
            self.life=3
            self.nametype=2
        if self.type>90 and self.type<=100:
            self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\enemy3_n1.png')
            self.rect=self.image.get_rect()
            self.rect.left=random.randint(0,311)
            self.rect.top=0
            self.life=5
            self.nametype=3
        self.live=True
        self.family='enemy'
        self.name='plane'
        self.bomb_images=[]
        self.bomb_rects=[]
    def shot(self):
        self.t=random.randint(1,1000)
        if self.t>=1 and self.t<=10:
            return Bullet(self)
    def Move(self):
        if self.rect.top<=700:
            self.rect.top+=2
        else:
            self.live=False
    def draw(self,surface):
        surface.blit(self.image,self.rect)
    def hit_return_score(self):
        if self.nametype==1:
            return 1
        elif self.nametype==2:
            return 3
        elif self.nametype==3:
            return 5

class My_Plane():
    def __init__(self,left,top):
        self.bullet_number=10000
        self.name='plane'
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\me1.png')
        self.rect=self.image.get_rect()
        self.rect.left=left
        self.rect.top=top
        self.family='my'
        self.live=True
        self.life=3
        self.bomb=1000
        self.score=0
    def move_left(self):
        if self.rect.left>=0:
            self.rect.left=self.rect.left-3
    def move_right(self):
        if self.rect.left<=480-102:
            self.rect.left+=3
    def draw(self,surface):
        surface.blit(self.image,self.rect)
    def live_if(self,surface):
        if self.life<=0:
            self.live=False
            image1=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\gameover.png')
            image2=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\again.png')
            rect1=image1.get_rect()
            rect1.midleft=240
            rect1.midtop=300
            rect2=image2.get_rect()
            rect2.midleft=240
            rect2.midtop=350
            surface.blit(image1,rect1)
            surface.blit(image2,rect2)
    def draw_image_life(self,surface):
        for i in range(self.life):
            image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\life.png')
            surface.blit(image,(i*46,643))
    def draw_image_bullet(self,surface):
        font=pygame.font.Font('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\silly_younger.ttf', 30)
        text=font.render('Bullet:'+str(self.bullet_number),True,(255,255,255))
        surface.blit(text,(0,30))
    def draw_image_bomb(self,surface):
        font=pygame.font.Font('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\silly_younger.ttf', 30)
        text=font.render('Bomb:'+str(self.bomb),True,(255,255,255))
        surface.blit(text,(0,0))
    def draw_image_score(self,surface):
        font=pygame.font.Font('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\silly_younger.ttf', 30)
        text=font.render('Score:'+str(self.score),True,(255,255,255))
        surface.blit(text,(0,60))
    def shot(self):
        if self.bullet_number>0:
            self.bullet_number-=1
            return Bullet(self)

class Bomb():
    def __init__(self,plane):
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\gun_bomb.png')
        self.rect=self.image.get_rect()
        self.rect.left=plane.rect.left+plane.rect.width/2-self.rect.width/2
        self.rect.top=plane.rect.top-40
        self.live=True
    def draw(self,surface):
        surface.blit(self.image,self.rect)
    def Move(self):
        if self.rect.top>=0:
            self.rect.top-=3
        else:
            self.live=False

class explode():
    def __init__(self,plane):
        self.plane=plane
        self.rects=[]
        self.live=True
        self.index=0
        self.interval=4
        self.interval_index=0
        if self.plane.family=='enemy':
            if self.plane.nametype==1:
                self.images=[pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\enemy1_down'+str(v)+'.png') for v in range(1,5)]
            elif self.plane.nametype==2:
                self.images=[pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\enemy2_down'+str(v)+'.png') for v in range(1,5)]
            elif self.plane.nametype==3:
                self.images=[pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\enemy3_down'+str(v)+'.png') for v in range(1,7)]
        elif self.plane.family=='my':
            self.images=[pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\my_destory_'+str(v)+'.png') for v in range(1,5)]
    def set_position(self,x,y):
        self.x=x
        self.y=y
    def action(self):
        if not self.live:
            return
        self.interval_index += 1
        if self.interval_index < self.interval:
            return
        self.interval_index = 0
        self.index = self.index + 1
        if self.index >= len(self.images):
            self.index = 0
            self.live = False
    def draw(self,surface):
        if not self.live:
            return
        surface.blit(self.images[self.index],(self.x,self.y))

class Again():
    def __init__(self):
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\again.png')
        self.rect=self.image.get_rect()
        self.rect.top=250
        self.rect.left=70
        self.live=True
    def draw(self,surface):
        if not self.live:
            return
        surface.blit(self.image,self.rect)

class Gameover():
    def __init__(self):
        self.image=pygame.image.load('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\images\\gameover.png')
        self.rect=self.image.get_rect()
        self.rect.top=400
        self.rect.left=70
        self.live=True
    def draw(self,surface):
        if not self.live:
            return
        surface.blit(self.image,self.rect)
    def over(self):
        pygame.quit()
        sys.exit()

main.py

import pygame
import sys
from sprite import *
import datetime
import random

pygame.init()

left=False
right=False
start=datetime.datetime.now()

screen=window

my=My_Plane(189,700-126)
bullets=[]
bombs=[]
enemy1=None
enemy2=None
enemy3=None
again_type=False
clock=pygame.time.Clock()

back1=background()
back2=background(700)

bullet_supplys=[]
bomb_supplys=[]
explodes=[]

def main():
    global left,right,start,screen,my,bullets,bombs,enemy1,enemy2,enemy3,clock,back1,back2,bullet_supplys,bomb_supplys,explodes,again_type
    while True:
        while True:
            for event in pygame.event.get():
                if event.type==pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type==pygame.KEYDOWN:
                    if event.key==pygame.K_ESCAPE:
                        pygame.quit()
                        sys.exit()
                    if event.key==pygame.K_LEFT:
                        left=True
                    if event.key==pygame.K_RIGHT:
                        right=True
                    if event.key==pygame.K_SPACE:
                        bullet=my.shot()
                        bullets.append(bullet)
                if event.type==pygame.KEYUP:
                    left=right=False
                if event.type==pygame.MOUSEBUTTONDOWN:
                    if my.bomb>0:
                        bombs.append(Bomb(my))
                        my.bomb-=1
            if left==True:
                my.move_left()
            if right==True:
                my.move_right()

            back1.update()
            back1.draw(screen)

            back2.update()
            back2.draw(screen)

            if bullets!=[]:
                try:
                    for bullet in bullets:
                        if bullet!=None:
                            if bullet.live==False:
                                bullets.remove(bullet)
                            elif bullet.live==True:
                                bullet.Move()
                                bullet.draw(screen)
                        else:
                            continue
                except:
                    bullets=[]

            if bombs!=[]:
                try:
                    for bomb in bombs:
                        if bomb.live==False:
                            bombs.remove(bomb)
                        elif bomb.live==True:
                            bomb.Move()
                            bomb.draw(screen)
                except:
                    bombs=[]

            if (datetime.datetime.now()-start).seconds%2==0:
                if bullet_supplys==[]:
                    bullet_supplys.append(Bullet_supply())
            if (datetime.datetime.now()-start).seconds%5==0:
                if bomb_supplys==[]:
                    bomb_supplys.append(Bomb_supply())

            for i in bullet_supplys:
                i.Move()
                i.draw(screen)
                if my.rect.colliderect(i.rect):
                    my.bullet_number+=1
                    bullet_supplys.remove(i)
                if i.live==False:
                    bullet_supplys.remove(i)
            for j in bomb_supplys:
                j.Move()
                j.draw(screen)
                if my.rect.colliderect(j.rect):
                    my.bomb+=1
                    bomb_supplys.remove(j)
                if j.live==False:
                    bomb_supplys.remove(j)

            my.draw(screen)
            my.draw_image_life(screen)
            my.draw_image_bullet(screen)
            my.draw_image_bomb(screen)
            my.draw_image_score(screen)

            if enemy1==None:
                enemy1=EnemyPlane()
            else:
                if enemy1.life<=0:
                    enemy1.live=False
                if enemy1.live==False:
                    if enemy1.rect.top<=700:
                        explodes.append(explode(enemy1))
                        my.score+=enemy1.hit_return_score()
                    enemy1=None
                    continue
                enemy1.Move()
                enemy1.draw(screen)
                for k in bullets:
                    if k!=None:
                        if k.family=='my':
                            if enemy1.rect.colliderect(k.rect):
                                enemy1.life-=1
                                bullets.remove(k)
                for e in bombs:
                    if enemy1.rect.colliderect(e.rect):
                        enemy1.life-=3
                        bombs.remove(e)
                bullets.append(enemy1.shot())
            if enemy2==None:
                enemy2=EnemyPlane()
            else:
                if enemy2.life<=0:
                    enemy2.live=False
                if enemy2.live==False:
                    if enemy2.rect.top<=700:
                        explodes.append(explode(enemy2))
                        my.score+=enemy2.hit_return_score()
                    enemy2=None
                    continue
                enemy2.Move()
                enemy2.draw(screen)
                for k in bullets:
                    if k!=None:
                        if k.family=='my':
                            if enemy2.rect.colliderect(k.rect):
                                enemy2.life-=1
                                bullets.remove(k)
                for e in bombs:
                    if enemy2.rect.colliderect(e.rect):
                        enemy2.life-=3
                        bombs.remove(e)
                bullets.append(enemy2.shot())
            if enemy3==None:
                enemy3=EnemyPlane()
            else:
                if enemy3.life<=0:
                    enemy3.live=False
                if enemy3.live==False:
                    if enemy3.rect.top<=700:
                        explodes.append(explode(enemy3))
                        my.score+=enemy3.hit_return_score()
                    enemy3=None
                    continue
                enemy3.Move()
                enemy3.draw(screen)
                for k in bullets:
                    if k!=None:
                        if k.family=='my':
                            if enemy3.rect.colliderect(k.rect):
                                enemy3.life-=1
                                bullets.remove(k)
                for e in bombs:
                    if enemy3.rect.colliderect(e.rect):
                        enemy3.life-=3
                        bombs.remove(e)
                bullets.append(enemy3.shot())

            if enemy1.rect.colliderect(enemy2.rect):
                enemy1.rect.left=random.randint(0,437)
                enemy2.rect.left=random.randint(0,411)
                enemy1.rect.top=0
                enemy2.rect.top=0
            if enemy1.rect.colliderect(enemy3.rect):
                enemy1.rect.left=random.randint(0,437)
                enemy3.rect.left=random.randint(0,311)
                enemy1.rect.top=0
                enemy3.rect.top=0
            if enemy2.rect.colliderect(enemy3.rect):
                enemy2.rect.left=random.randint(0,411)
                enemy3.rect.left=random.randint(0,311)
                enemy2.rect.top=0
                enemy3.rect.top=0

            for l in bullets:
                if l!=None:
                    if l.family=='enemy':
                        if my.rect.colliderect(l.rect):
                            my.life-=1
                            bullets.remove(l)
            if my.rect.colliderect(enemy1.rect):
                my.life-=1
                enemy1=None
            if my.rect.colliderect(enemy2.rect):
                my.life-=1
                enemy2=None
            if my.rect.colliderect(enemy3.rect):
                my.life-=1
                enemy3=None
            if my.life<=0:
                my.live=False
            if my.live==False:
                break

            for m in explodes:
                m.set_position(m.plane.rect.left,m.plane.rect.top)
                m.draw(screen)
            for m in explodes:
                m.action()

            pygame.display.update()
            clock.tick(70)

        while True:
            back1.draw(screen)
            font=pygame.font.Font('D:\\Users\\shen jia qi\\Desktop\\python资源\\游戏\\飞机大战\\silly_younger.ttf', 100)
            text=font.render('游戏失败!',True,'white')
            screen.blit(text,(50,100))
            again=Again()
            gameover=Gameover()
            again.draw(screen)
            gameover.draw(screen)
            for event in pygame.event.get():
                if event.type==pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type==pygame.KEYDOWN:
                    if event.key==pygame.K_ESCAPE:
                        pygame.quit()
                        sys.exit()
                if event.type==pygame.MOUSEBUTTONDOWN:
                    pos=pygame.mouse.get_pos()
                    if again.rect.collidepoint(pos[0],pos[1]):
                        again_type=True
                    if gameover.rect.collidepoint(pos[0],pos[1]):
                        gameover.over()
            if again_type:
                start=datetime.datetime.now()
                my = My_Plane(189, 700 - 126)
                bullets = []
                bombs = []
                enemy1 = None
                enemy2 = None
                enemy3 = None
                clock = pygame.time.Clock()

                back1 = background()
                back2 = background(700)
                right=False
                left=False
                bullet_supplys = []
                bomb_supplys = []
                explodes = []
                again.live=False
                gameover.live=False
                again_type=False
                break
            pygame.display.update()

game.py

import pygame
import sys
import random
import datetime
from sprite import *
from main import *

main()

6.结尾

最后再提醒大家几个要点:

1.素材在文章开头,免费的,使用方法有两种:第一种是把images文件夹和silly_younger.ttf和sprite.py、main.py、game.py放在同一个文件夹里,再把程序里的路径改成你素材的相对路径或绝对路径。第二种是把程序里的路径改成你素材的绝对路径。

2.素材的压缩包里有两个文件,不要直接解压缩,不然容易出问题。

3.欢迎大家提出各种意见,直接私信我即可。

好了,大家再见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值