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实现划词翻译
Apr 23 Python
Python的一些用法分享
Oct 07 Python
使用python搭建Django应用程序步骤及版本冲突问题解决
Nov 19 Python
python小技巧之批量抓取美女图片
Jun 06 Python
wxPython窗口中文乱码解决方法
Oct 11 Python
Python 的类、继承和多态详解
Jul 16 Python
Python合并同一个文件夹下所有PDF文件的方法
Mar 11 Python
python DataFrame转dict字典过程详解
Dec 26 Python
python语言的优势是什么
Jun 17 Python
Django如何在不停机的情况下创建索引
Aug 02 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 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
php编写一个简单的路由类
2011/04/13 PHP
PHP Cookie的使用教程详解
2013/06/03 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
javascript 面向对象思想 附源码
2009/07/07 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
基于jQuery的360图片展示实现代码
2012/06/14 Javascript
Javascript中自动切换焦点实现代码
2012/12/15 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
实例分析javascript中的call()和apply()方法
2014/11/28 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
浅谈JavaScript中的对象及Promise对象的实现
2015/11/15 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
Django权限设置及验证方式
2020/05/13 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
剪枝的学问教学反思
2014/02/07 职场文书
物流专业自荐信
2014/05/23 职场文书
找工作求职信
2014/07/07 职场文书
土地租赁意向书
2014/07/30 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python
Java使用HttpClient实现文件下载
2022/08/14 Java/Android