Python3实现飞机大战游戏


Posted in Python onApril 24, 2020

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

1、主程序: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.__create_sprites()
 
 #设置定时器事件 - 创建敌机1s
 pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)
 pygame.time.set_timer(HERO_FIRE_EVENT,500)
 
 def __create_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)
 
 
 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("向右移动....")
 
 #使用键盘提供的方法获取键盘按键 - 按键元组
 key_perssed = pygame.key.get_pressed()
 #判断元组中对应的按键索引值
 if key_perssed[pygame.K_RIGHT]:
  self.hero.speed = 2
 elif key_perssed[pygame.K_LEFT]:
  self.hero.speed = -2
 else:
  self.hero.speed = 0
 
 def __check_collide(self):
 #1.子弹摧毁敌机
 pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True)
 #2.敌机撞毁英雄
 enemys = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
 #3.判断列表是否有内容
 if len(enemys) > 0:
  #让英雄牺牲
  self.hero.kill()
  #结束游戏
  self.__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()

2.游戏精灵:plane_sprites.py

import random
import pygame
 
#屏幕大小的常量
SCREEN_RECT = pygame.Rect(0,0,480,700)
#刷新的帧率
FRAME_PER_SEC = 60
#创建敌机的定时器常量
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)
 image_name = "./images/background.png"
 super().__init__(image_name)
 
 #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.设置敌机的随机初始速度
 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)
 
 def update(self):
 
 #1.调用父类方法,让敌机在垂直方向上运动
 super().update()
 
 #2.调用是否飞出屏幕,如果是,需要将敌机从精灵组删除
 if self.rect.y >= SCREEN_RECT.height:
  print("敌机飞出屏幕...")
 
  #kill方法将精灵从所有精灵组中移出
  self.kill()
 
 def __del__(self):
 pass
 # print("敌机挂了 %s" % self.rect)
 
 
class Hero(GameSprite):
 """英雄精灵"""
 
 def __init__(self):
 
 #1.调用父类方法,设置image/speed
 super().__init__("./images/me1.png",0)
 #2.设置英雄的初始位置
 self.rect.centerx = SCREEN_RECT.centerx
 self.rect.bottom = SCREEN_RECT.bottom - 120
 #3.创建子弹的精灵组
 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 (1,2,3):
  #1.创建子弹精灵
  bullet = Bullet()
  #2.设置精灵的位置
  bullet.rect.centerx = self.rect.centerx
  bullet.rect.bottom = self.rect.y - i*20
  #3.将精灵添加到精灵组
  self.bullets.add(bullet)
 
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):
 pass
 # print("子弹被销毁...")

3、结果截图:

Python3实现飞机大战游戏

附:飞机大战的资源图片

更多有趣的经典小游戏实现专题,分享给大家:

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

Python 相关文章推荐
python使用itchat库实现微信机器人(好友聊天、群聊天)
Jan 04 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
Mar 05 Python
python排序函数sort()与sorted()的区别
Sep 18 Python
Python进度条的制作代码实例
Aug 31 Python
Pyqt5自适应布局实例
Dec 13 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
Dec 18 Python
pytorch GAN伪造手写体mnist数据集方式
Jan 10 Python
Python稀疏矩阵及参数保存代码实现
Apr 18 Python
Python实现密钥密码(加解密)实例详解
Apr 26 Python
零基础小白多久能学会python
Jun 22 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
Python 列表推导式需要注意的地方
Oct 23 Python
python实现飞船游戏的纵向移动
Apr 24 #Python
python实现俄罗斯方块小游戏
Apr 24 #Python
iPython pylab模式启动方式
Apr 24 #Python
python实现扫雷小游戏
Apr 24 #Python
jupyter 使用Pillow包显示图像时inline显示方式
Apr 24 #Python
pyspark 随机森林的实现
Apr 24 #Python
Jupyter打开图形界面并画出正弦函数图像实例
Apr 24 #Python
You might like
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
jQuery 学习 几种常用方法
2009/06/11 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
jQuery实现表格颜色交替显示的方法
2015/03/09 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
js和jquery中获取非行间样式
2017/05/05 jQuery
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
2018/09/21 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
python中的测试框架
2020/11/13 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
机械制造专业毕业生求职信
2014/03/02 职场文书
食品安全标语
2014/06/07 职场文书
应届毕业生求职信范文
2014/07/07 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
工伤事故证明
2014/10/20 职场文书
普通党员整改措施
2014/10/24 职场文书
工作检讨书范文
2015/01/23 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书