python实现飞机大战小游戏


Posted in Python onNovember 08, 2019

本文实例为大家分享了python实现飞机大战的具体代码,供大家参考,具体内容如下

初学Python,写了一个简单的Python小游戏。

师出bilibili某前辈

pycharm自带了第三方库pygame,安装一下就好了,很方便。

虽然很多大佬已经给出了步骤,我这里还是??乱幌拢?参?俗约汗?桃幌隆?/p>

上图:

python实现飞机大战小游戏

python实现飞机大战小游戏

这里再给出代码的逻辑架构

python实现飞机大战小游戏

plane_main.py

import pygame
from plane_sprites import *

class PlaneGame(object):
 """飞机大战主游戏"""
 def __init__(self):
 print("游戏初始化")
 #1.创建游戏窗口
 self.screen=pygame.display.set_mode(SCREEN_RECT.size)
 #2.创建游戏的时钟
 self.clock=pygame.time.Clock()
 #3.调用私有方法,精灵和精灵组的创建
 self.__creat_sprites()
 #4.设置定时器事件-1s敌机出现
 pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)
 pygame.time.set_timer(HERO_FIRE_EVENT, 500)

 def __creat_sprites(self):
 # 创建精灵
 bg1 = Background()
 bg2 = Background(True)
 # 创建精灵组
 self.back_group = pygame.sprite.Group(bg1,bg2)
 #创建敌机的精灵组
 self.enemy_group=pygame.sprite.Group()
 #创建英雄的精灵和精灵组
 self.hero=Hero()
 self.hero_group=pygame.sprite.Group(self.hero)
 self.enemy_hit_group=pygame.sprite.Group();



 def start_game(self):
 print("游戏开始.....")
 while True:
 #1.设置刷新帧率
 self.clock.tick(FRAME_PER_SEC)

 #2.事件监听
 self.__event_handler()

 #3.碰撞检测
 self.__check_collide()

 #4.更新绘制精灵组
 self.__update_sprites()

 #5.更新显示
 pygame.display.update()

 def __event_handler(self):
 for event in pygame.event.get():
 if event.type==pygame.QUIT:
 PlaneGame.__game_over()
 elif event.type==CREATE_ENEMY_EVENT:
 print("敌机出场")
 #创建敌机精灵
 enemy=Enemy()
 #将敌机精灵添加到敌机精灵组
 self.enemy_group.add(enemy)
 elif event.type==HERO_FIRE_EVENT:
 self.hero.fire()
 #elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
 #print("向右移动....")
 #使用键盘模块
 keys_pressed=pygame.key.get_pressed()
 #判断元组中对应的按键索引值
 if keys_pressed[pygame.K_RIGHT]:
 self.hero.speed=3
 elif keys_pressed[pygame.K_LEFT]:
 self.hero.speed = -3
 else:
 self.hero.speed = 0


 def __check_collide(self):
 #1.子弹摧毁敌机
 enemy_hit = pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)

 

 #2.敌机撞毁英雄
 enemies=pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
 if len(enemies)>0:
 #让英雄牺牲
 # self.hero.explode()
 self.hero.kill()
 #结束游戏
 PlaneGame.__game_over()



 def __update_sprites(self):
 self.back_group.update()
 self.back_group.draw(self.screen)
 self.enemy_group.update()
 self.enemy_group.draw(self.screen)
 self.hero_group.update()
 self.hero_group.draw(self.screen)
 self.hero.bullets.update()
 self.hero.bullets.draw(self.screen)

 @staticmethod
 def __game_over():
 print("游戏结束")
 pygame.quit()
 exit()


if __name__ == '__main__':
 #创建游戏对象
 game=PlaneGame()
 #启动游戏
 game.start_game()

plane_sprites.py

import random
import pygame
#屏幕大小常量
SCREEN_RECT=pygame.Rect(0,0,480,700)
#刷新帧率
FRAME_PER_SEC=60
explode_index=0
#创建定时器常量
CREATE_ENEMY_EVENT=pygame.USEREVENT
#创建发射子弹事件
HERO_FIRE_EVENT=pygame.USEREVENT+1
class GameSprite(pygame.sprite.Sprite):
 """飞机大战游戏精灵"""
 def __init__(self,image_name,speed=1):

 # 调用父类的初始化方法
 super().__init__()
 # 定义对象的属性
 self.image=pygame.image.load(image_name)
 self.rect=self.image.get_rect()
 self.speed=speed
 def update(self):
 #在屏幕的垂直方向运动
 self.rect.y+=self.speed

class Background(GameSprite):
 """游戏背景精灵"""
 def __init__(self,is_alt=False):
 #1.调用父类方法,实现精灵创建(image/rect/speed)
 super().__init__("./images/background.png")
 #2.判断是否是交替图像
 if is_alt:
 self.rect.y = -self.rect.height
 def update(self):
 #1.调用父类方法实现
 super().update()
 #2.判断图像是否移除屏幕,若移除,则设置到屏幕上面
 if self.rect.y>=SCREEN_RECT.height:
 self.rect.y= -self.rect.height

class Enemy(GameSprite):
 """敌机精灵"""

 def __init__(self):
 #1.调用父类方法,创建敌机精灵,指定敌机图片
 super().__init__("./images/enemy1.png")
 #2.指定敌机的初始随机速度1-3
 self.speed=random.randint(1,3)
 #3.指定敌机的初始随机位置
 self.rect.bottom=0
 max_x=SCREEN_RECT.width-self.rect.width
 self.rect.x=random.randint(0,max_x)
 self.explode_index=0
 def update(self):
 #1.调用父类方法,保持垂直方向飞行
 super().update()
 #2.判断是否飞出屏幕,如果是,则删除精灵
 if self.rect.y>=SCREEN_RECT.height:
 #kill方法可以将精灵从精灵组中移出,精灵就会被自动销毁,然后调用下面方法
 self.kill()
 #if self.explode_index==5:
 #return
 if self.explode_index!=0:
 new_rect=self.rect
 super.__init__("./images/enemy1_down1.png")
 self.explode_index=self.explode_index+1
 self.rect=new_rect


 def __del__(self):
 # print("敌机挂了%s"% self.rect)
 pass
class Hero(GameSprite):
 """英雄精灵"""
 def __init__(self):
 #1.调用父类方法
 super().__init__("./images/me1.png",0)
 #2.设置英雄的初始位置
 self.rect.centerx=SCREEN_RECT.centerx
 self.rect.bottom=SCREEN_RECT.bottom-120
 #创建子弹精灵组
 self.bullets=pygame.sprite.Group()
 def update(self):
 self.rect.x+=self.speed
 if self.rect.x<0:
 self.rect.x=0
 elif self.rect.right>SCREEN_RECT.right:
 self.rect.right=SCREEN_RECT.right
 def fire(self):
 print("发射子弹...")
 for i in (0,1,2):
 #1.创建精灵组
 bullet=Bullet()
 #2.设置精灵位置
 bullet.rect.bottom=self.rect.y-i*20
 bullet.rect.centerx=self.rect.centerx
 #3.添加到精灵组
 self.bullets.add(bullet)
 def explode(self,screen):
 new_rect=self.rect
 for i in (1,2,3,4):
 super.__init__("./images/me_destroy_2.png")
 self.rect.centerx=new_rect.centerx
 self.rect.centery=new_rect.centery
 screen.blit(self.image,(self.rect.x,self.rect.y))
 pygame.display.update()
class Bullet(GameSprite):
 """子弹精灵"""
 def __init__(self):
 #调用父类方法,设置子弹图片,设置初始速度
 super().__init__("./images/bullet1.png",-2)
 def update(self):
 #让子弹垂直运行
 super().update()
 if self.rect.bottom<0:
 self.kill()
 def __del__(self):
 print("子弹被销毁")

运行结果:

python实现飞机大战小游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用百度翻译进行中翻英示例
Apr 14 Python
跟老齐学Python之类的细节
Oct 13 Python
浅谈python中的数字类型与处理工具
Aug 02 Python
python+splinter实现12306网站刷票并自动购票流程
Sep 25 Python
python如何解析配置文件并应用到项目中
Jun 27 Python
如何基于Python获取图片的物理尺寸
Nov 25 Python
使用Python进行防病毒免杀解析
Dec 13 Python
python时间日期操作方法实例小结
Feb 06 Python
Python中包的用法及安装
Feb 11 Python
详解numpy.ndarray.reshape()函数的参数问题
Oct 13 Python
python复合条件下的字典排序
Dec 18 Python
python定义具名元组实例操作
Feb 28 Python
python 基于dlib库的人脸检测的实现
Nov 08 #Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 #Python
python实现身份证实名认证的方法实例
Nov 08 #Python
Python Django框架模板渲染功能示例
Nov 08 #Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 #Python
Django框架下静态模板的继承操作示例
Nov 08 #Python
python中自带的三个装饰器的实现
Nov 08 #Python
You might like
php读取文件内容的方法汇总
2015/01/24 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
JScript中的undefined和&quot;undefined&quot;的区别
2007/03/08 Javascript
javascript 函数使用说明
2010/04/07 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
深入学习jQuery Validate表单验证
2016/01/18 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
vuejs指令详解
2017/02/07 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
javascript实现5秒倒计时并跳转功能
2019/06/20 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
Python中用format函数格式化字符串的用法
2015/04/08 Python
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
小学教师教学随笔
2015/08/14 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL
MySQL 中如何归档数据的实现方法
2022/03/16 SQL Server
python 判断文件或文件夹是否存在
2022/03/18 Python