大家好,最近又一款风靡一时的小游戏,叫做飞机大战,今天我们就用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.欢迎大家提出各种意见,直接私信我即可。
好了,大家再见。