目录

一、面向过程实现

二、面向对象


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 timedef 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()passelif event.type == KEYDOWN: # 是否按下了键盘if event.key == K_a or event.key == K_LEFT: # 按下了左键print('left')if x > 0:x -= 5elif x < 0:x = 0passelif event.key == K_d or event.key == K_RIGHT: # 按下了右键print('right')if x < 310:x += 5elif x > 310:x = 310passelif event.key == K_SPACE:print('K_SPACE')# 更新显示内容pygame.display.update()passif __name__ == '__main__':main()

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

所以添加

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 = screenself.image = pygame.image.load(imagePath)self.bulletlist = [] #存储所有的子弹passdef display(self):self.screen.blit(self.image, (self.x, self.y))# 完善子弹的展示逻辑,删除越界的子弹,释放内存needDelItemList = []for item in self.bulletlist:if item.judge():needDelItemList.append(item)passpass# 重新遍历一遍for i in needDelItemList:self.bulletlist.remove(i)passfor bullet in self.bulletlist:bullet.display()  # 显示子弹的位置bullet.move()  # 让这个子弹移动,下次再显示的就会看到子弹在修改后的位置passpassclass CommonBullet(object):'''公共的子弹类'''def __init__(self, x, y, screen, bullettype):self.type = bullettypeself.screen = screenif self.type == "hero":self.x += 20self.y -= 20self.imagePath = './feiji/bullet.png'elif self.type == "enemy":self.x = xself.y += 10self.imagePath = './feiji/bullet1.png'self.image = pygame.image.load(self.imagePath)def move(self):'''子弹的移动:return:'''if self.type == 'hero':self.y -= 2elif self.type == 'enemy':self.y += 2def display(self):self.screen.blit(self.image,(self.x, self.y))passclass HeroPlane(BasePlane):def __init__(self, screen):'''初始化函数:param screen: 主窗体对象'''super().__init__(screen, './feiji/hero.png') # 调用父类的构造方法# 飞机的默认位置self.x = 155self.y = 450passdef moveleft(self):'''左移动:return:'''if self.x > 0:self.x -= 5elif self.x <= 0:self.x = 0passdef moveright(self):'''右移动:return:'''if self.x < 310:self.x += 5elif self.x >= 310:self.x = 310passdef moveup(self):'''上移动:return:'''if self.y > 0:self.y -= 5elif self.y <= 0:self.y = 0passdef movedown(self):'''下移动:return:'''if self.y < 450:self.y += 5elif self.y >= 450:self.y = 450pass# 发射子弹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 = 0self.y = 0passdef shotenemybullet(self):'''敌机随机发射:return:'''num = random.randint(1,50)if num == 3:newbullet = CommonBullet(self.x, self.y, self.screen, 'enemy')self.bulletlist.append(newbullet)passdef move(self):'''敌机移动 随机进行:return:'''if self.direction == 'right':self.x += 2elif self.direction == 'left':self.x -= 2if self.x > 330:self.direction = 'left'elif self.x < 0:self.direction = 'right'passdef 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()passelif event.type == KEYDOWN:  # 是否按下了键盘if event.key == K_a or event.key == K_LEFT:  # 按下了左键print('left')HeroObj.moveleft() # 调用函数实现左移动passelif event.key == K_d or event.key == K_RIGHT:  # 按下了右键print('right')HeroObj.moveright()  # 调用函数实现右移动passelif event.key == K_w or event.key == K_UP:  # 按下了右键print('up')HeroObj.moveup()  # 调用函数实现上移动passelif event.key == K_s or event.key == K_DOWN:  # 按下了右键print('down')HeroObj.movedown()  # 调用函数实现下移动passelif 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次passif __name__ == '__main__':main()

Python——飞机大战(day10)相关推荐

  1. python飞机大战设计思路_python飞机大战pygame游戏背景设计详解

    本文实例讲述了python飞机大战pygame游戏背景设计.分享给大家供大家参考,具体如下: 目标 背景交替滚动的思路确定 显示游戏背景 01. 背景交替滚动的思路确定 运行 备课代码,观察 背景图像 ...

  2. python飞机大战联网版_Python 飞机大战搞怪版本

    python 飞机大战搞怪版本 (飞机为迷你亚索,外星人为迷你小诺手,由于时间关系和图片素材较难寻找,仅仅做了简易版,没有贴上背景图片.由于篇幅原因,对于函数讲解较为简略,可以自行搜索相应函数的用法) ...

  3. python飞机大战功能模块图_基于Python的飞机大战游戏设计

    第 2 3 卷 第 1 期 2019年 3 月 扬 州 职 业 大 学 学 报 Journal of Yangzhou Polytechnic College Vol .23 No . 1 Mar . ...

  4. python飞机大战没有运行界面_python3实现飞机大战

    本文实例为大家分享了python3实现飞机大战的具体代码,供大家参考,具体内容如下 以下是亲测Python飞机大战全部代码,在保证有pygame环境支持并且有Python3解释器的话完全没问题! 如果 ...

  5. python飞机大战任务报告_Python飞机大战实战项目案例

    都说实践是检验知识掌握程度的最好测试.随着Python学习者的增长,越来越多的零基础入门课程让人眼花缭乱.虽然说基础理论的学习十分重要,但是如果仅仅只学习理论知识,也是远远不够的.飞机大战的项目实战可 ...

  6. C++的学习心得和知识总结(十六)|基于EasyX实现小甲鱼Python飞机大战项目(C++版)

    目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.小甲鱼Python项目 – 飞机大战 2.本文使用的掩码图生成工具 自动生成遮罩图的程序,点击前往 3.EasyX官方链 ...

  7. Python 飞机大战游戏中 获取被击中飞机的坐标位置信息

    Python 飞机大战游戏中 获取被击中飞机的坐标位置信息 在参考现有的飞机大战游戏代码,写第一个python游戏,子弹击中飞机后,飞机消失,想着如果能有爆照效果就好了. 于是新建了一个爆炸效果的sp ...

  8. python飞机大战源码素材包_小甲鱼python基础教程飞机大战源码及素材

    原博文 2018-12-22 23:32 − 百度了半天小甲鱼python飞机大战的源码和素材,搜出一堆不知道是什么玩意儿的玩意儿. 最终还是自己对着视频一行行代码敲出来. 需要的同学点下面的链接自取 ...

  9. python飞机大战计分代码_Python 飞机大战代码练习

    Python 飞机大战代码练习 最近在自学Python,参照代码自己写了一遍飞机大战游戏的代码.主要应用的模块为pygame.整个代码如下所示,主要分为主模块和各种精灵类定义模块,记录一下自己的学习历 ...

  10. python飞机大战加背景音乐_python实现飞机大战小游戏 python飞机大战中的音频文件怎么改成MP3...

    怎么样用Python写飞机大战游戏 python开发飞机大战外星人游戏怎么弄双人模式新的一年,哪怕仍是一个人,也要活得像一支队伍,为自己的头脑和心灵招兵买马,不气馁,有召唤,爱自由. 主函数 impo ...

最新文章

  1. MySQL隐藏换行符的处理
  2. [C#.NET 拾遗补漏]08:强大的LINQ
  3. Redis源码分析之小型测试框架testhelp.h和redis-check-aof.c日志检测
  4. Eclipse MAT 安装及使用
  5. SQL注入如何进行攻击
  6. Python3 uniform() 函数
  7. Atitit rpc之道 attilax著 艾龙 著 1. 远程过程调用协议 1 2. 历史 2 2.1. RPC的早期发展 3 3. RPC这种编程范式存在的三大问题以及这些问题 5 3.1.
  8. 重装win10专业版系统
  9. 2021年发表心理学论文被引量TOP 10
  10. homelede软路由设置方法_低成本组装一台LEDE软路由
  11. 使用 easyExcel 生成多个 excel 并打包成zip压缩包
  12. [英语] It_be_XXX_that_YYY强调句句式
  13. dellemc服务器中文语言设置,美版windows10系统设置中文语言的方法
  14. 【modlearts】华为人工智能平台_modelarts平台系列教程3_预置算法_语音处理3
  15. Warning: Static member accessed via instance reference
  16. Java动态代理原理分析
  17. 小米盒子4S 905L成功刷入emuelec系统
  18. java人民币大小写转换_Java 实现人民币小写转大写[转载http://sunjun.blogchina.com/]
  19. python 导航框 | 哔哩哔哩推荐100万收藏的导航网页
  20. dnf用计算机算比例,DNF比例计算查询

热门文章

  1. 计算机教室英语手抄报,我的教室英语手抄报
  2. KDJ、RSI、MACD
  3. 【Android进阶】14、theme 主题 和 menu 顶部应用栏
  4. 吕蒙正千年奇文《寒窑赋》鉴赏
  5. java aes 工具类_Java中的AES加解密工具类:AESUtils
  6. CPAL脚本自动化测试 ———— Signal Wait系列函数及使用
  7. 企业为什么要上OA?
  8. 大学计算机与应用软件,第5章 应用软件与常用办公软件 大学计算机基础简明教程[最新].doc...
  9. 纳税服务系统四(角色模块)【角色与权限、角色与用户】
  10. 效果图网站、外包平台接单平台有哪些?