python飞机大战项目

项目规划

1 对象总览于程序设计思路
2 程序设计
3 程序测试

飞机大战项目设计

pygame模块,利用SDL模块写的游戏库

四个对象:
----敌方飞机,我方飞机,敌方子弹,我方子弹
功能:
背景音乐添加
----我方飞机移动【通过键盘控制】
----敌方飞机移动【程序控制移动】
----双方飞机都可以发射子弹

步骤:
1 创建窗口
2 创建一个我方飞机
3 给我方飞机添加发射子弹的功能【按键发射】
4 创建第人飞机,自由移动,自动发射子弹

面向过程的代码(了解)

为了梳理思路编写一部分过程的代码

import pygame
from pygame.locals import *

def main ():
    # 首先创建一个窗口 用来显示内容
    screen= pygame.display.set_mode((400,500),depth=32)
    # 设定背景图片
    background = pygame.image.load('./demo/background.jpg')
    # 设置title
    pygame.display.set_caption('阶段总结,飞机游戏')

    #添加背景音乐
    pygame.mixer.init()
    pygame.mixer_music.load('./demo/jinitaimei.mp3')
    pygame.mixer_music.set_volume(0.5) # 设置音量
    pygame.mixer_music.play(-1) # 循环次数,-1代表无限循环

    # 载入玩家图片
    player = pygame.image.load('./demo/ji.jpg')
    #初始化玩家位置
    x,y=0,0
    #设定要显示的内容
    while True:
        screen.blit(background,(0,0)) #显示背景图片0.0代表坐标
        screen.blit(player, (x, y)) #显示玩家图片0.0代表坐标


        # 获取键盘事件
        eventlist=pygame.event.get()
        for event in eventlist:
            if event.type == pygame.QUIT:
                print('退出')
                exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a or event.key == pygame.K_LEFT:
                    print('left')
                    if x>0: # 0初为窗口最左侧
                        x-=5
                    #elif x=0:

                elif event.key == pygame.K_d or event.key == pygame.K_RIGHT:
                    print('right')
                    if x<355: # 窗口宽度为400像素 400处为最右侧
                        x+=5
                   #elif x=355:
                elif event.key == pygame.K_w or event.key == pygame.K_UP:
                    print('up')
                    if y>0:
                        y-=5
                elif event.key == pygame.K_s or event.key == pygame.K_DOWN:
                    print('down')
                    if y<455:
                        y+=5
                elif event.key == pygame.K_SPACE:
                    print('fire')

                # pass占位符放在哪里都一样
                # 如果在开发程序时,不希望立刻编写分支内部的代码
                # 可以使用 pass 关键字,表示一个占位符,能够保证程序的代码结构正确!
                # 程序运行时,pass 关键字不会执行任何的操作!
        # 更新显示内容
        pygame.display.update()
    pass
if __name__=='__main__':
    main()

面向对象(主要)

第二种思路,是以后编写python的主要思路

import pygame
# from pygame.locals import *
import random
import time
'''面对对象编程: 实现飞机的显示,并且可以控制飞机的移动'''

# 优化 抽象出一个类
class BasePlane(object):
    def __init__(self,screen,imagePath):
        '''
        初始化基类函数
        :param screen:
        :param inmageName:
        '''
        self.screen = screen
        self.image = pygame.image.load(imagePath)
        self.bulletList = [] # 存储所有的子弹
    def display(self):
        self.screen.blit(self.image, (self.x, self.y))
        needDelItemList = []
        for item in self.bulletList:
            if item.judge():
                needDelItemList.append(item)
        for i in needDelItemList:
            self.bulletList.remove(i)
        for bullet in self.bulletList:
            bullet.display()  # 显示子弹位置
            bullet.move()  # 让子弹移动,下次显示看到子弹修改后的位置
class CommonBullet(object):
    '''
    公共子弹类
    '''
    def __init__(self,x,y,screen,bulletType):
        self.type = bulletType
        self.screen =screen
        if self.type == 'player':
            self.x =x+ 13
            self.y =y- 20
            self.imagePath = './demo/qiu.png'
        elif self.type == 'enemy':
            self.x =x- 13
            self.y =y+ 10
            self.imagePath = './demo/dan.jpg'
        self.image = pygame.image.load(self.imagePath)
    pass
    def move(self):
        if self.type =='player':
            self.y -=0.2
        elif self.type == 'enemy':
            self.y += 0.4
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
    def judge(self):
        if self.y>500 or self.y<0:
            return True
        else:
            return False
# 创建玩家类
class Player(BasePlane):
    def __init__(self,screen):# 主窗口对象要传递过来,因为要展示所以必须有screen
        '''

        :param screen: 主窗体对象
        '''
        super().__init__(screen,'./demo/ji.jpg') # 调用父类的构造方法
        self.x=150
        self.y=450

    def moveleft(self):
        '''
        左移动
        :return:
        '''
        if self.x>0:
            self.x-=10
        pass
    def moveright(self):
        '''
        右移动
        :return:
        '''
        if self.x<355:
            self.x+=10
        pass
    def moveup(self):
        '''
        上移动
        :return:
        '''
        if self.y>0:
            self.y-=10
        pass
    def movedown(self):
        '''
        下移动
        :return:
        '''
        if self.y<455:
            self.y+=10
        pass

        for bullet in self.bulletList:
            bullet.display() # 显示子弹位置
            bullet.move() # 让子弹移动,下次显示子弹修改后的位置
            pass
    # 发射子弹
    def fire(self):
        # 创建一个新的子弹对象
        newBullet = CommonBullet(self.x,self.y,self.screen,'player')
        self.bulletList.append(newBullet)


    pass

# 创建敌人类
class Enemy(BasePlane): # 继承的话只是继承了上面的类方法,并不能继承self
    def __init__(self,screen): # 主窗口对象要传递过来,因为要展示所以必须有screen
        # 设置一个默认初始移动方向
        super().__init__(screen,'./demo/muji.png')
        self.direction='right'
        # 定位
        self.x = 0
        self.y = 0

    def fire(self):
        '''
        敌机发射,导入随机数据
        :return:
        '''
        num=random.randint(1,500) # 创建随机数,如果是这个数则发射子弹
        if num==100:

            newBullet = CommonBullet(self.x, self.y, self.screen,'enemy')
            self.bulletList.append(newBullet)
        pass
    def move(self):
        if self.direction == 'right':
            self.x += 0.2
        elif self.direction == 'left':
            self.x -= 0.2
        if self.x >350:
            self.direction = 'left'
        elif self.x < 10:
            self.direction = 'right'
            pass

# 定义控制函数

def key_control(plyobj):
    '''
    定义普通函数 用来实现键盘检测
    :param plyobj:可控制检测的对象
    :return:
    '''
    # 获取键盘事件
    eventlist = pygame.event.get()
    for event in eventlist:
        if event.type == pygame.QUIT:
            print('退出')
            exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a or event.key == pygame.K_LEFT:
                print('left')
                plyobj.moveleft() # 调用函数实现移动
                pass

            elif event.key == pygame.K_d or event.key == pygame.K_RIGHT:
                print('right')
                plyobj.moveright()
                pass

            elif event.key == pygame.K_w or event.key == pygame.K_UP:
                print('up')
                plyobj.moveup()
                pass

            elif event.key == pygame.K_s or event.key == pygame.K_DOWN:
                print('down')
                plyobj.movedown()
                pass

            elif event.key == pygame.K_SPACE:
                print('fire')
                plyobj.fire()


            # pass占位符放在哪里都一样
            # 如果在开发程序时,不希望立刻编写分支内部的代码
            # 可以使用 pass 关键字,表示一个占位符,能够保证程序的代码结构正确!
            # 程序运行时,pass 关键字不会执行任何的操作!

    pass

# 主函数框架
def main ():
    # 首先创建一个窗口 用来显示内容
    screen= pygame.display.set_mode((400,500),depth=32)
    # 设定背景图片
    background = pygame.image.load('./demo/background.jpg')
    # 设置title
    pygame.display.set_caption('阶段总结,飞机游戏')

    #添加背景音乐
    pygame.mixer.init()
    pygame.mixer_music.load('./demo/jinitaimei.mp3')
    pygame.mixer_music.set_volume(0.5) # 设置音量
    pygame.mixer_music.play(-1) # 循环次数,-1代表无限循环

    # 创建玩家实例对象
    player = Player(screen)
    # 创建敌人实例对象
    enemy = Enemy(screen)

    #设定要显示的内容
    while True:
        screen.blit(background,(0,0)) #显示背景图片0.0代表坐标
        player.display() #显示玩家图片0.0代表坐标
        enemy.display()
        enemy.move() # 不触发不会动
        enemy.fire() # 不处罚不会发射
        # 获取键盘事件
        key_control(player)


        # 更新显示内容
        pygame.display.update()
        time.sleep(0.001)

    pass
if __name__=='__main__':
    main()

自己写整个项目还是相当不熟练,还需要继续练习面向对象的思路编程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值