Python——飞机大战(day10)

这篇具有很好参考价值的文章主要介绍了Python——飞机大战(day10)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、面向过程实现

二、面向对象


plane pro需求的描述:

存在四个对象:
我方飞机、敌方飞机、我方子弹、敌方子弹
功能:

背景音乐的添加

我方飞机可以移动【根据按键来控制的】
敌方飞机也可以移动【随机的自动移动】

双方飞机都可以发送子弹

步骤:
1.创建一个窗口
2.创建一个我方飞机 根据方向键左右的移动
3.给我方飞机添加发射子弹的功能【按下空格键去发送】
4.创建一个敌人飞机
5.敌人飞机可以自由的移动
6.敌人飞机可以自动的发射子弹

在安装pygame模块的时候尤其要注意一下:

如果在pychram中安装不成功  如下错误:
   EOFError: EOF when reading a line

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in C:\Users\Administrator\AppData\Local\Temp\pip-install-392v1at0\pygame\

此时我们就可以换种思路:

1:确保在系统层面的python环境里面 已经安装了pygame[pip install pygame] 一般都可以安装成功
2: 我们就可以把 已经安装好的 pygame 模块的 文件夹拷贝到 pycharm 所创建项目中的venv虚拟环境里面【E:\PythonPro\PlaneDemo\venv\Lib\site-packages】

soure path:C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\Lib\site-packages
dst path: 你的项目路径/venv\Lib\site-packages
 

一、面向过程实现

1、首先设置进行窗口、背景设置

import pygame # 引用pygame模块
from pygame.locals import  *
import time

def main():

#----------------------------- 窗口、背景的基本设置 -------------------------

    # 首先创建一个窗口,用来显示内容
    screen = pygame.display.set_mode((350,500)) # 设置宽、高:350,500
    # 创建一个背景图片对象
    background = pygame.image.load('./feiji/background.png') # 当前路径下的
    # 设置一个标题
    pygame.display.set_caption('阶段总结-飞机大战')
    # 添加背景音乐
    pygame.mixer.init() # 初始化这个函数
    pygame.mixer.music.load('./feiji/background.mp3')
    pygame.mixer.music.set_volume((0.2)) # 0-1之间设置音量
    pygame.mixer.music.play(-1) # 设置循环次数,-1表示无限循环
    #函数原型:pygame.key.set_repeat(delay, interval)

2、载入己方和地方飞机

# 载入玩家的飞机图片
    hero = pygame.image.load('./feiji/hero.png')
    # 初始化玩家的位置:
    x, y = 155, 450 # 玩家飞机hero大小:40×50;(155, 450)表示在窗口最下方居中显示的位置

3、循环更新显示界面

    # 设定要显示的内容
    while True:
        screen.blit(background, (0, 0)) # 显示背景图片,(对象,居中显示),(0,0)表示从窗口的(0,0)坐标开始显示
        screen.blit(hero, (x, y)) # 显示玩家飞机
        # 获取键盘事件
        eventlist = pygame.event.get()
        for event in eventlist:
            if event.type == QUIT:
                print('退出')
                exit()
                pass
            elif event.type == KEYDOWN: # 是否按下了键盘
                if event.key == K_a or event.key == K_LEFT: # 按下了左键
                    print('left')
                    if x > 0:
                        x -= 5
                    elif x < 0:
                        x = 0
                        pass

                elif event.key == K_d or event.key == K_RIGHT: # 按下了右键
                    print('right')
                    if x < 310:
                        x += 5
                    elif x > 310:
                        x = 310
                        pass

                elif event.key == K_SPACE:
                    print('K_SPACE')
        # 更新显示内容
        pygame.display.update()
    pass

if __name__ == '__main__':
    main()

到这里发现,可以控制飞机移动,但是每按下一次键盘只能移动一次,好像不符合正常游戏要求

Python——飞机大战(day10)

所以添加

pygame.key.set_repeat(10, 15) # 放到初始化中,这两个参数都是以ms为单位的

 函数即可实现,按下连续移动

只需要将这段代码放到初始化中即可!(ps:)

代码的具体意义:
在pygame中对按键的连续检测是默认失能的,调用上述函数便可以使能按键的连续检测。按键的连续检测使能后,当按键按下时,将会以delay的延时去触发第一次的KEYDOWN事件,之后则会以interval的延时去触发接下来的KEYDOWN事件。通俗的讲,第一个参数影响着按键的灵敏度,第二个参数影响着按键的移动时间间隔。即:以上述(10,15)来说,每次按下键盘触发KEYDOWN事件后,延时10ms后再次检测是否有还在按下,若在10ms内有按下,则之后以15ms的延时连续触发接下来的KEYDOWN。

二、面向对象

import pygame # 引用pygame模块
from pygame.locals import  *
import time
import random
# ---------------------------------- 面对对象 -------------------------------------

'''
1:实现飞机的显示,并且可以控制飞机的移动【面向对象】
'''
# 抽象出来一个飞机的基类
class BasePlane(object):
    def __init__(self, screen, imagePath):
        '''
        初始化基类函数
        :param screen: 主窗体对象
        :param imageName: 加载的图片
        '''
        self.screen = screen
        self.image = pygame.image.load(imagePath)
        self.bulletlist = [] #存储所有的子弹
        pass
    def display(self):
        self.screen.blit(self.image, (self.x, self.y))
        # 完善子弹的展示逻辑,删除越界的子弹,释放内存
        needDelItemList = []
        for item in self.bulletlist:
            if item.judge():
                needDelItemList.append(item)
                pass
            pass
        # 重新遍历一遍
        for i in needDelItemList:
            self.bulletlist.remove(i)
            pass
        for bullet in self.bulletlist:
            bullet.display()  # 显示子弹的位置
            bullet.move()  # 让这个子弹移动,下次再显示的就会看到子弹在修改后的位置
        pass
    pass

class CommonBullet(object):
    '''
    公共的子弹类
    '''
    def __init__(self, x, y, screen, bullettype):
        self.type = bullettype
        self.screen = screen
        if self.type == "hero":
            self.x += 20
            self.y -= 20
            self.imagePath = './feiji/bullet.png'
        elif self.type == "enemy":
            self.x = x
            self.y += 10
            self.imagePath = './feiji/bullet1.png'
        self.image = pygame.image.load(self.imagePath)
    def move(self):
        '''
        子弹的移动
        :return:
        '''
        if self.type == 'hero':
            self.y -= 2
        elif self.type == 'enemy':
            self.y += 2
    def display(self):
        self.screen.blit(self.image,(self.x, self.y))
    pass

class HeroPlane(BasePlane):
    def __init__(self, screen):
        '''
        初始化函数
        :param screen: 主窗体对象
        '''

        super().__init__(screen, './feiji/hero.png') # 调用父类的构造方法
        # 飞机的默认位置
        self.x = 155
        self.y = 450
        pass
    def moveleft(self):
        '''
        左移动
        :return:
        '''
        if self.x > 0:
            self.x -= 5
        elif self.x <= 0:
            self.x = 0
        pass
    def moveright(self):
        '''
        右移动
        :return:
        '''
        if self.x < 310:
            self.x += 5
        elif self.x >= 310:
            self.x = 310
        pass
    def moveup(self):
        '''
        上移动
        :return:
        '''
        if self.y > 0:
            self.y -= 5
        elif self.y <= 0:
            self.y = 0
        pass
    def movedown(self):
        '''
        下移动
        :return:
        '''
        if self.y < 450:
            self.y += 5
        elif self.y >= 450:
            self.y = 450
        pass
    # 发射子弹
    def ShotBullet(self):
        # 创建一个新的子弹对象
        newbullet = CommonBullet(self.x, self.y, self.screen, 'hero')
        self.bulletlist.append(newbullet)
        pass

'''
创建敌机类
'''
class EnemyPlane(BasePlane):
    def __init__(self, screen):
        super().__init__(screen, './feiji/enemy0.png')
        # 默认设置一个方向
        self.direction = 'right'
        # 飞机的默认位置
        self.x = 0
        self.y = 0
        pass
    def shotenemybullet(self):
        '''
        敌机随机发射
        :return:
        '''
        num = random.randint(1,50)
        if num == 3:
            newbullet = CommonBullet(self.x, self.y, self.screen, 'enemy')
            self.bulletlist.append(newbullet)
        pass
    def move(self):
        '''
        敌机移动 随机进行
        :return:
        '''
        if self.direction == 'right':
            self.x += 2
        elif self.direction == 'left':
            self.x -= 2
        if self.x > 330:
            self.direction = 'left'
        elif self.x < 0:
            self.direction = 'right'
    pass

def key_control(HeroObj):
    '''
    定义普通的函数,用来实现键盘的检测
    :param HeroObj:可控制检测的对象
    :return:
    '''

    # 获取键盘事件
    eventlist = pygame.event.get()
    # pygame.key.set_repeat(10, 15)
    pygame.key.set_repeat(200, 15)
    # pygame.key.set_repeat(200, 200)
    for event in eventlist:
        if event.type == QUIT:
            print('退出')
            exit()
            pass
        elif event.type == KEYDOWN:  # 是否按下了键盘
            if event.key == K_a or event.key == K_LEFT:  # 按下了左键
                print('left')
                HeroObj.moveleft() # 调用函数实现左移动
                pass
            elif event.key == K_d or event.key == K_RIGHT:  # 按下了右键
                print('right')
                HeroObj.moveright()  # 调用函数实现右移动
                pass
            elif event.key == K_w or event.key == K_UP:  # 按下了右键
                print('up')
                HeroObj.moveup()  # 调用函数实现上移动
                pass
            elif event.key == K_s or event.key == K_DOWN:  # 按下了右键
                print('down')
                HeroObj.movedown()  # 调用函数实现下移动
                pass
            elif event.key == K_SPACE:
                print('K_SPACE')
                HeroObj.ShotBullet()


def main():
#----------------------------- 窗口、背景的基本设置 -------------------------
    # 首先创建一个窗口,用来显示内容
    screen = pygame.display.set_mode((350,500)) # 设置宽、高:350,500
    # 创建一个背景图片对象
    background = pygame.image.load('./feiji/background.png') # 当前路径下的
    # 设置一个标题
    pygame.display.set_caption('阶段总结-飞机大战')
    # 添加背景音乐
    pygame.mixer.init() # 初始化这个函数
    pygame.mixer.music.load('./feiji/background.mp3')
    pygame.mixer.music.set_volume((0.2)) # 0-1之间设置音量
    pygame.mixer.music.play(-1) # 设置循环次数,-1表示无限循环
    #函数原型:pygame.key.set_repeat(delay, interval)

    # 创建一个飞机对象
    hero = HeroPlane(screen)
    # 创建一个敌人
    enemyplane = EnemyPlane(screen)

    # 设定要显示的内容
    while True:
        screen.blit(background, (0, 0)) # 显示背景图片,(对象,居中显示),(0,0)表示从窗口的(0,0)坐标开始显示
        hero.display()
        enemyplane.display() # 显示敌机
        enemyplane.move()  # 敌机移动
        enemyplane.shotenemybullet() # 敌机随机发射子弹
        # 获取键盘事件
        key_control(hero)
        # 更新显示内容
        pygame.display.update()
        # time.sleep(1)
        pygame.time.Clock().tick(15) # 每秒发生15次
    pass

if __name__ == '__main__':
    main()


  文章来源地址https://www.toymoban.com/news/detail-408382.html

到了这里,关于Python——飞机大战(day10)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Python的飞机大战游戏的设计与实现

    收藏关注不迷路    飞机大战是一种非常传统的电脑游戏,也是非常经典的游戏之一,经常可以在电脑,手机,以及各类便携式游戏机中见到。传统的老式飞行游戏以平面,灰白画面为主。而现在,随着计算机性能的飞速发展,我们目前可以在计算机上见到种类更加繁多的

    2024年02月04日
    浏览(16)
  • python毕设分享 飞机大战设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 **飞机大战小游戏设计与实现 ** 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:3分 项目获取: https://gitee.com/sinonfin

    2024年02月03日
    浏览(12)
  • python小游戏毕设 飞机大战设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 飞机大战小游戏设计与实现 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:3分 利用Python制作的一个简易版类\\\"飞机大

    2024年02月10日
    浏览(16)
  • Python3+pygame实现有趣好玩的飞机大战游戏(附源码及素材)

    版权声明:原创不易,本文禁止抄袭、转载,侵权必究! 开发环境 :Windows10 Python3.6.4 第三方库 :Pygame1.9.6 IDE :PyCharm/Sublime Text 素材模块 游戏图片素材: BGM及音效素材: 字体素材: 源码模块 子弹模块 普通子弹部分源码: 超级子弹部分源码: 敌机子弹部分源码: 敌机模

    2024年02月11日
    浏览(15)
  • 我的第一个项目(十一) :飞机大战分包完成(简单阐述分包思路以及过程)

    好家伙,   代码已开源 Git: https://gitee.com/tang-and-han-dynasties/panghu-planebattle-esm.git NPM: panghu-planebattle-esm - npm (npmjs.com)   现在,比如说,我用Vue写好了个人博客主页的前端 我想在这个主页里面加点东西,让我的博客更缤纷多彩一点 我想在他的主页里面塞个小游戏,他会怎么做   如下

    2023年04月18日
    浏览(9)
  • 简直不能相信!这款IDE仅插件10秒写出飞机大战游戏,太神奇了!

    昨天分享了一款可以帮我们写代码的插件 CodeGeex ,其实能帮我们解决大部分问题,讲道理已经很好了对不对? but ,他就是最好的插件吗? 肯定不是,这不又让我又发现了一款可以平替的插件 TONGYI Lingma (阿里云出品智能编码助手通义灵码)。 可能有同学会问了,那六哥这

    2024年02月06日
    浏览(15)
  • Python飞机大战(完整版)

    简介:一共分为2个py文件,分别是主类、和精灵类 飞机大战图片地址:链接: https://pan.baidu.com/s/18T6n9JFIDxBqYX9CnHi7ZQ  密码: tqbr 注释:项目启动后如果报libpng warning: iCCP: known incorrect sRGB profile无须处理,不会影响项目和代码,视觉洁癖可以直接百度搜索这个错误提示,网上有解

    2024年02月12日
    浏览(12)
  • 飞机大战python代码

    下面附有源代码,一个简单运用python的应用。 图片可自己自由调配 部分模块需要去从python的软件包去下载,可以去从清华和北大还有阿里的云仓库中获取镜像链接,下载速度会快点。 源代码如下并有详细注释:

    2024年02月03日
    浏览(11)
  • python学习-飞机大战

    一、pygame正确安装 1.安装:pip install pygame 2.验证安装:python -m pygame.examples.aliens;安装ok即会出现如下图所示动画 二、使用pygame创建图像窗口 1.游戏的初始化和退出;要使用pygame提供的所有功能之前,必须先调用init方法;在游戏结束,需要调用quit方法 2.在游戏中,所有可见的

    2024年02月11日
    浏览(46)
  • python项目:飞机大战已封装(第一部分)第二部分在飞机大战专辑,后期合并

    图片资源已经展示在了顶部 上面我们用import进行了导包以方便后期调用,并用pygame.init()进行了初始化,pygame的所有使用都需要初始化,然后用pygame.display.set_mode创建游戏总画布注意总画布大小要与背景图相关联 英雄子弹类解析 在许多射击游戏中,子弹类是基本的组成部分之

    2024年04月17日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包