python实现飞机大战小游戏


Posted in Python onNovember 08, 2019

本文实例为大家分享了python实现飞机大战的具体代码,供大家参考,具体内容如下

初学Python,写了一个简单的Python小游戏。

师出bilibili某前辈

pycharm自带了第三方库pygame,安装一下就好了,很方便。

虽然很多大佬已经给出了步骤,我这里还是??乱幌拢?参?俗约汗?桃幌隆?/p>

上图:

python实现飞机大战小游戏

python实现飞机大战小游戏

这里再给出代码的逻辑架构

python实现飞机大战小游戏

plane_main.py

import pygame
from plane_sprites import *

class PlaneGame(object):
 """飞机大战主游戏"""
 def __init__(self):
 print("游戏初始化")
 #1.创建游戏窗口
 self.screen=pygame.display.set_mode(SCREEN_RECT.size)
 #2.创建游戏的时钟
 self.clock=pygame.time.Clock()
 #3.调用私有方法,精灵和精灵组的创建
 self.__creat_sprites()
 #4.设置定时器事件-1s敌机出现
 pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)
 pygame.time.set_timer(HERO_FIRE_EVENT, 500)

 def __creat_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)
 self.enemy_hit_group=pygame.sprite.Group();



 def start_game(self):
 print("游戏开始.....")
 while True:
 #1.设置刷新帧率
 self.clock.tick(FRAME_PER_SEC)

 #2.事件监听
 self.__event_handler()

 #3.碰撞检测
 self.__check_collide()

 #4.更新绘制精灵组
 self.__update_sprites()

 #5.更新显示
 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=3
 elif keys_pressed[pygame.K_LEFT]:
 self.hero.speed = -3
 else:
 self.hero.speed = 0


 def __check_collide(self):
 #1.子弹摧毁敌机
 enemy_hit = pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)

 

 #2.敌机撞毁英雄
 enemies=pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
 if len(enemies)>0:
 #让英雄牺牲
 # self.hero.explode()
 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()

plane_sprites.py

import random
import pygame
#屏幕大小常量
SCREEN_RECT=pygame.Rect(0,0,480,700)
#刷新帧率
FRAME_PER_SEC=60
explode_index=0
#创建定时器常量
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):
 #1.调用父类方法,实现精灵创建(image/rect/speed)
 super().__init__("./images/background.png")
 #2.判断是否是交替图像
 if is_alt:
 self.rect.y = -self.rect.height
 def update(self):
 #1.调用父类方法实现
 super().update()
 #2.判断图像是否移除屏幕,若移除,则设置到屏幕上面
 if self.rect.y>=SCREEN_RECT.height:
 self.rect.y= -self.rect.height

class Enemy(GameSprite):
 """敌机精灵"""

 def __init__(self):
 #1.调用父类方法,创建敌机精灵,指定敌机图片
 super().__init__("./images/enemy1.png")
 #2.指定敌机的初始随机速度1-3
 self.speed=random.randint(1,3)
 #3.指定敌机的初始随机位置
 self.rect.bottom=0
 max_x=SCREEN_RECT.width-self.rect.width
 self.rect.x=random.randint(0,max_x)
 self.explode_index=0
 def update(self):
 #1.调用父类方法,保持垂直方向飞行
 super().update()
 #2.判断是否飞出屏幕,如果是,则删除精灵
 if self.rect.y>=SCREEN_RECT.height:
 #kill方法可以将精灵从精灵组中移出,精灵就会被自动销毁,然后调用下面方法
 self.kill()
 #if self.explode_index==5:
 #return
 if self.explode_index!=0:
 new_rect=self.rect
 super.__init__("./images/enemy1_down1.png")
 self.explode_index=self.explode_index+1
 self.rect=new_rect


 def __del__(self):
 # print("敌机挂了%s"% self.rect)
 pass
class Hero(GameSprite):
 """英雄精灵"""
 def __init__(self):
 #1.调用父类方法
 super().__init__("./images/me1.png",0)
 #2.设置英雄的初始位置
 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):
 #1.创建精灵组
 bullet=Bullet()
 #2.设置精灵位置
 bullet.rect.bottom=self.rect.y-i*20
 bullet.rect.centerx=self.rect.centerx
 #3.添加到精灵组
 self.bullets.add(bullet)
 def explode(self,screen):
 new_rect=self.rect
 for i in (1,2,3,4):
 super.__init__("./images/me_destroy_2.png")
 self.rect.centerx=new_rect.centerx
 self.rect.centery=new_rect.centery
 screen.blit(self.image,(self.rect.x,self.rect.y))
 pygame.display.update()
class Bullet(GameSprite):
 """子弹精灵"""
 def __init__(self):
 #调用父类方法,设置子弹图片,设置初始速度
 super().__init__("./images/bullet1.png",-2)
 def update(self):
 #让子弹垂直运行
 super().update()
 if self.rect.bottom<0:
 self.kill()
 def __del__(self):
 print("子弹被销毁")

运行结果:

python实现飞机大战小游戏

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

Python 相关文章推荐
Python中实现常量(Const)功能
Jan 28 Python
使用Python中的线程进行网络编程的入门教程
Apr 15 Python
python 换位密码算法的实例详解
Jul 19 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
May 07 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
Python交互环境下实现输入代码
Jun 22 Python
python调用c++传递数组的实例
Feb 13 Python
Python中super函数用法实例分析
Mar 18 Python
Python中的字符串切片(截取字符串)的详解
May 15 Python
python 实现rolling和apply函数的向下取值操作
Jun 08 Python
浅析python函数式编程
Sep 26 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 Python
python 基于dlib库的人脸检测的实现
Nov 08 #Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 #Python
python实现身份证实名认证的方法实例
Nov 08 #Python
Python Django框架模板渲染功能示例
Nov 08 #Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 #Python
Django框架下静态模板的继承操作示例
Nov 08 #Python
python中自带的三个装饰器的实现
Nov 08 #Python
You might like
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
php unset全局变量运用问题的深入解析
2013/06/17 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
smarty实现多级分类的方法
2014/12/05 PHP
php实现文本数据导入SQL SERVER
2015/05/17 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
ES6中的类(Class)示例详解
2020/12/09 Javascript
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
python实现画一颗树和一片森林
2018/06/25 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
django的csrf实现过程详解
2019/07/26 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
Python timeit模块原理及使用方法
2020/10/10 Python
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
Html5定位终极解决方案
2020/02/05 HTML / CSS
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
医学护理系毕业生求职信
2013/10/01 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
部门2015年度工作总结
2015/04/29 职场文书
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis