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使用requests发送POST请求实例代码
Jan 25 Python
Python文本统计功能之西游记用字统计操作示例
May 07 Python
python如何求解两数的最大公约数
Sep 27 Python
关于Python作用域自学总结
Jun 10 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
关于Python3 lambda函数的深入浅出
Nov 27 Python
PyCharm 2019.3发布增加了新功能一览
Dec 08 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
May 10 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
Jun 10 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 Python
Django 用户认证Auth组件的使用
Nov 30 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
VFP与其他应用程序的集成
2006/10/09 PHP
第二节--PHP5 的对象模型
2006/11/16 PHP
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
基于jquery异步传输json数据格式实例代码
2013/11/23 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
手机端页面rem宽度自适应脚本
2015/05/20 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
详解duck typing鸭子类型程序设计与Python的实现示例
2016/06/03 Python
简单实现python聊天程序
2018/04/01 Python
python3 requests中使用ip代理池随机生成ip的实例
2018/05/07 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
用CSS3的box-reflect设置文字倒影效果的方法讲解
2016/03/07 HTML / CSS
校领导推荐信
2013/11/01 职场文书
咖啡蛋糕店创业计划书
2014/01/28 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫
集英社今正式宣布 成立游戏公司“集英社Games”
2022/03/31 其他游戏