import pygame,random,os,sys,time
from pygame.locals import *
pygame.init()
canvas=pygame.display.set_mode((1200,715))
canvas.fill((255,255,255))
pygame.display.set_caption("飞机大战")
e1=[]
e2=[]
e3=[]
b=[]
h=[]
e1.append(pygame.image.load("images/ll/enemy1.png"))
e1.append(pygame.image.load("images/enemy1_down1.png"))
e1.append(pygame.image.load("images/enemy1_down2.png"))
e1.append(pygame.image.load("images/enemy1_down3.png"))
e1.append(pygame.image.load("images/enemy1_down4.png"))
e1.append(pygame.image.load("images/enemy1_down5.png"))
e2.append(pygame.image.load("images/enemy2.png"))
e2.append(pygame.image.load("images/enemy2_down1.png"))
e2.append(pygame.image.load("images/enemy2_down2.png"))
e2.append(pygame.image.load("images/enemy2_down3.png"))
e2.append(pygame.image.load("images/enemy2_down4.png"))
e2.append(pygame.image.load("images/enemy2_down5.png"))
e3.append(pygame.image.load("images/enemy3_1.png"))
e3.append(pygame.image.load("images/enemy3_2.png"))
e3.append(pygame.image.load("images/enemy3_down1.png"))
e3.append(pygame.image.load("images/enemy3_down2.png"))
e3.append(pygame.image.load("images/enemy3_down3.png"))
e3.append(pygame.image.load("images/enemy3_down4.png"))
e3.append(pygame.image.load("images/enemy3_down5.png"))
e3.append(pygame.image.load("images/enemy3_down6.png"))
e3.append(pygame.image.load("images/enemy3_down7.png"))
h.append(pygame.image.load("images/hero.png"))
h.append(pygame.image.load("images/hero_down1.png"))
h.append(pygame.image.load("images/hero_down2.png"))
h.append(pygame.image.load("images/hero_down3.png"))
h.append(pygame.image.load("images/hero_down4.png"))
b.append(pygame.image.load("images/bullet1.png"))
bg = pygame.image.load("images/bg4.png")
startgame = pygame.image.load("images/startGame.png")
logo = pygame.image.load("images/LOGO.png")
pause = pygame.image.load("images/game_pause_nor.png")
score = pygame.image.load("images/score.png")
over = pygame.image.load("images/over.png")
bgg = pygame.image.load("images/bg235.jpg")
def myevent():
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
if event.type==pygame.MOUSEMOTION:
x,y=event.pos[0],event.pos[1]
if Game.state=="runing":
Game.hero.x=x-Game.hero.w
Game.hero.y=y-Game.hero.h/2
if ismouseout(x,y):
if Game.state=="runing":
Game.state="pause"
if not ismouseout(x,y):
if Game.state=="pause":
Game.state="runing"
if event.type==pygame.MOUSEBUTTONDOWN and event.button==1:
if Game.state=="start":
Game.state="runing"
if event.type==KEYDOWN and event.key==k_r:
if Game.state=="gameover":
Game.score=0
Game.heros=6
Game.enemies=[]
Game.state="start"
def ismouseout(x,y):
return x==0 or x>=1190 or y==0 or y>=700
def draw(img,pos):
canvas.blit(img,pos);
def isactiontime(last,interval):
return time.time()-last>=interval
def filltext(text,pos):
draw(pygame.font.Font("my_font/font1.ttf",30).\
render(text,True,(255,255,255)),pos)
def componententer():
if not isactiontime(Game.elasttime,Game.einterval):
return
Game.elasttime=time.time()
x=random.randint(1,10)
if x<5:
Game.enemies.append(Enemy(0,0,57,45,1,1,1,e1))
if x>=6 and x<=8:
Game.enemies.append(Enemy(0,0,50,68,2,5,3,e2))
if x==9:
Game.enemies.append(Enemy(0,0,196,258,3,10,10,e3))
def paintcomponent():
if not isactiontime(Game.painttime,Game.paintinterval):
return
Game.painttime=time.time()
Game.sky.paint()
Game.hero.paint()
for enemy in Game.enemies:
enemy.paint()
for bullet in Game.bullets:
bullet.paint()
draw(score, (910, 10))
filltext(str(Game.score), (780 + 305, 25))
filltext(str(Game.heroes), (780 + 305, 58))
def stepcomponent():
Game.sky.step()
for enemy in Game.enemies:
enemy.step()
for bullet in Game.bullets:
bullet.step()
def checkhit():
for enemy in Game.enemies:
if enemy.down == True:
continue
if Game.hero.hit(enemy):
enemy.bang()
Game.hero.bang()
for bullet in Game.bullets:
if bullet.down == True:
continue
if enemy.hit(bullet):
enemy.bang()
bullet.bang()
def deletecomponent():
for i in range(0,len(Game.enemies)-1):
x = Game.enemies[i]
if x.delete or x.outofbounds():
Game.enemies.remove(x)
print(len(Game.bullets))
for i in range(len(Game.bullets)-1,-1,-1):
x = Game.bullets[i]
if x.delete or x.outofbounds():
Game.bullets.remove(x)
if Game.hero.delete == True:
Game.heroes -= 1
if Game.heroes == 0:
Game.state = "gameover"
else:
Game.hero = Hero(0, 0, 60, 75, 1, h)
def componentanimation():
for enemy in Game.enemies:
enemy.animation()
for bullet in Game.bullets:
bullet.animation()
Game.hero.animation()
class Sky():
def __init__(self):
self.w=480
self.h=650
self.img=bgg
self.x=0
self.y1=0
self.y2=-self.h
def paint(self):
draw(self.img,(self.x,self.y1))
draw(self.img,(self.x,self.y2))
def step(self):
self.y1+=1
self.y2+=1
if self.y1>self.h:
self.y1=-self.h
if self.y2>self.h:
self.y2=-self.h
class Flying(object):
def __init__(self,x,y,h,w,life,frame):
self.x=x
self.y=y
self.h=h
self.w=w
self.life=life
self.down=False
self.delete=False
self.last=0
self.interval=0
self.frameindex=0
self.frame=frame
self.img=frame[0]
def paint(self):
draw(self.img, (self.x,self.y))
def step(self):
if not isactiontime(self.last,self.interval):
return
self.last=time.time()
self.y+=2
def hit(self,c):
return c.x>self.x-c.w and c.x<self.x+self.w \
and c.y>self.y-c.h and c.y<self.y+self.h
def bang(self):
self.life-=1
if self.life==0:
self.down=True
if hasattr(self,"score"):
Game.score+=self.score
def outofbounds(self):
return self.y>650 or self.y<0
def animation(self):
if self.down:
if len(self.frame)==self.frameindex:
self.delete=True
else:
self.img=self.frame[self.frameindex]
self.frameindex+=1
class Enemy(Flying):
def __init__(self,x,y,w,h,type,score,life,frame):
Flying.__init__(self,x,y,h,w,life,frame)
self.x=random.randint(0,1200-self.w)
self.type=type
self.score=score
class Hero(Flying):
def __init__(self,x,y,w,h,life,frame):
Flying.__init__(self,x,y,h,w,life,frame)
self.w=w
self.h=h
self.shoottime=0
self.shootinterval=0
def shoot(self):
if not isactiontime(self.shoottime,self.shootinterval):
return
self.shoottime=time.time()
Game.bullets.append(Bullet(self.x+self.w/2,self.y))
class Bullet(Flying):
def __init__(self,x,y):
Flying.__init__(self, x, y, 21, 9, 1, b)
def step(self):
self.y-=5
def outofbounds(self):
return self.y<0
class Game:
enemies=[]
bullets=[]
score=0;
heroes=20;
sky=None
hero=None
elasttime=0
einterval=0.5
painttime=0
paintinterval=0.01
state="start"
Game.sky=Sky()
Game.hero=Hero(0,0,60,75,1,h)
def start():
if Game.state=="start":
Game.sky.paint()
Game.sky.step()
draw(logo,(200,200))
draw(startgame,(460,450))
if Game.state=="runing":
componententer()
paintcomponent()
stepcomponent()
componentanimation()
Game.hero.shoot()
checkhit()
deletecomponent()
if Game.state=="pause":
paintcomponent()
Game.sky.step()
draw(pause,(400,500))
if Game.state=="gameover":
paintcomponent()
Game.sky.step()
Game.bullets=[]
Game.enemies=[]
draw(over,(400,500))
while 1:
start()
pygame.display.update()
myevent()
pygame.time.delay(15)