python基于pygame的飞机大作战小游戏

基于pygame的飞机大作战小游戏,适合新手,不能直接运行,只能在命令行进入当前游戏目录,输入python game.py才能够运行,尚不知道是什么原因
游戏截图如下,我们用黄色的圆圈代表敌机,在这里插入图片描述

代码如下

import pygame,sys,time,random,math

def init():
    pygame.init()
    size = width, height =600,600
    screen =pygame.display.set_mode(size)
    plx=270
    ply=528
    beijing =pygame.image.load("beijing.jpg")
    main_role =pygame.image.load("main_role.jpg")
    font=pygame.font.SysFont("arial",60)
    
    return screen,[plx,ply],main_role,beijing,font
    


def mainloop(screen,pl,main_role,beijing,shots,ms,ecs):  #每刷新一次,调用一次
    for event in pygame.event.get(): 
        if event.type == pygame.QUIT:
            pygame.quit()
        elif event.type ==pygame.KEYDOWN:
            if event.key ==pygame.K_LEFT:
                ms=[0,pl]
                
                #move(0,pl)
            elif event.key ==pygame.K_RIGHT:
                ms=[1,pl]
                #move(1,pl)
            elif event.key == pygame.K_UP:
                ms=[2,pl]
                #move(2,pl)
            elif event.key ==pygame.K_DOWN:
                ms=[3,pl]
                #move(3,pl)
             
            elif event.key==pygame.K_SPACE:
                ecope(pl,ecs)
        elif event.type ==pygame.KEYUP:
            ms=[-1,-1]
    screen.blit(beijing,(0,0))
    for i in range(len(shots)):
        pygame.draw.circle(screen,(255,255,0),shots[i],25,5)
    for i in range(len(ecs)):
        pygame.draw.circle(screen,(255,0,255),ecs[i],5,5)
    screen.blit(main_role,(pl[0],pl[1]))
    
    return ms

def ecope(pl,ecs):
    ecs.append([pl[0]+30,pl[1]])

def move(key,pl):
    if key==0:pl[0]=pl[0]-10
    elif key==1:pl[0]=pl[0]+10
    elif  key==2:pl[1]=pl[1]-10
    elif  key==3:pl[1]=pl[1]+10
    
    if pl[0]<0:pl[0]=0
    if pl[0]>540:pl[0]=540
    if pl[1]<0:pl[1]=0
    if pl[1]>528:pl[1]=528
        
def update_shot(shots,m,ms,ecs):
    if m==60:
        x=random.randint(0,59)*10
        y=0
        shots.append([x,y])
    t=[]
    t2=[]
    if m%2==0:
        for i in range(len(ecs)):
            ecs[i][1]=ecs[i][1]-6
            if ecs[i][1]<0:
                t2.append(i)
        for i in range(len(t2)):
                       
                ecs.pop(t2[i])
                    
        
        
        for i in range(len(shots)):
            shots[i][1]=shots[i][1]+5
            if shots[i][1]>600:
                t.append(i)
        for i in range(len(t)):
            shots.pop(t[i])
                
                
            
    if ms!=[-1,-1]:
        move(ms[0],ms[1])
    
    
def block_detect(pl,shots):
    #pl[x,y]
    '''
    shots
    [
    [sx0,sy0],
    [sx1,sy1],
    .......
    
    ]
    '''
    for i in range(len(shots)):
        nx,ny=shots[i][0],shots[i][1]
        x,y=pl[0]+30,pl[1]+36
        s=math.sqrt((nx-x)**2+(ny-y)**2)
        if s<55:
            return True
    return False

def attack_detect(ecs,shots,score):
    h=[]
    h1=[]
    h2=[]
    for i in range(len(ecs)):
        for j in range(len(shots)):
            lx,ly=ecs[i][0],ecs[i][1]
            cx,cy=shots[j][0],shots[j][1]
            d=math.sqrt((lx-cx)**2+(ly-cy)**2)
            if d<30:
                h.append([i,j])
                
    for i in range(len(h)):
        h1.append(h[i][0])
        h2.append(h[i][1])
    h1=list(set(h1))
    h2=list(set(h2))
    for i in range(len(h1)):
        ecs.pop(h1[i])
    for i in range(len(h2)):
        shots.pop(h2[i])
    return score+len(h)

        
    
if __name__=="__main__":
    screen,pl,main_role,beijing,font=init()
    shots=[]
    ecs=[]
    score=0
    temp=time.time()
    m=0
    ms=[-1,-1]
    while True :

        text=font.render(str(score),True,(255,255,255))
        rect=text.get_rect()
        rect.center=(250,30)
        
        if (time.time()-temp)>0.03:
      
            m=m+1 
            temp=time.time()
            update_shot(shots,m,ms,ecs)
            if m==60:
                m=0
            
        ms=mainloop(screen,pl,main_role,beijing,shots,ms,ecs)
        screen.blit(text,rect)
        score=attack_detect(ecs,shots,score)
        pygame.display.update()
        
        if block_detect(pl,shots):
            pygame.quit()
            
        
           
            
      

游戏素材
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51655931/article/details/109751266