#!/usr/bin/env python3fromrandomimportchoicefromcopyimportdeepcopy# https://pypi.org/project/console/fromconsole.utilsimportwait_keyclassMaze:def__init__(self,dim,size):self.dim=dimself.size=sizeself.maze='#'self.loc=tuple([0]*dim)foriinrange(dim):self.maze=[deepcopy(self.maze)for_inrange(size)]self.gen()def__str__(self):iftype(self.maze[0])==str:return''.join(self.maze)+'\n'ret=''foriinself.maze:temp=deepcopy(self)temp.dim-=1temp.maze=iret+=str(temp)ret+="\n"returnret@staticmethoddeffromstr(s):dim=0foriins[-max(len(s),50):][::-1]:ifi=='\n':dim+=1else:breaksize=0foriins[:max(len(s),50):]:ifi=='\n':breaksize+=1ret=Maze(2,2)ret.maze=Maze.fromstrhelp(s,dim,size)ret.dim=dimret.size=sizeret.loc=tuple([0]*dim)returnret@staticmethoddeffromstrhelp(s,dim,size):s=s.strip()ifdim==1:returnlist(s)return[Maze.fromstrhelp(i+'\n'*(dim-1),dim-1,size)foriins.split('\n'*(dim-1))]defget(self,*pt):ret=self.mazeforidxinpt:ret=ret[idx]returnretdefset(self,*pt,**kwargs):temp=self.mazeforidxinpt[:-1]:temp=temp[idx]temp[pt[-1]]=kwargs['val']defcheck(self,*pt):foriinpt:ifi>=self.sizeori<0:returnFalsereturnTruedefadj(self,*pt):ret=set()foriinrange(len(pt)):newpt=[iforiinpt]newpt[i]+=1ifself.check(*newpt):ret=ret|{tuple(newpt)}newpt[i]-=2ifself.check(*newpt):ret=ret|{tuple(newpt)}returnretdefneighbors(self,*pt,typ=None):ret=set()forptinself.adj(*pt):iftypisNoneorself.get(*pt)intyp:ret=ret|{pt}returnretdefgen(self):self.set(*self.loc,val=' ')walls=self.adj(*self.loc)whilelen(walls)>0:rand=choice(list(walls))nbhd=self.neighbors(*rand,typ=' ')iflen(nbhd)==1:self.set(*rand,val=' ')walls=walls|self.neighbors(*rand,typ='#')walls=walls-{rand}self.set(*([0]*self.dim),val='@')foriinself.neighbors(*([0]*self.dim)):self.set(*i,val=' ')self.set(*([self.size-1]*self.dim),val='F')foriinself.neighbors(*([self.size-1]*self.dim)):self.set(*i,val=' ')defmove(self,mv):newLoc=(self.loc[0]+mv[0],self.loc[1]+mv[1])if(newLoc[0]<0ornewLoc[0]>=self.sizeornewLoc[1]<0ornewLoc[1]>=self.sizeorself.get(*newLoc)=='#'):print("BONK")returnifself.get(*newLoc)=='F':print(open("flag.txt").read())wait_key()exit(0)self.set(*self.loc,val=' ')self.set(*newLoc,val='@')self.loc=newLocdefgetKey():key=wait_key()ifkey==chr(3):# Ctrl-Cexit(1)returnkeymoveDict={'w':(-1,0),'s':(1,0),'d':(0,1),'a':(0,-1),}defwaitForMove():key=NonewhilekeynotinmoveDict:key=getKey()returnmoveDict[key]defmain():maze=Maze(2,40)print("Find the flag in this maze. Good luck!")print("WASD to move.")whileTrue:# print(maze)move=waitForMove()maze.move(move)if__name__=='__main__':main()
خط 159 رو از کامنت در میاریم و برنامه رو اجرا میکنیم و میبینیم با یک بازی هزارتو مواجه هستیم، با این تفاوت که در سمت سرور به ما صفحه هزارتو نمایش داده نمیشود و باید کورکورانه جابجا شویم و تنها درصورتیکه به دیوار برخورد کنیم پیام BONK نمایش داده میشود.
در ابتدا بازی ما در مختصات (0, 0) هستیم و میتوانیم با دکمه های w, s, a, d در صفحه جابجا شویم و برای بدست آوردن فلگ باید به مختصات (40, 40) برسیم تا فلگ برای ما نمایش داده شود.
برای حل این مساله میتوانیم از الگوریتم DFS استفاده کنیم تا به مختصات فلگ برسیم. برای آشنایی بیشتر با الگوریتم جستجوی عمق اول(DFS) میتوانید این لینک را مطالعه کنید.