python实现飞机大战游戏


Posted in Python onOctober 26, 2020

飞机大战(Python)代码分为两个python文件,工具类和主类,需要安装pygame模块,能完美运行(网上好多不完整的,调试得心累。实现出来,成就感还是满满的),如图所示:

python实现飞机大战游戏

完整代码如下:

1.工具类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):
 super().__init__("C:/Users/Administrator/Desktop/background.png")# 1. 调用父类方法实现精灵的创建(image/rect/speed)
 if is_alt:# 2. 判断是否是交替图像,如果是,需要设置初始位置
 self.rect.y = -self.rect.height
 def update(self):
 super().update()# 1. 调用父类的方法实现
 if self.rect.y >= SCREEN_RECT.height:# 2. 判断是否移出屏幕,如果移出屏幕,将图像设置到屏幕的上方
 self.rect.y = -self.rect.height
class Enemy(GameSprite):
 """敌机精灵"""
 def __init__(self):
 super().__init__("C:/Users/Administrator/Desktop/enemy1.png")# 1. 调用父类方法,创建敌机精灵,同时指定敌机图片
 self.speed = random.randint(1, 3)# 2. 指定敌机的初始随机速度 1 ~ 3
 self.rect.bottom = 0# 3. 指定敌机的初始随机位置
 max_x = SCREEN_RECT.width - self.rect.width
 self.rect.x = random.randint(0, max_x)
 def update(self):
 super().update()# 1. 调用父类方法,保持垂直方向的飞行
 # 2. 判断是否飞出屏幕,如果是,需要从精灵组删除敌机
 if self.rect.y >= SCREEN_RECT.height:
 self.kill()
 # print("飞出屏幕,需要从精灵组删除...")
 # kill方法可以将精灵从所有精灵组中移出,精灵就会被自动销毁

 def __del__(self):
 # print("敌机挂了 %s" % self.rect)
 pass
class Hero(GameSprite):
 """英雄精灵"""
 def __init__(self):
 super().__init__("C:/Users/Administrator/Desktop/me1.png", 0)
 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):
 bullet = Bullet()
 bullet.rect.bottom = self.rect.y - i * 20
 bullet.rect.centerx = self.rect.centerx
 self.bullets.add(bullet)
class Bullet(GameSprite):
 """子弹精灵"""
 def __init__(self):
 super().__init__("C:/Users/Administrator/Desktop/bullet1.png", -2)
 def update(self):
 super().update()
 if self.rect.bottom < 0:
 self.kill()
 def __del__(self):
 print("子弹被销毁...")

2.主类plane_main.py

import pygame
from plane_sprites import *
class PlaneGame(object):
 """飞机大战主游戏"""
 def __init__(self):
 print("游戏初始化")
 self.screen = pygame.display.set_mode(SCREEN_RECT.size)
 self.clock = pygame.time.Clock()
 self.__create_sprites()
 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:
 self.clock.tick(FRAME_PER_SEC)
 self.__event_handler()
 self.__check_collide()
 self.__update_sprites()
 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 = 2
 elif keys_pressed[pygame.K_LEFT]:
 self.hero.speed = -2
 else:
 self.hero.speed = 0
 def __check_collide(self):
 for event in pygame.event.get():
 if event.type == pygame.QUIT:
 PlaneGame.__game_over()
 elif event.type == CREATE_ENEMY_EVENT:
 enemy = Enemy()
 self.enemy_group.add(enemy)
 elif event.type == HERO_FIRE_EVENT:
 self.hero.fire()
 keys_pressed = pygame.key.get_pressed()
 if keys_pressed[pygame.K_RIGHT]:
 self.hero.speed = 2
 elif keys_pressed[pygame.K_LEFT]:
 self.hero.speed = -2
 else:
 self.hero.speed = 0
 def __check_collide(self):
 pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)
 enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)
 if len(enemies) > 0:
 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()

更多关于python游戏的精彩文章请点击查看以下专题:

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

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

Python 相关文章推荐
Python中optparse模块使用浅析
Jan 01 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
python timestamp和datetime之间转换详解
Dec 11 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
python爬取微信公众号文章
Aug 31 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
对python_discover方法遍历所有执行的用例详解
Feb 13 Python
python实现QQ空间自动点赞功能
Apr 09 Python
Jupyter notebook如何修改平台字体
May 13 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 #Python
Python supervisor强大的进程管理工具的使用
Apr 24 #Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 #Python
Python3.5面向对象编程图文与实例详解
Apr 24 #Python
Python对ElasticSearch获取数据及操作
Apr 24 #Python
Python3.5面向对象与继承图文实例详解
Apr 24 #Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 #Python
You might like
xajax写的留言本
2006/11/25 PHP
使用PHP批量生成随机用户名
2008/07/10 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
php上传excel表格并获取数据
2017/04/27 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
javascript实现倒计时关闭广告
2021/02/09 Javascript
python开发之文件操作用法实例
2015/11/13 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
python 重命名轴索引的方法
2018/11/10 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
python实现视频压缩功能
2020/12/18 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
潘多拉珠宝英国官方网上商店:PANDORA英国
2018/06/12 全球购物
构造器Constructor是否可被override?
2013/08/06 面试题
拉丁舞学习者的自我评价
2013/10/27 职场文书
应届医学毕业生求职信分享
2013/12/02 职场文书
高中毕业自我鉴定
2013/12/16 职场文书
小学毕业感言50字
2014/02/16 职场文书
库房保管员岗位职责
2014/04/07 职场文书
2014年感恩母亲演讲稿
2014/05/27 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
2019新员工心得体会
2019/06/25 职场文书
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
四十九个javascript小知识实用技巧
2021/11/20 Javascript
python lambda 表达式形式分析
2022/04/03 Python