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 fileinput模块使用实例
May 28 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
django框架创建应用操作示例
Sep 26 Python
Python中的四种交换数值的方法解析
Nov 18 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
Dec 12 Python
详解django中Template语言
Feb 22 Python
Pyspark读取parquet数据过程解析
Mar 27 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
Dec 10 Python
python实现控制台输出颜色
Mar 02 Python
Python如何使用logging为Flask增加logid
Mar 30 Python
pytorch 中nn.Dropout的使用说明
May 20 Python
python库Tsmoothie模块数据平滑化异常点抓取
Jun 10 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
东方红 - 来复式再生机的修复
2021/03/02 无线电
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
中篇:安装及配置PHP
2006/12/13 PHP
ASP和PHP都是可以删除自身的
2007/04/09 PHP
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
PHP 正则表达式小结
2015/02/12 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
Angular动态添加、删除输入框并计算值实例代码
2017/03/29 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
pace.js和NProgress.js两个加载进度插件的一点小总结
2018/01/31 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
2019/03/06 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
javascript实现日历效果
2019/06/17 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
Python调用C语言程序方法解析
2020/07/07 Python
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
幼儿教师工作感言
2014/02/14 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
2015大一新生军训感言
2015/08/01 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电