欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-29 11:28:04
...

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

代码如下

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()
            
        
           
            
      

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