原理介绍游戏规则:玩家通过↑↓←→键控制主角的动作,使主角从起点(左上角)走出迷宫,到达终点点(右下角)赢得比赛。分步实现:首先当然是创建一个迷宫。为了方便,这里采用了随机生成迷宫的方式(人工设计真的很养眼,不想半途而废,有兴趣的可以自己试试)。思路其实很简单,就是把游戏界面分成多个cell,像这样:然后设计一个算法遍历所有的cell,每个遍历的cell在一些随机的方向打开一堵墙(也就是去掉划分的lineofthecell)就可以了~具体代码实现如下:'''随机生成的迷宫类'''classRandomMaze():def__init__(self,maze_size,block_size,border_size,**kwargs):self.block_size=block_sizeself.border_size=border_sizeself.maze_size=maze_sizeself.blocks_list=RandomMaze.createMaze(maze_size,block_size,border_size)self.font=pygame.font.SysFont('Consolas',15)'''绘制到屏幕'''defdraw(self,screen):forrowinrange(self.maze_size[0]):forcolinrange(self.maze_size[1]):self.blocks_list[row][col].draw(screen)#开始和结束标记showText(screen,self.font,'S',(255,0,0),(self.border_size[0]-10,self.border_size[1]))showText(screen,self.font,'D',(255,0,0),(self.border_size[0]+(self.maze_size[1]-1)*self.block_size,self.border_size[1]+self.maze_size[0]*self.block_size+5))'''创建迷宫'''@staticmethoddefcreateMaze(maze_size,block_size,border_size):defnextBlock(block_now,blocks_list):directions=['top','bottom','left','right']blocks_around=dict(zip(directions,[None]*4))block_next=Nonecount=0#查看上边blockifblock_now.coordinate[1]-1>=0:block_now_top=blocks_list[block_now.coordinate[1]-1][block_now.coordinate[0]]ifnotblock_now_top.is_visited:blocks_around['top']=block_now_topcount+=1#查看下块ifblock_now.coordinate[1]+1=0:block_now_left=blocks_list[block_now.coordinate[1]][block_now.coordinate[0]-1]如果不是block_now_left.is_visited:blocks_around['left']=block_now_leftcount+=1#查看右方块ifblock_now.coordinate[0]+10:whileTrue:direction=random.choice(directions)ifblocks_around.get(direction):block_next=blocks_around.get(direction)ifdirection=='top':block_next.has_walls[1]=Falseblock_now.has_walls[0]=Falseelifdirection=='bottom':block_next.has_walls[0]=Falseblock_now.has_walls[1]=Falseelifdirection=='left':block_next.has_walls[3]=Falseblock_now.has_walls[2]=Falseelifdirection=='right':block_next.has_walls[2]=Falseblock_now.has_walls[3]=Falsebreakreturnblock_nextblocks_list=[[块([col,row],block_size,border_size)forcolinrange(maze_size[1])]forrowinrange(maze_size[0])]block_now=blocks_list[0][0]records=[]whileTrue:如果block_now:如果不是block_now.is_visited:block_now.is_visited=Truerecords.append(block_now)block_now=nextBlock(block_now,blocks_list)else:block_now=records.pop()iflen(records)==0:breakreturnblocks_list下一步是定义角色类。角色类需要根据用户的操作进行上下左右移动。同时保证运动不能越墙就可以了。具体代码实现如下:'''Definehero'''classHero(pygame.sprite.Sprite):def__init__(self,imagepath,coordinate,block_size,border_size,**kwargs):pygame.sprite.Sprite.__init__(self)self.image=pygame.image.load(imagepath)self.image=pygame.transform.scale(self.image,(block_size,block_size))self.rect=self.image.get_rect()self.rect.left,self.rect.top=坐标[0]*block_size+border_size[0],coordinate[1]*block_size+border_size[1]self.coordinate=coordinateself.block_size=block_sizeself.border_size=border_size'''移动'''defmove(self,direction,maze):blocks_list=maze.blocks_listifdirection=='up':ifblocks_list[self.coordinate[1]][self.coordinate[0]].has_walls[0]:returnFalseelse:self.coordinate[1]=self.coordinate[1]-1returnTrueelifdirection=='down':ifblocks_list[self.coordinate[1]][self.coordinate[0]].has_walls[1]:返回Falseelse:self.coordinate[1]=self.coordinate[1]+1returnTrueelifdirection=='left':ifblocks_list[self.coordinate[1]][self.coordinate[0]].has_walls[2]:returnFalseelse:self.坐标[0]=self.coordinate[0]-1returnTrueelifdirection=='right':ifblocks_list[self.coordinate[1]][self.coordinate[0]].has_walls[3]:returnFalseelse:self.coordinate[0]=self.coordinate[0]+1returnTrueelse:raiseValueError('Unsupportdirection<%s>inHero.move...'%direction)'''bind设置为屏幕'''defdraw(self,screen):self.rect.left,self.rect.top=self.coordinate[0]*self.block_size+self.border_size[0],self.coordinate[1]*self.block_size+self.border_size[1]screen.blit(self.image,self.rect)最后写下游戏的主循环,其实很简单,只要加载一张随机生成的迷宫地图即可并实例化一个主角,然后继续检测按键,并根据按键检测结果移动主角,最后根据动作结果更新界面数据。当然,如果主角到达终点,就会进入关卡切换界面具体代码实现如下:'''mainfunction'''defmain(cfg):#初始化pygame.init()pygame.mixer.init()pygame.font.init()pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.play(-1,0.0)screen=pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('迷宫-微信公众号:查尔斯的皮卡丘')font=pygame.font.SysFont('Consolas',15)#开始界面Interface(screen,cfg,'game_start')#记录关卡数num_levels=0#记录通关多少步best_scores='None'#关卡循环切换whileTrue:num_levels+=1clock=pygame.time.Clock()screen=pygame.display.set_mode(cfg.SCREENSIZE)#--随机生成关卡地图maze_now=RandomMaze(cfg.MAZESIZE,cfg.BLOCKSIZE,cfg.BORDERSIZE)#--generateherohero_now=Hero(cfg.HEROPICPATH,[0,0],cfg.BLOCKSIZE,cfg.BORDERSIZE)#--statisticalstepsnum_steps=0#--mainloopinthelevelwhileTrue:dt=clock.tick(cfg.FPS)screen.fill((255,255,255))is_move=False#----↑↓←→控制heroforeventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit(-1)elifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_UP:is_move=hero_now.move('up',maze_now)elif事件.key==pygame.K_DOWN:is_move=hero_now.move('down',maze_now)elifevent.key==pygame.K_LEFT:is_move=hero_now.move('left',maze_now)elifevent.key==pygame.K_RIGHT:is_move=hero_now.move('right',maze_now)num_steps+=int(is_move)hero_now.draw(screen)maze_now.draw(screen)#----显示一些信息showText(screen,font,'LEVELDONE:%d'%num_levels,(255,0,0),(10,10))showText(屏幕,字体,'BESTSCORE:%s'%best_scores,(255,0,0),(210,10))showText(screen,font,'USEDSTEPS:%s'%num_steps,(255,0,0),(410,10))showText(screen,font,'S:你的起点D:你的目的地',(255,0,0),(10,600))#----判断游戏是否胜利if(hero_now.coordinate[0]==cfg.MAZESIZE[1]-1)and(hero_now.coordinate[1]==cfg.MAZESIZE[0]-1):breakpygame.display.update()#如果best_scores更新最佳分数=='None':best_scores=num_stepselse:ifbest_scores>num_steps:best_scores=num_steps#关卡切换界面(screen,cfg,mode='game_switch')效果展示