python飞机大战代码 pygame

这是我最近学习python学到的一些知识,与大家进行一个分享,发现有部分刚开始学习python的朋友还是会遇到很多问题,我将代码整理好了,保证能够运行。
代码分为主程序和子程序,主要是面对对象编程。但是还是有很多细节没有写完。不过不影响参考和学习。
主要实现的功能有左右移动和空格发射子弹。

#子程序
import pygame
import pygame.locals as lc
import random
import math

def key_control(Her_obj):
    '''
    键盘控制对象的函数
    :param Her_obj: 需要控制的对象
    :return:
    '''
    eventlist = pygame.event.get()
    for event in eventlist:
        if event.type == lc.QUIT:
            print('quit!')
            exit()
            pass
        elif event.type == lc.KEYDOWN:
            if event.key == lc.K_LEFT or event.key == lc.K_a:
                # print('left!')
                Her_obj.moveLeft()

            elif event.key == lc.K_RIGHT or event.key == lc.K_d:
                # print('right!')
                Her_obj.moveRight()

            elif event.key == lc.K_SPACE:
                # print('shoot!')
                Her_obj.shootBullet()

            elif event.key == lc.K_ESCAPE:
                print('quit!')
                exit()


class HeroPlane:
    def __init__(self,screen, x=0, y=450, loadRoute='hero.png'):
        '''
        飞机初始化
        :param screen:
        :param x:
        :param y:
        '''
        self.screen = screen
        self.x = x
        self.y = y
        self.image = pygame.image.load(loadRoute)
        self.bulletList = []
        self.disbulet = 0
        pass

    def moveLeft(self):
        '''飞机左移'''
        if self.x >= 10:
            self.x -= 10
        pass

    def moveRight(self):
        '''飞机右移'''
        if self.x <= 320:
            self.x += 10
        pass

    def display(self, bulet_rate=30):
        '''飞机显示'''
        self.screen.blit(self.image, (self.x, self.y))

        if self.disbulet == bulet_rate:
            for num, item in enumerate(self.bulletList):
                if item.delete(upOrDown=True):
                    del self.bulletList[num]

            for bullet in self.bulletList:
                bullet.display()
                bullet.moveAhead(upOrDown=True)

            self.disbulet = 0

        else:
            for bullet in self.bulletList:
                bullet.display()

        self.disbulet += 1

        pass

    def shootBullet(self):
        '''发射子弹'''
        newBullet = bullet(self.screen, self.x, self.y,loadRoute='bullet.png')
        self.bulletList.append(newBullet)

class bullet:
    def __init__(self,screen, x, y, loadRoute='bullet.png'):
        self.x = x + 13
        self.y = y - 20
        self.screen = screen
        self.image = pygame.image.load(loadRoute)
        pass

    def display(self):
        self.screen.blit(self.image,(self.x, self.y))
        pass

    def moveAhead(self, upOrDown=True):
        if upOrDown == True:
            self.y -= 1
        else:
            self.y += 1
        pass

    def delete(self, upOrDown=True):
        if upOrDown == True:
            if self.y < 0:
                return True
            else:
                return False
        else:
            if self.y > 500:
                return True
            else:
                return False

class enemyPlane:

    def __init__(self, screen, x=0, y=0, loadRoute='enemy0.png'):
        '''
        敌方飞机初始化
        :param screen:
        :param x:
        :param y:
        '''
        self.screen = screen
        self.x = x
        self.y = y
        self.image = pygame.image.load(loadRoute)
        self.bulletList = []
        self.disbulet = 0
        pass

    def moveLeft(self):
        '''飞机左移'''
        if self.x >= 10:
            self.x -= 10
        pass

    def moveRight(self):
        '''飞机右移'''
        if self.x <= 320:
            self.x += 10
        pass

    def display(self, bulet_rate=5):
        '''飞机显示'''
        self.screen.blit(self.image, (self.x, self.y))

        if self.disbulet == bulet_rate:
            for num, item in enumerate(self.bulletList):
                if item.delete(upOrDown=False):
                    del self.bulletList[num]

            for bullet in self.bulletList:
                bullet.display()
                bullet.moveAhead(upOrDown=False)

            self.disbulet = 0

        else:
            for bullet in self.bulletList:
                bullet.display()

        self.disbulet += 1

        pass

    def shootBullet(self):
        '''发射子弹'''
        newBullet = bullet(self.screen, self.x-6, self.y+35, loadRoute='bullet1.png')
        self.bulletList.append(newBullet)

    def control(self, shoot_probability=0.0004):
        if random.random() < shoot_probability:
            self.shootBullet()

        if random.random() < 0.0007:
            if random.random() < 0.5:
                self.moveLeft()
            else:
                self.moveRight()

def judge_win(heroPlane, enemyPlane):
    '''
    判断胜负
    :param heroPlane:
    :param enemyPlane:
    :return: 返回 True 代表赢, 返回 False 代表输, None 代表未结束
    '''
    '''判断我方子弹和敌方飞机'''
    pos1 = (enemyPlane.x, enemyPlane.y)
    for item in heroPlane.bulletList:
        pos0 = (item.x, item.y)
        if distance(pos0, pos1) < 10:
            print('you win the game !')
            return True
    '''判断敌方子弹和我方飞机'''
    pos1 = (heroPlane.x, heroPlane.y)
    for item in enemyPlane.bulletList:
        pos0 = (item.x, item.y)
        if distance(pos0, pos1) < 15:
            print('you lose the game ! \nloser!!!!!')
            return False


def distance(pos0, pos1):
    m = (pos0[0]-pos1[0])**2 + (pos0[1]-pos1[1])**2
    return math.sqrt(m)

def press_end():
    eventlist = pygame.event.get()
    for event in eventlist:
        if event.type == lc.KEYDOWN:
            exit()
            pass
#主程序
import pygame
import pygame.locals as lc
import subfunction as sf
import random
def main():

    screen = pygame.display.set_mode((350,500))     #设定窗口大小

    background = pygame.image.load('02.JPG')            #建立图片背景对象

    pygame.display.set_caption('plane game')        #设置标题

    pygame.mixer.init()     #添加音乐  初始化
    pygame.mixer.music.load('music.mp3')       #加入音乐
    pygame.mixer.music.set_volume(0.2)      #设置音量
    pygame.mixer.music.play(-1) #循环次数


    '''载入玩家飞机图片'''
    hero = sf.HeroPlane(screen, x=170, y=450, loadRoute='hero.png')
    enemy = sf.enemyPlane(screen, x=random.randint(0,330), y=0, loadRoute='enemy0.png')
    '''设置显示内容'''
    while True:
        screen.blit(background, (0, 0))  # 设定要显示的内容  背景显示
        '''控制敌机'''
        enemy.display(bulet_rate=20)
        enemy.control(shoot_probability=0.0004)
        '''控制我方飞机'''
        hero.display(bulet_rate=10)          #显示飞机
        sf.key_control(hero)

        pygame.display.update()     #更新要显示的内容

        '''判断游戏是否结束'''
        out = sf.judge_win(heroPlane=hero, enemyPlane=enemy)
        if out != None:
            break

    if out:
        background1 = pygame.image.load('win.png')
    else:
        background1 = pygame.image.load('lose.png')
    print('按任意键退出!')
    while True:
        screen.blit(background1, (0, 0))
        pygame.display.update()
        sf.press_end()
    pass

if __name__ == "__main__":
    main()

这里只需要运行main函数就可以运行程序

python飞机票打折问题 python飞机代码_pygame


python飞机票打折问题 python飞机代码_初始化_02


python飞机票打折问题 python飞机代码_子程序_03


python飞机票打折问题 python飞机代码_pygame_04


python飞机票打折问题 python飞机代码_python_05


python飞机票打折问题 python飞机代码_初始化_02


python飞机票打折问题 python飞机代码_pygame_07

上面是一些里面使用的图片。大家可以下载,命名分别为win.png, enemy0.png, bullet.png, 02.jpg,lose.png,hero.png,bullet1.png.
大家保存带同一个目录下面就可以直接使用。