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 相关文章推荐
pyqt4教程之实现半透明的天气预报界面示例
Mar 02 Python
python统计字符串中指定字符出现次数的方法
Apr 04 Python
解析Python编程中的包结构
Oct 25 Python
Python操作Redis之设置key的过期时间实例代码
Jan 25 Python
python字典快速保存于读取的方法
Mar 23 Python
python 删除非空文件夹的实例
Apr 26 Python
Python3.8中使用f-strings调试
May 22 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
python pycharm最新版本激活码(永久有效)附python安装教程
Sep 18 Python
Python matplotlib可视化实例解析
Jun 01 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
Jun 15 Python
python 制作一个gui界面的翻译工具
May 14 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
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
JS button按钮实现submit按钮提交效果
2016/11/01 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
详解Nuxt.js 实战集锦
2019/11/19 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
python正则表达式中的括号匹配问题
2014/12/14 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
2018/04/22 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
基于python 凸包问题的解决
2020/04/16 Python
python如何保存文本文件
2020/06/07 Python
HTML5标签与HTML4标签的区别示例介绍
2013/07/18 HTML / CSS
HTML5 UTF-8 中文乱码的解决方法
2013/11/18 HTML / CSS
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
Footshop法国:购买运动鞋
2020/01/19 全球购物
市级三好学生事迹材料
2014/08/27 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python