飞机大战(python)

  • 项目目标
  • 项目流程
    • 主程序
    • 精灵组
    • 基本事件函数
    • 奖励机制
  • 总结

项目目标

重点如下:1.熟练掌握对类的使用(比如,在pygame中主要分成两种类别:
英雄类,精灵类)
2.对调用的模块pygame具有一定了解

最基本的创建思路可以划分成两个模块:
一个封装基本的操作,调用主程序
另一个存储基本精灵类

项目流程

主程序

首先介绍主程序
基本事件的定义
我们导入精灵组模块plane2的所有内容
初始化pygame

from plane2 import *
pygame.init()
class PlaneGame(object):"""飞机大战"""def __init__(self):print("游戏初始化")#1.游戏窗口self.screen = pygame.display.set_mode(SCREEN_RECT.size)#加上size属性 就是一个元组#定义常量 通过 大写字母赋值#2.创建游戏时钟self.clock = pygame.time.Clock()#3.调用私有方法,创建精灵组self.__create_sprites()#4.创建定时器事件,创建敌机pygame.time.set_timer(CREATE_ENEMY_EVENT, 100)pygame.time.set_timer(HERO_FIRE_EVENT, 50)

精灵组

在最开始的时候,我们定义初始函数,写入基本属性,定义以下方法:
游戏窗口,游戏时钟,精灵组和定时器事件
首先创建一个Σ(っ °Д °;)っ背景精灵组
我们定义两张图片,令它们上下拼接,以定义的speed滑动,就可以实现飞机的视觉移动。

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)

基本事件函数

设定一个游戏基本事件函数

  • 实现以下功能
    刷新帧率, 事件监听, 碰撞检测, 更新绘制精灵组, 更新显示
    a.对于所谓的帧率,其实就是简单的图像覆盖,我们设置60帧,也就是说这些图片以60张每秒的speed映入我们的眼中,达到了连环画的效果。
    b.子弹和敌机接触导致敌机毁灭,就需要定义一个碰撞检测,pygame中定义了一个事件监听,可以读取到使用者的指令信息
    def start_game(self):print("游戏开始...")while True:#刷新帧率, 事件监听, 碰撞检测, 更新绘制精灵组, 更新显示 self.clock.tick(FRAME_PRE_SEC)self.__event_handler()self.__check_collide()self.__update_sprites()pygame.display.update()passdef __event_handler(self):for event in pygame.event.get():#判断是否退出游戏if event.type == pygame.QUIT:PlaneGame.__game_over()elif event.type == CREATE_ENEMY_EVENT:print("敌机 appering")#创建敌机精灵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_d]:self.hero.speed = 10elif keys_pressed[pygame.K_a]:self.hero.speed = -10    else:self.hero.speed = 0if keys_pressed[pygame.K_s]:self.hero.speed2 = 10elif keys_pressed[pygame.K_w]:self.hero.speed2 = -10else:self.hero.speed2 = 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)#judage if context in listif 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)
# import sys
# btn3 = Button(root, text='退出', command=sys.exit)@staticmethod #静态方法修饰器 def __game_over():#静态方法 不需要对象属性或者类的属性print("游戏结束")pygame.quit()exit()
if __name__ == '__main__':#创建游戏对象game = PlaneGame()game.start_game()#启动游戏

接下来是精灵组模块:``

 class GameSprite(pygame.sprite.Sprite):def __init__(self, image_name, speed=2):#调用父类的初始化方法 super().__init__()#属性self.image = pygame.image.load(image_name)self.rect = self.image.get_rect()#get_rect()默认返回(0, 0, 长, 宽) self.speed = speeddef update(self):#屏幕的垂直方向移动self.rect.y += self.speed
class Background(GameSprite):def __init__(self, is_alt=False):#父类方法实现精灵的创建#判断是否是交替图像super().__init__("./images/space star.jpg")if is_alt:self.rect.y = -self.rect.heightdef update(self):#调用父类的方法实现背景滑动super().update()#移出屏幕 设置到屏幕上方if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.heightpass

创建敌机的默认过程:
调用父类方法,创建敌机精灵,指定敌机图片

class Enemy(GameSprite):def __init__(self):#调用父类方法,创建敌机精灵,指定敌机图片super().__init__("./images/enemy1.png")#敌机初始速度self.speed = random.randint(1, 30)#敌机初始位置self.rect.bottom = 0max_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0, max_x)def update(self):#调用父类方法。保持垂直方向飞行super().update()#判断是否飞出屏幕,从精灵组中删除敌机,释放内存if self.rect.y >= SCREEN_RECT.height:print("飞出屏幕,删除敌机")# kill方法可以将精灵从所有精灵组中移出,使其自动销毁self.kill()
        用完的子弹和飞机需要移除,来释放空间
    def __del__(self):print("enemy has been destoried %s" % self.rect)
class Hero(GameSprite):def __init__(self):#调用父类方法,设置位置和速度,初始位置super().__init__("./images/me1.png", 0)self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 100self.bullets = pygame.sprite.Group()def update(self):self.rect.x += self.speedself.rect.y += self.speed2if self.rect.x < 0:self.rect.x = 0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.rightdef fire(self):for i in range(5):# for v in range(2):bullet = Bullet()bullet.rect.bottom = self.rect.y - i * 20bullet.rect.centerx = self.rect.centerxself.bullets.add(bullet)
class Bullet(GameSprite):def __init__(self):#调用父类方法,设置子弹图片,设置初始速度super().__init__("./images/bullet1.png", -20)def update(self):#调用父类方法,让子弹垂直飞行super().update()#judage bullet out of screenif self.rect.bottom < 0:self.kill()def __del__(self):print("bullet has been destroy")

总结

飞机大战和坦克大战很相像,下一步,可以动手,设计一个用python实现坦克大战的小游戏。
这个博客写的非常好,推荐:飞机大战精品

飞机大战(python)相关推荐

  1. 飞机大战Python全代码 + 图片

    1.主要是参考<Python编程从入门到实践>作者:Eric Matthes这本书. 2.我大约敲了两天,看到小游戏可以run时,有一点点小成就感. 3.主要是想学习一下python. 4 ...

  2. 飞机大战python小游戏

    python飞机大战 #导入模块 import pygame import random from pygame.locals import * from os import path #获取图片库和 ...

  3. 飞机大战--python基础项目(附源码和原理讲解)

    声明 此项目是对python基础语法和高级语法的结合,学完python基础和高级可以拿此项目练手,说的比较细,涵盖了pygame一些知识点的讲解. 项目展示 安装准备 这里我们要用到pygame模块, ...

  4. python写飞机大战什么水平_飞机大战python

    给大家整理的这套python学习路线图,按照此教程来一步步的学习,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...

  5. 飞机大战python介绍_用 Python 写一个经典飞机大战

    while running: # 设置游戏帧率为 60 clock.tick(60) if not is_pause and not is_game_over: if not player.is_hi ...

  6. 飞机大战python代码_飞机大战Python程序

    import pygame from plane_sprites import * class PlaneGame( object ): # 初始化 开始游戏类方法 启动游戏 def __init__ ...

  7. 《Python游戏趣味编程》 第7章 飞机大战

    7 飞机大战 Python游戏开发 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了 本章我们将编写一个飞机大战的游戏,鼠标控制飞机移动.按下鼠标发射子弹,效果如图7-1 ...

  8. python做飞机大战游戏_python实现飞机大战游戏

    飞机大战(Python)代码分为两个python文件,工具类和主类,需要安装pygame模块,能完美运行(网上好多不完整的,调试得心累.实现出来,成就感还是满满的),如图所示: 完整代码如下: 1.工 ...

  9. 《零基础入门学习Python》第094讲:Pygame:飞机大战5

    我们接下来在游戏界面的左上角设置一个得分显示区域,实时显示玩家得分,我们的规则如下: 击落小中大敌机分别可以获得1000,6000,10000分. 我们现在main 函数中添加一个 score 变量统 ...

  10. 《零基础入门学习Python》第095讲:Pygame:飞机大战6

    今天继续飞机大战的开发,游戏每30秒就随机下放一个补给包,可能是超级子弹或者全屏炸弹. 补给包有自己的图片(如下图),也有自己的运行轨迹(由上而下) 因此,我们可以单独写一个模块来实现:命名为 sup ...

最新文章

  1. python个人博客搭建说明书_技术分享|利用Python Django一步步搭建个人博客(二)...
  2. 正则表达式 学习笔记5.3
  3. js实现-限时抢购倒计时间表
  4. 关于addr=u32(r.recvuntil(‘\xf7‘)[-4:])的解释
  5. SharePoint 2013 术语和术语集介绍
  6. python-matplotlib
  7. Leetcode_最后一个单词的长度
  8. Nginx的功能特性及常用功能
  9. 21个令程序员泪流满面的瞬间【第二弹】
  10. Python爬虫自学之第(①)篇——爬虫伪装和反“反爬”
  11. Spring Cloud云架构 - commonservice-sso服务搭建(一)
  12. new java.util.date_java.util.Date的替代品
  13. [论文阅读] Nearest Neighbor Classifier Embedded Network for Active Learning
  14. 考研 英语一 大作文-图画作文 (二)---第二段写作攻略
  15. 高斯光束matlab 仿真,高斯光束的matlab仿真.docx
  16. android 实现男女按钮选择
  17. printf二进制数据
  18. 软件加壳的简易实现方式
  19. linux下载blast软件
  20. C语言——一元多项式定义求和 [单链表] (数据结构)

热门文章

  1. 计算机考研方向总结,计算机研究生自我鉴定
  2. ERROR: Cannot determine archive format of /tmp/pip-req-build-pi0rx8q
  3. RS485工业级超高频读卡器|读写器|读写头CK-UR08-A01和PLC组网及多机通信接线图使用说明
  4. 商务部:2017中国国际货运代理行业发展报告 (附下载)
  5. mysql keyring file_详解MySQL 整表加密解决方案 keyring_file
  6. Java BiConsumer源码总结 BiConsumer接口注释翻译和解析中英文对照版
  7. 数据仓库简介-ODS、DW和DM概念区分
  8. Latex之使用algorithm2e包来写算法
  9. 网络共享虚拟硬盘 :iscsi
  10. 业主委员会如何成立?让捷径智慧物业改变美好生活