说到开心游戏,相信大家都不陌生。获得了2015年玩家最喜爱的手机单机游戏大奖,其火爆程度可见一斑,本文中,我们使用Python制作了一款简单的红娘游戏。小小乐的构成主要包括游戏主体、计分器、计时器三部分。我们来看看具体的实现。我们先来看看游戏需要的Python库。importosimportsysimporttimeimportpygameimportrandom定义了一些常量,比如:窗口宽高,网格行列数等,代码如下:WIDTH=400HEIGHT=400NUMGRID=8GRIDSIZE=36XMARGIN=(WIDTH-GRIDSIZE*NUMGRID)//2YMARGIN=(HEIGHT-GRIDSIZE*NUMGRID)//2ROOTDIR=os.getcwd()FPS=30然后创建一个主窗口,代码如下:pygame.init()screen=pygame.display.set_mode((WIDTH,HEIGHT))pygame.display.set_caption('小小乐')看效果:然后在窗口中画一个8x8的格子,代码如下:screen.fill((255,255,220))#游戏界面网格绘制defdrawGrids(self):forxinrange(NUMGRID):foryinrange(NUMGRID):rect=pygame.Rect((XMARGIN+x*GRIDSIZE,YMARGIN+y*GRIDSIZE,GRIDSIZE,GRIDSIZE))self.drawBlock(rect,color=(255,165,0),size=1#画一个矩形块框defdrawBlock(self,block,color=(255,0,0),size=2):pygame.draw.rect(self.screen,color,block,size)查看效果ct:然后将各种拼图块随机放入网格中,代码如下:whileTrue:self.all_gems=[]self.gems_group=pygame.sprite.Group()forxinrange(NUMGRID):self.all_gems追加([])为y在范围(NUMGRID):gem=Puzzle(img_path=random.choice(self.gem_imgs),大小=(GRIDSIZE,GRIDSIZE),位置=[XMARGIN+x*GRIDSIZE,YMARGIN+y*GRIDSIZE-NUMGRID*GRIDSIZE],downlen=NUMGRID*GRIDSIZE)self.all_gems[x].append(gem)self.gems_group.add(gem)ifself.isMatch()[0]==0:break看效果:然后加上scorer和timer,代码如下:#显示分数defdrawScore(self):score_render=self.font.render('score:'+str(self.score),1,(85,65,0))rect=score_render.get_rect()rect.left,rect.top=(55,15)self.screen.blit(score_render,rect)#显示加分defdrawAddScore(self,add_score):score_render=self.font.render('+'+str(add_score),1,(255,100,100))rect=score_render.get_rect()rect.left,rect.top=(250,250)self.screen.blit(score_render,rect)#显示剩余时间defshowRemainingTime(self):remaining_time_render=self.font.render('Countdown:%ss'%str(self.remaining_time),1,(85,65,0))rect=remaining_time_render.get_rect()矩形t.left,rect.top=(WIDTH-190,15)self.screen.blit(remaining_time_render,rect)看效果:当设定的游戏时间用完后,我们可以生成一些提示信息,代码如下:whileTrue:foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit()ifevent.type==pygame.KEYUPandevent.key==pygame.K_r:flag=Trueifflag:breakscreen.fill((255,255,220))text0='Finalscore:%s'%scoretext1='PressRtorestart'y=140foridx,文本输入enumerate([text0,text1]):text_render=font.render(text,1,(85,65,0))rect=text_render.get_rect()如果idx==0:rect.left,rect.top=(100,y)elifidx==1:rect.left,rect.top=(100,y)y+=60screen.blit(text_render,rect)pygame.display.update()看效果:说完了游戏的图形界面我们来看看游戏的主要处理逻辑我们使用鼠标操作拼图,所以程序需要检查是否有选中的拼图。代码实现如下:defcheckSelected(self,position):forxinrange(NUMGRID):foryinrange(NUMGRID):ifself.getGemByPos(x,y).rect.collidepoint(*position):return[x,y]returnNone我们需要交换鼠标连续选中的拼图块的位置。代码实现如下:defswapGem(self,gem1_pos,gem2_pos):margin=gem1_pos[0]-gem2_pos[0]+gem1_pos[1]-gem2_pos[1]ifabs(margin)!=1:returnFalsegem1=self.getGemByPos(*gem1_pos)gem2=self.getGemByPos(*gem2_pos)如果gem1_pos[0]-gem2_pos[0]==1:gem1.direction='left'gem2.direction='right'elifgem1_pos[0]-gem2_pos[0]==-1:gem2.direction='left'gem1.direction='right'elifgem1_pos[1]-gem2_pos[1]==1:gem1.direction='up'gem2.direction='向下'elifgem1_pos[1]-gem2_pos[1]==-1:gem2.direction='up'gem1.direction='down'gem1.target_x=gem2.rect.leftgem1.target_y=gem2。rect.topgem1.fixed=Falsegem2.target_x=gem1.rect.leftgem2.target_y=gem1.rect.topgem2.fixed=Falseself.all_gems[gem2_pos[0]][gem2_pos[1]]=gem1self.all_gems[gem1_pos[0]][gem1_pos[1]]=gem2returnTrue每次交换拼图时,需要判断是否有三个或三个以上连续的相同拼图。代码实现如下:defisMatch(self):forxinrange(NUMGRID):foryinrange(NUMGRID):ifx+2
