微信5.0发布时,首页设置为新上线的小游戏,即微信版的飞机大战。被很多人喜欢。我最近重新审视了这个小游戏。虽然时隔多年,但游戏的画质和画风放在今天依然落伍。在这篇文章中,我们使用Python来实现这个小游戏。游戏的实现主要使用了第三方模块pygame,可以使用pipinstallpygame进行安装。环境操作系统:WindowsPython版本:3.6涉及模块:pygame、sys、random飞机大战的组成比较简单,主要包括:主界面、玩家、敌人、子弹、记分牌等。具体来看看执行。首先我们画一个主界面,主要实现代码如下:#设置屏幕宽度SCREEN_WIDTH=450#设置屏幕高度SCREEN_HEIGHT=600#初始化窗口pygame.init()#设置窗口标题pygame.display.set_caption("AirplaneWars")#设置屏幕大小screen=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT),0,32)#隐藏光标pygame.mouse.set_visible(False)#设置背景bg=pygame.image.load("resources/image/bg.png")#绘制屏幕screen.fill(0)#添加背景图片screen.blit(bg,(0,0))#设置图片gameoverbg_game_over=pygame.image.load("resources/image/bg_game_over.png")#加载飞机资源图片img_plane=pygame.image.load("resources/image/shoot.png")img_start=pygame.image.load("resources/image/start.png")img_pause=pygame.image.load("resources/image/pause.png")img_icon=pygame.image.load("resources/image/plane.png").convert_alpha()#顺便设置窗口pygame.display.set_icon(img_icon)#初始化positionplayer_pos=[200,450]看看效果:接下来我们来定义播放器的属性和方法。主要实现代码如下:classPlayer(pygame.sprite.Sprite):def__init__(self,img,rect,pos):pygame.sprite.Sprite.__init__(self)self.image=[]#部分飞机形象Separationforiinrange(len(rect)):self.image.append(img.subsurface(rect[i]).convert_alpha())#得到平面的面积self.rect=rect[0]self.rect.topleft=posself.speed=8#生成精灵组实例self.bullets=pygame.sprite.Group()self.img_index=0#判断飞机是否被击中self.is_hit=Falsedefshoot(self,img):bullet=Bullet(img,self.rect.midtop)#向玩家的子弹组添加一个子弹实例self.bullets.add(bullet)defmoveUp(self):#遇到顶部时,设置上部顶部为0如果self.rect。top<=0:self.rect.top=0else:self.rect.top-=self.speeddefmoveDown(self):#遇到底部时,设置为常量ifself.rect.top>=SCREEN_HEIGHT-self.rect.height:self.rect.top=SCREEN_HEIGHT-self.rect.heightelse:self.rect.top+=self.speeddefmoveLeft(self):#遇到左边时,总是停靠在左边如果self.rect.left<=0:self.rect.left=0else:self.rect.left-=self.speeddefmoveRight(self):#遇到右边时停靠在右边ifself.rect.left>=SCREEN_WIDTH-self.rect.width:self.rect.left=SCREEN_WIDTH-self.rect.widthelse:self.rect.left+=self.speed看玩家飞行器样式:接下来我们定义子弹的属性和方法,主要实现代码如下:classBullet(pygame.sprite.Sprite):def__init__(self,img,pos):pygame.sprite.Sprite.__init__(self)self.image=img#设置图像区域self.rect=self.image.get_rect()self.rect.midbottom=posself.speed=10defmove(self):self.rect.top-=self.speed看子弹的样式:定义完player,我们来定义敌机的属性和方法。主要实现代码如下:classEnemy(pygame.sprite.Sprite):def__init__(self,img,explosion_img,pos):pygame.sprite.Sprite.__init__(self)self.image=imgself.rect=self.image.get_rect()self.rect。topleft=posself.explosion_img=explosion_imgself.speed=2#设置销毁序列self.explosion_index=0defmove(self):#敌人的子弹只能往下走self.rect.top+=self.speed最后我们来定义相应的游戏操作逻辑,比如:打中敌机,player与敌机碰撞,产生分数等,主要实现代码如下:whilerunning:#设置游戏帧率为60clock.tick(60)ifnotis_pauseandnotis_game_over:ifnotplayer.is_hit:#设置连拍,因为每秒60帧,15/60=0.25秒射出一颗子弹ifshoot_frequency%15==0:player.shoot(bullet_img)shoot_frequency+=1#当设置的射击频率大于15时,setittozeroifshoot_frequency>=15:shoot_frequency=0#控制生成敌机的频率ifenemy_frequency%50==0:#设置敌机出现的位置enemy_pos=[random.randint(0,SCREEN_WIDTH-enemy_rect.width),0]enemy=Enemy(enemy_img,enemy_explosion_imgs,enemy_pos)enemies.add(enemy)enemy_frequency+=1ifenemy_frequency>=100:enemy_frequency=0#控制子弹的显示,在player.bullets中寻找子弹:bullet.move()ifbullet.rect.bottom<0:player.bullets.remove(bullet)#控制敌机的操作forenemyinenemys:enemy.move()#判断敌机是否与玩家碰撞平面如果pygame。sprite.collide_circle(enemy,player):enemies_explosion.add(enemy)enemies.remove(enemy)player.is_hit=True#设置玩家飞机被摧毁is_game_over=True#判断敌机是否在界面上ifenemy.rect.top<0:enemies.remove(enemy)#当敌机与玩家飞机子弹相撞时,返回被击中的敌机实例enemy_explosion=pygame.sprite.groupcollide(enemies,player.bullets,1,1)对于enemy_explosion中的敌人:enemy_explosion.add(enemy)#绘制屏幕screen.fill(0)#添加背景图像screen.blit(bg,(0,0))#如果不是player.is_hit:screen,则将玩家飞机图像添加到屏幕.blit(player.image[int(player.img_index)],player.rect)player.img_index=shoot_frequency/8其他:ifplayer_explosion_index>47:is_game_over=Trueelse:player.img_index=player_explosion_index/8screen.blit(player.image[int(player.img_index)],player.rect)player_explosion_index+=1#敌机被击中的效果byabulletDisplayforenemyinenemy_explosion:ifenemy.explosion_index==0:passifenemy.explosion_index>7:enemy_explosion.remove(enemy)score+=100continue#当敌机被击中时显示图像screen.blit(enemy.explosion_img[int(enemy.explosion_index/2)],enemy.rect)enemy.explosion_index+=1#显示子弹player.bullets.draw(screen)#显示敌机enemies.draw(screen)#分数显示效果score_font=pygame.font.Font(None,36)score_text=score_font.render(str(score),True,(128,128,128))#设置文本框text_rect=score_text.get_rect()#放置文本text_rect.topleft=[20,10]#显示分数screen.blit(score_text,text_rect)left,middle,right=pygame.mouse.get_pressed()#暂停游戏ifright==Trueandnotis_game_over:is_pause=Trueifleft==True:#重新设置游戏ifis_game_over:is_game_over=Falseplayer_rect=[]player_rect.append(pygame.Rect(0,99,102,126))player_rect.append(pygame.Rect(165,360,102,126))player_rect.append(pygame.Rect(165,234,102,126))player_rect.append(pygame.Rect(330,624,102,126))player_rect.append(pygame.Rect(330,498,102,126))player_rect.append(pygame.Rect(432,624,102),126))player=Player(img_plane,player_rect,player_pos)bullet_rect=pygame.Rect(1004,987,9,21)bullet_img=img_plane.subsurface(bullet_rect)enemy_rect=pygame.Rect(534,612,57,43)enemy_img=img_plane.subsurface(enemy_rect)enemy_explosion_imgs=[]enemy_explosion_imgs.append(img_plane.subsurface(pygame.Rect(267,347,57,43)))enemy_explosion_imgs.append(img_plane.subsurface(pygame.Rect(873,697,57,43)))enemy_explosion_imgs.append(img_plane.subsurface(pygame.Rect(267,296,57,43)))enemy_explosion_imgs.append(img_plane.subsurface(pygame.Rect(930,697,57,43)))enemies=pygame.sprite.Group()enemy_explosion=pygame.sprite.Group()score=0shoot_frequency=0enemy_frequency=0player_explosion_index=16#继续游戏ifis_pause:is_pause=False#游戏结束ifis_game_over:font=pygame.font.SysFont("微软雅黑",48)text=font.render("分数:"+str(score),True,(255,0,0))text_rect=text.get_rect()text_rect.centerx=screen.get_rect().centerxtext_rect.centery=screen.get_rect().centery+70#显示游戏结束画面画面。blit(bg_game_over,(0,0))#显示得分screen.blit(text,text_rect)font=pygame.font.SysFont("微软雅黑",40)text=font.render("鼠标左键重启",是的,(255,0,0))text_rect=text.get_rect()text_rect.centerx=screen.get_rect().centerxtext_rect.centery=screen.get_rect().centery+150screen.blit(text,text_rect)#刷新屏幕pygame.display.update()#Handlegameexitforeventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()exit()ifnotis_pauseandnotis_game_over:key=pygame.key.get_pressed()如果key[K_w]或key[K_UP]:player.moveUp()如果key[K_s]或key[K_DOWN]:player.moveDown()如果key[K_a]或key[K_LEFT]:player.moveLeft()ifkey[K_d]orkey[K_RIGHT]:player.moveRight()看一下最终实现效果:源码及资料公众号后台回复200530获取
