微信小程序> python.pygame的飞机大战小程序

python.pygame的飞机大战小程序

浏览量:473 时间: 来源:ikun_up

目前python正在自学中,这个飞机大战小游戏是自学一点点做的,目前还不完整,没有将分数系统加入,因为还在学习,还缺少PLAY按钮,所以学习仍然继续。

飞机游戏是根据python的pygame的模块来设计的,import pygame利用了pygame的大量类和模块,在使用pygame之前,先对pygame进行初始化init().
创建游戏窗口:pygame.display.set_mod(height,width)。(在创建窗口大小是,要写入参数,我建议不要直接将数字大小直接写入,因为避免以后改写屏幕大小时不方便改写我们可以这样写:在准备模块中定义一个常量:SCREEN_RECT=(0,0,100,200),然后在main函数中调用pygame.display.set_mod(SCREEN_RECT.size)来创建窗口。
窗口标题:pygame.display.set_caption(CAPTION),同样利用常量来传递,CAPTION=“飞机游戏大战“。
游戏时钟:pygame.time.Clock.tick(CLOCK_TICK),同样利用常量传递,CLOCK_TICK=60。
定时器:pygame.time.set_timer(eventid,milliseconds),第一个参数eventid,表示事件的id,是基于pygame.USEREVENT来指定的;第二个参数是单位毫秒,例如定义1000时,便是1秒出现一次。在定义第一个参数时,我们同样使用常量传递到主函数,由于会在创作敌机和发射子弹时使用到两个定时器,所以定义两个定时器:
敌机:CREAT_ENEMY_EVENT = pygame.USEREVENT
子弹:HERO_FIRE_EVENT = pygame.USEREVENT + 1,在主函数中使用pygame.time.set_timer(CREAT_ENEMY_EVENT,1000)  ,pygame.time.set_timer(HERO_FIRE_EVENT,500)来调用定时器。
鼠标:调用pygame.mouse.set_visible(0)函数使鼠标在游戏界面时消失。
精灵:继承pygame.sprite.Sprite创建一个游戏精灵类,在初始化方法里使用self.image=pygame.image.load(image_name)对精灵图片进行加载,使用self.rect=self.image.get_rect()对位置进行获取。然后英雄飞机类,敌机类,子弹类,游戏背景类,都需要继承这个游戏精灵类来进行创建。在游戏精灵类中,还要定义update()方法进行刷新。
精灵组:pygame.sprite.Group()创建精灵组的类,调用update()方法时会自动调用精灵各自的update()方法。四个精灵组:1,self.hero=pygame.sprite.Group() 2,self.bullets=pygame.sprite.Group() 3,self.background=pygame.sprite.Group() 4,self.enemy=pygame.sprite.Group().为了使精灵能够出现在游戏窗口上,必须对每个精灵进行刷新,也就是精灵组的update()方法和draw()方法.
self.background.update()
self.background.draw(self.screen)
self.ene my.update()
self.enemy.draw(self.screen)
self.hero.update()
self.hero.draw(self.screen)
self.hero.bullets.update()
self.hero.bullets.draw(self.screen),其中,draw方法返回surface。
事件监听:pygame.event.get()返回一个列表,可以对获取的事件进行遍历。如果event.typeCREAT_ENEMY_EVENT,便创建一个敌机并且搁1秒创建一个;event.typeHERO_FIRE_EVENT,便创建一个子弹并且搁0.5秒等等。。
键盘模块:pygame.key.get_pressed(),这个模块主要使获取键盘的所有按键,并且返回元组,keys_pressed=pygame.key.get_pressed(),如果元组中存在按键操作,就为1,例如if keys_pressed[pygame.K_RIGHT]:
print(“向右移动”)
碰撞检测:利用pygame提供的pygame.sprite.groupcollide(group1,group2,dokill1,dokill2)模块对两个精灵组进行碰撞检测,dokill1和dokill2如果为真,则都进行消除。利用pygame.sprite.spritecollide(sprite,group,dokillgroup)模块对精灵和精灵组进行碰撞检测,其模块返回一个列表,如果列表内有长度,则表示发生碰撞,那么使dokill为真,便消除group,在增加一个判断条件,使sprite也消除,一旦英雄飞机sprite消除,整个游戏就结束,调用exit()使程序终结,在终结之前,要对pygame进行quit().

部分代码如下:

精灵类

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__("./images/background.png", speed=2)        if is_alt:            self.rect.y = -self.rect.height    def update(self):        self.rect.y += self.speed        if self.rect.y >= SCREEN_RECT.height:            self.rect.y = -self.rect.height

敌机类

class Enemy(GameSprite):    def __init__(self):        super().__init__("./images/enemy1.png")        self.speed = random.randint(1, 3)        self.rect.y = -self.rect.height        _x = SCREEN_RECT.width-self.rect.width        self.rect.x = random.randint(0, _x)    def update(self):        super().update()        if self.rect.y >= SCREEN_RECT.height + self.rect.height:            self.kill()

子弹类

class Bullet(GameSprite):    def __init__(self):        super().__init__("./images/bullet1.png", speed=-3.5)    def update(self):        super().update()        if self.rect.bottom < 0:            self.kill()    def __del__(self):        pass

英雄飞机类

class Myhero(GameSprite):    def __init__(self):        super().__init__("./images/me1.png", speed=0)        self.rect.centerx = SCREEN_RECT.centerx        self.rect.bottom = SCREEN_RECT.bottom - 120        self.bullets = pygame.sprite.Group()    def move(self, x, y):        self.rect.x += x        self.rect.y += y        if self.rect.left < SCREEN_RECT.left:            self.rect.left = SCREEN_RECT.left        elif self.rect.right > SCREEN_RECT.right:            self.rect.right = SCREEN_RECT.right        elif self.rect.top < SCREEN_RECT.top:            self.rect.top = SCREEN_RECT.top        elif self.rect.bottom > SCREEN_RECT.bottom:            self.rect.bottom = SCREEN_RECT.bottom    def fire(self):        for i in [1, 2, 3]:            bullet = Bullet()            bullet1 = Bullet()            bullet2 = Bullet()            bullet2.rect.bottom = self.rect.y - i * 20            bullet1.rect.bottom = self.rect.y - i * 20            bullet.rect.bottom = self.rect.y - i * 20            bullet.rect.centerx = self.rect.centerx            bullet1.rect.centerx = self.rect.centerx - 20            bullet2.rect.centerx = self.rect.centerx + 20            self.bullets.add(bullet, bullet1, bullet2)    def update(self):        pass

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎