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 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)相关推荐
- python飞机大战设计思路_python飞机大战pygame游戏背景设计详解
本文实例讲述了python飞机大战pygame游戏背景设计.分享给大家供大家参考,具体如下: 目标 背景交替滚动的思路确定 显示游戏背景 01. 背景交替滚动的思路确定 运行 备课代码,观察 背景图像 ...
- python飞机大战联网版_Python 飞机大战搞怪版本
python 飞机大战搞怪版本 (飞机为迷你亚索,外星人为迷你小诺手,由于时间关系和图片素材较难寻找,仅仅做了简易版,没有贴上背景图片.由于篇幅原因,对于函数讲解较为简略,可以自行搜索相应函数的用法) ...
- python飞机大战功能模块图_基于Python的飞机大战游戏设计
第 2 3 卷 第 1 期 2019年 3 月 扬 州 职 业 大 学 学 报 Journal of Yangzhou Polytechnic College Vol .23 No . 1 Mar . ...
- python飞机大战没有运行界面_python3实现飞机大战
本文实例为大家分享了python3实现飞机大战的具体代码,供大家参考,具体内容如下 以下是亲测Python飞机大战全部代码,在保证有pygame环境支持并且有Python3解释器的话完全没问题! 如果 ...
- python飞机大战任务报告_Python飞机大战实战项目案例
都说实践是检验知识掌握程度的最好测试.随着Python学习者的增长,越来越多的零基础入门课程让人眼花缭乱.虽然说基础理论的学习十分重要,但是如果仅仅只学习理论知识,也是远远不够的.飞机大战的项目实战可 ...
- C++的学习心得和知识总结(十六)|基于EasyX实现小甲鱼Python飞机大战项目(C++版)
目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.小甲鱼Python项目 – 飞机大战 2.本文使用的掩码图生成工具 自动生成遮罩图的程序,点击前往 3.EasyX官方链 ...
- Python 飞机大战游戏中 获取被击中飞机的坐标位置信息
Python 飞机大战游戏中 获取被击中飞机的坐标位置信息 在参考现有的飞机大战游戏代码,写第一个python游戏,子弹击中飞机后,飞机消失,想着如果能有爆照效果就好了. 于是新建了一个爆炸效果的sp ...
- python飞机大战源码素材包_小甲鱼python基础教程飞机大战源码及素材
原博文 2018-12-22 23:32 − 百度了半天小甲鱼python飞机大战的源码和素材,搜出一堆不知道是什么玩意儿的玩意儿. 最终还是自己对着视频一行行代码敲出来. 需要的同学点下面的链接自取 ...
- python飞机大战计分代码_Python 飞机大战代码练习
Python 飞机大战代码练习 最近在自学Python,参照代码自己写了一遍飞机大战游戏的代码.主要应用的模块为pygame.整个代码如下所示,主要分为主模块和各种精灵类定义模块,记录一下自己的学习历 ...
- python飞机大战加背景音乐_python实现飞机大战小游戏 python飞机大战中的音频文件怎么改成MP3...
怎么样用Python写飞机大战游戏 python开发飞机大战外星人游戏怎么弄双人模式新的一年,哪怕仍是一个人,也要活得像一支队伍,为自己的头脑和心灵招兵买马,不气馁,有召唤,爱自由. 主函数 impo ...
最新文章
- MySQL隐藏换行符的处理
- [C#.NET 拾遗补漏]08:强大的LINQ
- Redis源码分析之小型测试框架testhelp.h和redis-check-aof.c日志检测
- Eclipse MAT 安装及使用
- SQL注入如何进行攻击
- Python3 uniform() 函数
- Atitit rpc之道 attilax著 艾龙 著 1. 远程过程调用协议	1 2. 历史	2 2.1. RPC的早期发展	3 3. RPC这种编程范式存在的三大问题以及这些问题	5 3.1.
- 重装win10专业版系统
- 2021年发表心理学论文被引量TOP 10
- homelede软路由设置方法_低成本组装一台LEDE软路由
- 使用 easyExcel 生成多个 excel 并打包成zip压缩包
- [英语] It_be_XXX_that_YYY强调句句式
- dellemc服务器中文语言设置,美版windows10系统设置中文语言的方法
- 【modlearts】华为人工智能平台_modelarts平台系列教程3_预置算法_语音处理3
- Warning: Static member accessed via instance reference
- Java动态代理原理分析
- 小米盒子4S 905L成功刷入emuelec系统
- java人民币大小写转换_Java 实现人民币小写转大写[转载http://sunjun.blogchina.com/]
- python 导航框 | 哔哩哔哩推荐100万收藏的导航网页
- dnf用计算机算比例,DNF比例计算查询
热门文章
- 计算机教室英语手抄报,我的教室英语手抄报
- KDJ、RSI、MACD
- 【Android进阶】14、theme 主题 和 menu 顶部应用栏
- 吕蒙正千年奇文《寒窑赋》鉴赏
- java aes 工具类_Java中的AES加解密工具类:AESUtils
- CPAL脚本自动化测试 ———— Signal Wait系列函数及使用
- 企业为什么要上OA?
- 大学计算机与应用软件,第5章 应用软件与常用办公软件 大学计算机基础简明教程[最新].doc...
- 纳税服务系统四(角色模块)【角色与权限、角色与用户】
- 效果图网站、外包平台接单平台有哪些?