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 相关文章推荐
python3图片转换二进制存入mysql
Dec 06 Python
Python实现的数据结构与算法之双端队列详解
Apr 22 Python
Anaconda入门使用总结
Apr 05 Python
Python中的单行、多行、中文注释方法
Jul 19 Python
Django框架自定义session处理操作示例
May 27 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
python实现输出一个序列的所有子序列示例
Nov 18 Python
让Django的BooleanField支持字符串形式的输入方式
May 20 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 Python
python实现人性化显示金额数字实例详解
Sep 25 Python
python opencv通过按键采集图片源码
May 20 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 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
php 执行系统命令的方法
2009/07/07 PHP
php date与gmdate的获取日期的区别
2010/02/08 PHP
php文件上传表单摘自drupal的代码
2011/02/15 PHP
PHP session有效期session.gc_maxlifetime
2011/04/20 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
js事件绑定快捷键以ctrl+k为例
2014/09/30 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
微信小程序实现上传图片裁剪图片过程解析
2019/08/22 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
javascript实现时钟动画
2020/12/03 Javascript
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
Python matplotlib模块及柱状图用法解析
2020/08/10 Python
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
工程安全员岗位职责
2014/03/09 职场文书
副处级干部考察材料
2014/05/17 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书