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实现apahce网站日志分析示例
Apr 02 Python
详解python如何调用C/C++底层库与互相传值
Aug 10 Python
Python切片索引用法示例
May 15 Python
Python爬虫之urllib基础用法教程
Oct 12 Python
Python3的unicode编码转换成中文的问题及解决方案
Dec 10 Python
Python字典底层实现原理详解
Dec 18 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
Jun 03 Python
Python SMTP配置参数并发送邮件
Jun 16 Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 Python
python入门:argparse浅析 nargs='+'作用
Jul 12 Python
Python实现将多张图片合成MP4视频并加入背景音乐
Apr 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脚本数据库功能详解(上)
2006/10/09 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
jquery实现勾选复选框触发事件给input赋值
2015/02/01 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
微信小程序中如何使用flyio封装网络请求
2019/07/03 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
分享python数据统计的一些小技巧
2016/07/21 Python
浅谈Python中带_的变量或函数命名
2017/12/04 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
Canvas实现保存图片到本地的示例代码
2018/06/28 HTML / CSS
Move Free官方海外旗舰店:美国骨关节健康专业品牌
2017/12/06 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
精选奢华:THE LIST
2019/09/05 全球购物
幼师自我鉴定范文
2013/10/01 职场文书
教师自我评价范文
2013/12/16 职场文书
如何客观的进行自我评价
2013/12/17 职场文书
车辆安全检查制度
2014/01/12 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
2014大学班主任工作总结
2014/11/08 职场文书
辞职信怎么写
2015/02/27 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
python元组打包和解包过程详解
2021/08/02 Python
浅谈Redis缓冲区机制
2022/06/05 Redis
Java使用HttpClient实现文件下载
2022/08/14 Java/Android