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 相关文章推荐
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
分享几道你可能遇到的python面试题
Jul 24 Python
Django基于ORM操作数据库的方法详解
Mar 27 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
浅谈python3.x pool.map()方法的实质
Jan 16 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
详解Python:面向对象编程
Apr 10 Python
django 自定义filter 判断if var in list的例子
Aug 20 Python
python 循环数据赋值实例
Dec 02 Python
Python使用pycharm导入pymysql教程
Sep 16 Python
python 日志模块logging的使用场景及示例
Jan 04 Python
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
Apr 13 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
JAVA/JSP学习系列之二
2006/10/09 PHP
div li的多行多列 无刷新分页示例代码
2013/10/16 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
Extjs学习笔记之六 面版
2010/01/08 Javascript
js 幻灯片的实现
2011/12/06 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
2018/01/05 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
Django框架用户注销功能实现方法分析
2019/05/28 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
上海方立数码笔试题
2013/10/18 面试题
一套C++笔试题面试题
2012/06/06 面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
学习自我鉴定
2014/02/01 职场文书
关于中国梦的演讲稿
2014/04/23 职场文书
团干部培训方案
2014/06/03 职场文书
四川省传达学习贯彻党的群众路线教育实践活动总结大会精神新闻稿
2014/10/26 职场文书
2014年派出所工作总结
2014/11/21 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
培训简讯范文
2015/07/20 职场文书
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL