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端口扫描系统实现方法
Nov 19 Python
收集的几个Python小技巧分享
Nov 22 Python
深入浅析python继承问题
May 29 Python
老生常谈python函数参数的区别(必看篇)
May 29 Python
Python2.7读取PDF文件的方法示例
Jul 13 Python
关于Python如何避免循环导入问题详解
Sep 14 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
Mar 19 Python
如何通过命令行进入python
Jul 06 Python
python 基于PYMYSQL使用MYSQL数据库
Dec 24 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
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
桌面中心(三)修改数据库
2006/10/09 PHP
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
PHP 引用是个坏习惯
2010/03/12 PHP
hadoop中一些常用的命令介绍
2013/06/19 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
php查询whois信息的方法
2015/06/08 PHP
在PHP程序中使用Rust扩展的方法
2015/07/03 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
JQuery在页面中添加和除移DOM示例代码
2013/06/24 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
如何理解Vue的v-model指令的使用方法
2018/07/19 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
Python实现八大排序算法
2016/08/13 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
工作疏忽检讨书
2014/01/25 职场文书
初一家长会邀请函
2014/01/31 职场文书
优秀技术工人先进材料
2014/02/17 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
泰山导游词
2015/02/02 职场文书
党员转正介绍人意见
2015/06/03 职场文书