项目准备:本项目在pycharm平台实现,需要安装pygame等模块
- 游戏功能:
敌机会从不同位置出现且具有不同的速度,飞机可以发射子弹击毁敌机,飞机触碰到敌机会被击落,游戏结束
- 效果演示
略
- 完整代码
项目主要有两个文件构成,分别是plane_main.py文件和plane_sprites.py文件。
- plane_main.py文件主要用来封装主游戏类、创建游戏对象和启动游戏;
- plane_sprites.py文件主要用来封装游戏中所有需要使用的精灵子类和提供游戏的相关工具。
plane_main.py文件内容
importpygamefromplane_spritesimport*classPlaneGame(object): """飞机大战主游戏"""def__init__(self): print("游戏初始化") #1.创建游戏窗口self.screen=pygame.display.set_mode(SCREEN_RECT.size) #2.创建游戏时钟self.clock=pygame.time.Clock() #3.调用私有方法,完成精灵和精灵组的创建self.__create_sprites() #4.设置定时器事件 ---每隔1S 创建敌机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) defstart_game(self): print("游戏开始") whileTrue: #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): foreventinpygame.event.get(): #判断是否退出游戏ifevent.type==pygame.QUIT: PlaneGame.__game_over() elifevent.type==CREATE_ENEMY_EVENT: print("敌机出场...") #创建敌机精灵enemy=Enemy() #将敌机精灵添加到敌机精灵组self.enemy_group.add(enemy) elifevent.type==HERO_FIRE_EVENT: self.hero.fire() #使用键盘提供的方法获取键盘按键---按键元组keys_pressed=pygame.key.get_pressed() #判断元组中对应的按键索引值ifkeys_pressed[pygame.K_RIGHT]: self.hero.speed=2elifkeys_pressed[pygame.K_LEFT]: self.hero.speed=-2else: self.hero.speed=0def__check_collide(self): #1.子弹摧毁敌机pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True) #2.敌机摧毁英雄enemies=pygame.sprite.spritecollide(self.hero,self.enemy_group,True) #3.判断列表是否有类容iflen(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) def__game_over(): print("游戏结束") pygame.quit() exit() if__name__=='__main__': #创建游戏对象game=PlaneGame() #启动游戏game.start_game()
plane_sprites.py文件内容
importrandomimportpygame#屏幕大小的常量SCREEN_RECT=pygame.Rect(0,0,480,700) #刷新的频率FRAME_PER_SEC=60#创建敌机的定时器常量CREATE_ENEMY_EVENT=pygame.USEREVENT#英雄发射子弹事件HERO_FIRE_EVENT=pygame.USEREVENT+1classGameSprite(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=speeddefupdate(self): #在屏幕垂直方向上移动self.rect.y+=self.speedclassBackground(GameSprite): """游戏背景精灵"""def__init__(self,is_alt=False): #调用父类方法实现精灵的创建super().__init__("./images/background.png") #判断是否有图像交替,若是,则设置初始位置ifis_alt: self.rect.y=-self.rect.heightpassdefupdate(self): #1.调用父类的方法super().update() #2.判断是否移出屏幕,如果移出,将图像设置在屏幕上方ifself.rect.y>=SCREEN_RECT.height: self.rect.y=-self.rect.heightclassEnemy(GameSprite): """敌机精灵"""def__init__(self): #1.调用父类方法,创建敌机精灵,同时指定敌机图片super().__init__("./images/enemy1.png") #2.指定敌机的初始随机速度self.speed=random.randint(1,8) #3.指定敌机的初始随机位置self.rect.bottom=0max_x=SCREEN_RECT.width-self.rect.widthself.rect.x=random.randint(0,max_x) defupdate(self): #1.调用父类方法,保持垂直方向的飞行super().update() #2.判断是否飞出屏幕,如果飞出,则需要从精灵组中删除敌机ifself.rect.y>=SCREEN_RECT.height: print("飞出屏幕") #kill方法可以将精灵从所有精灵组中移出,这时精灵会自动销毁self.kill() def__del__(self): print("敌机挂了 %s"%self.rect) classHero(GameSprite): """英雄精灵"""def__init__(self): #1.调用父类方法,设置image和speedsuper().__init__("./images/me1.png",0) #2.设置英雄初始位置self.rect.centerx=SCREEN_RECT.centerxself.rect.bottom=SCREEN_RECT.bottom-120#3.创建子弹的精灵组self.bullets=pygame.sprite.Group() defupdate(self): #英雄水平移动self.rect.x+=self.speed#控制英雄不飞出屏幕ifself.rect.x<0: self.rect.x=0elifself.rect.right>SCREEN_RECT.right: self.rect.right=SCREEN_RECT.rightdeffire(self): print("发射子弹") foriin (0,1,2): #1.创建子弹精灵bullet=Bullet() #2.设置精灵的位置bullet.rect.bottom=self.rect.y-i*20bullet.rect.centerx=self.rect.centerx#3.将精灵添加到精灵组self.bullets.add(bullet) classBullet(GameSprite): """子弹精灵"""def__init__(self): #调用父类方法,设置子弹图片,设置初始速度super().__init__("./images/bullet2.png",-2) defupdate(self): #调用父类方法,让子弹沿垂直方向飞行super().update() #判断子弹是否飞出屏幕ifself.rect.bottom<0: self.kill() def__del__(self): print("子弹被销毁")
> 注:完整项目源码及图片资源链接如下,需要自取: