午夜精品人妻久久久-成年美女很黄的网站-在线看片免费人成视久网app-国产精品美女无遮挡一区二区-91精品国产综合久久久久-国产的免费视频又猛又爽又刺激-在线看片免费人成视久网app-久久香蕉国产精品视频-av一区二区三区高清

Python迷宮生成器

作為一項(xiàng)古老的智力游戲,千百年來(lái)迷宮都散發(fā)著迷人的魅力 。但是,手工設(shè)計(jì)迷宮費(fèi)時(shí)又耗(腦)力,于是,我們有必要制作一個(gè)程序:迷宮生成器……
好吧,我編不下去了 。但是 , 從上面的文字中,我們可以看出,我們此次的主題是:用實(shí)現(xiàn)一個(gè)迷宮生成器 。
首先展示一下效果圖:
我們先分析一下所需的庫(kù):
既然是生成器,每次生成的迷宮一模一樣顯然是說(shuō)不過(guò)去的 。因此 , 我們不可避免地要使用隨機(jī)數(shù)(庫(kù)) 。迷宮一定是要繪制的,所以需要有一個(gè)GUI庫(kù)或繪圖庫(kù),這里我使用(或其實(shí)都可以做到,但畢竟比較順手) 。與搭配,Sys似乎也是需要的(用于退出程序,但其實(shí)不使用似乎也無(wú)傷大雅) 。然后是.,主要用于詢(xún)問(wèn)保存路徑(生成的迷宮總得保存吧) 。當(dāng)然,用Time加一個(gè)計(jì)時(shí)器似乎是錦上添花 。
于是 , 就有:
#coding:utf-8import contextlibwith contextlib.redirect_stdout(None):import pygameimport randomimport sysimport timefrom tkinter.filedialog import *
這里要說(shuō)明的是 , 由于導(dǎo)入時(shí)會(huì)輸出版本信息等很多內(nèi)容(這很影響美感) , 我們需要使用阻止它輸出 。
接下來(lái) , 我們需要詢(xún)問(wèn)一些參數(shù):
a=int(input("列數(shù):"))b=int(input("行數(shù):"))l=int(input("大?。?))saveit=input("是否保存:")
然后 , 就要運(yùn)行生成迷宮的程序了 。同時(shí) , 我們有必要計(jì)錄一下時(shí)間(相當(dāng)于開(kāi)啟計(jì)時(shí)器):
print("生成中...")e = time.time()
然后就是正式生成迷宮 。在介紹這部分代碼之前,我們需要了解一下算法:
第一步,生成一個(gè)由迷宮單元(白格)和墻(黑格)組成的網(wǎng)格 。一行中迷宮單元的數(shù)量為迷宮的列數(shù),一列找迷宮單元的數(shù)量為迷宮的行數(shù) 。令左上角的迷宮單元為起點(diǎn),右下角的迷宮單元為終點(diǎn) , 打破起點(diǎn)左邊與終點(diǎn)右邊的墻,如圖所示:
第二步,訪(fǎng)問(wèn)各迷宮單元 。將起點(diǎn)標(biāo)記為當(dāng)前迷宮單元 , 當(dāng)存在未被訪(fǎng)問(wèn)的迷宮單元(凡是曾經(jīng)成為過(guò)當(dāng)前迷宮單元的迷宮單元,都視為已訪(fǎng)問(wèn))時(shí),重復(fù)執(zhí)行:
在循環(huán)結(jié)束以后,就會(huì)出現(xiàn)像文章開(kāi)頭效果圖一樣的結(jié)果 。
接下來(lái),我們就要將文字化的算法轉(zhuǎn)化為的代碼 。
首先,程序是不認(rèn)識(shí)圖片的,它認(rèn)識(shí)的是數(shù)據(jù) 。所以我們需要設(shè)置一個(gè)二維列表,以此來(lái)用一串?dāng)?shù)據(jù)表示當(dāng)前的圖像 。當(dāng)然,我們可以順便將第一步的設(shè)置一起完成:
alist = []aa=0need=[]for j in range(2*a+1):if aa==0:aa = 1alistone = []for i in range(2*b+1):alistone.append(1)alist.append(alistone)else:aa=0alistone = []bb=0for i in range(2*b+1):if bb==0:bb=1alistone.append(1)else:bb = 0need.append((j,i))alistone.append(0)alist.append(alistone)alist[0][1]=0alist[-1][-2]=0
可以看到,除此以外我們還建立了一個(gè)列表need,里面存儲(chǔ)了所有的迷宮單元 。它的作用就是判斷迷宮單元是否被訪(fǎng)問(wèn),每次訪(fǎng)問(wèn)都會(huì)將迷宮單元從表格中刪除 , 當(dāng)表格中沒(méi)有迷宮單元時(shí) , 就說(shuō)明所有迷宮單元都被訪(fǎng)問(wèn)了 。
x=1y=1need.remove((1, 1))listing=[]while len(need)>0:aroundit=[]try:if x-2<0:print(1+"1")alist[x-2][y]=0if (x-2,y) in need:aroundit.append("alist[x-1][y],x=(0,x-2)")except:while False:print()try:alist[x+2][y]=0if (x+2,y) in need:aroundit.append("alist[x+1][y],x=(0,x+2)")except:while False:print()try:alist[x][y+2]=0if (x,y+2) in need:aroundit.append("alist[x][y+1],y=(0,y+2)")except:while False:print()try:if y-20:listing.append((x,y))exec(random.choice(aroundit))need.remove((x, y))else:x,y=listing[-1]listing.pop()
而這些內(nèi)容,就是第二步 。其算法我已經(jīng)解釋過(guò),唯一一個(gè)微小的不同是,在此處我們并沒(méi)有在列表中加入相鄰迷宮單元的坐標(biāo) , 而是將其對(duì)應(yīng)的破墻和標(biāo)記為當(dāng)前迷宮單元的代碼以字符串的形式存儲(chǔ)在表格中,并在隨機(jī)選擇出某個(gè)迷宮單元所對(duì)應(yīng)的字符串后,使用exec將其轉(zhuǎn)換為代碼并運(yùn)行(這可以節(jié)省一些代碼) 。
print("完成!用時(shí){}秒".format(time.time()-e))
打印完生成迷宮的用時(shí)后,我們需要將表格中的數(shù)據(jù)轉(zhuǎn)化為圖像了 。當(dāng)然,在此之前,我們要先確定圖片保存的位置 。
if saveit=="1":ccc = askdirectory()h=""bbbbb=1while True:try:open("{}/{}×{}迷宮{}.png".format(ccc,a,b,h),"r")h="({})".format(bbbbb)except:breakbbbbb+=1

Python迷宮生成器

文章插圖
Python迷宮生成器

文章插圖
由于使用時(shí)有可能選擇不保存圖片 , 因此要先判斷你的選擇是保存還是不保存 。這里字符“1”表示保存(輸入其他,自然就是不保存了) 。然后我們需要讓你選擇保存路徑(()詢(xún)問(wèn)的是文件路徑,不需要選擇文件名) 。然后,我們要確定文件名稱(chēng):“a×b迷宮.png” 。這里需要判斷指定路徑是否存在此名稱(chēng)的文件,如果存在,則我們需要在后面加上序號(hào) 。總而言之,通過(guò)這串代碼,我們已經(jīng)將迷宮的路徑+文件名確定了 。
pygame.init()icon=pygame.image.load("迷宮.png")pygame.display.set_icon(icon)screen=pygame.display.Info()screen = pygame.display.set_mode((l*(2*a+1),l*(2*b+1)))pygame.display.set_caption('迷宮')screen.fill("white")c = pygame.Surface((l, l), flags=pygame.HWSURFACE)c.fill(color='white')d = pygame.Surface((l, l), flags=pygame.HWSURFACE)d.fill(color='black')for i in range(2*a+1):for j in range(2*b+1):if alist[i][j]==0:screen.blit(c, (i*l, j*l))elif alist[i][j]==1:screen.blit(d, (i*l, j*l))pygame.display.flip()if saveit=="1":pygame.image.save(screen, "{}/{}×{}迷宮{}.png".format(ccc, a, b, h))while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()
代碼中使用的圖片“迷宮.png”(名稱(chēng)不太對(duì),下載以后要重新命名一下):
這里主要是的基本設(shè)置文章生成器哪個(gè)好,并將表格內(nèi)容圖像化 。每一個(gè)數(shù)字代表一個(gè)方塊,而數(shù)字的值則決定了方塊的顏色,數(shù)字在表格中的位置決定了方塊的位置 。就這樣,我們呢將表格完全轉(zhuǎn)化成了圖像 。當(dāng)然,我們還需要用.image.save()函數(shù)將圖像保存為圖片文件 。
這樣,這個(gè)生成器似乎完成了 。
它運(yùn)行良好,但當(dāng)迷宮比較復(fù)雜時(shí),暴露出一個(gè)問(wèn)題(下圖是100×100的迷宮):
由于正確路徑過(guò)于曲折 , 在復(fù)雜度較高時(shí) , 這個(gè)迷宮的難度會(huì)變得極高!
難度高,在某方面上講文章生成器哪個(gè)好,的確是好事 。但當(dāng)你向你的朋友們展示這個(gè)迷宮時(shí),如果你自己也無(wú)法得出正確的路徑,這不是很掃興嗎?
因此 , 一個(gè)尋路算法變得非常有必要 。
尋路算法的大體思路:
在生成的迷宮中 , 白格為路,黑格為墻 。將起點(diǎn)設(shè)置為當(dāng)前位置,重復(fù)執(zhí)行直到終點(diǎn)成為當(dāng)前位置:
如果表格是空的:
通過(guò)這個(gè)算法,我們可以試出正確的路徑(如圖):
代碼的實(shí)現(xiàn):
x2=0y2=1listing2=[]while not(alist[-1][-2]==2):alist[x2][y2]=3around2=[]try:if x2-1<0:print(1+"1")if alist[x2-1][y2]==0:around2.append("x2=x2-1")except:while False:print()try:if alist[x2+1][y2]==0:around2.append("x2=x2+1")except:while False:print()try:if alist[x2][y2+1]==0:around2.append("y2=y2+1")except:while False:print()try:if y2-10:listing2.append((x2,y2))exec(random.choice(around2))else:alist[x2][y2]=2x2,y2=listing2[-1]listing2.pop()alist[-1][-2]=3for i in range(len(alist)):for j in range(len(alist[0])):if alist[i][j]==2:alist[i][j]=0
同時(shí) , 圖像繪制的過(guò)程也要作出一些改動(dòng),以顯示正確路徑:
if saveit=="1":ccc = askdirectory()h=""bbbbb=1while True:try:open("{}/{}×{}迷宮{}.png".format(ccc,a,b,h),"r")open("{}/{}×{}迷宮(正確線(xiàn)路){}.png".format(ccc,a,b,h),"r")h="({})".format(bbbbb)except:breakbbbbb+=1pygame.init()icon=pygame.image.load("迷宮.png")pygame.display.set_icon(icon)screen=pygame.display.Info()screen = pygame.display.set_mode((l*(2*a+1),l*(2*b+1)))pygame.display.set_caption('迷宮')screen.fill("white")if saveit=="1":c = pygame.Surface((l, l), flags=pygame.HWSURFACE)c.fill(color='white')d = pygame.Surface((l, l), flags=pygame.HWSURFACE)d.fill(color='black')f = pygame.Surface((l, l), flags=pygame.HWSURFACE)f.fill(color='white')for i in range(2 * a + 1):for j in range(2 * b + 1):if alist[i][j] == 0:screen.blit(c, (i * l, j * l))elif alist[i][j] == 1:screen.blit(d, (i * l, j * l))else:screen.blit(f, (i * l, j * l))pygame.image.save(screen, "{}/{}×{}迷宮{}.png".format(ccc, a, b, h))c = pygame.Surface((l, l), flags=pygame.HWSURFACE)c.fill(color='white')d = pygame.Surface((l, l), flags=pygame.HWSURFACE)d.fill(color='black')f = pygame.Surface((l, l), flags=pygame.HWSURFACE)f.fill(color='red')for i in range(2 * a + 1):for j in range(2 * b + 1):if alist[i][j] == 0:screen.blit(c, (i * l, j * l))elif alist[i][j] == 1:screen.blit(d, (i * l, j * l))else:screen.blit(f, (i * l, j * l))pygame.image.save(screen, "{}/{}×{}迷宮(正確線(xiàn)路){}.png".format(ccc, a, b, h))c = pygame.Surface((l, l), flags=pygame.HWSURFACE)c.fill(color='white')d = pygame.Surface((l, l), flags=pygame.HWSURFACE)d.fill(color='black')f = pygame.Surface((l, l), flags=pygame.HWSURFACE)f.fill(color='white')for i in range(2*a+1):for j in range(2*b+1):if alist[i][j]==0:screen.blit(c, (i*l, j*l))elif alist[i][j]==1:screen.blit(d, (i*l, j*l))else:screen.blit(f,(i*l, j*l))pygame.display.flip()aaaaaaa = 0while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.MOUSEBUTTONDOWN:if aaaaaaa == 1:aaaaaaa = 0c = pygame.Surface((l, l), flags=pygame.HWSURFACE)c.fill(color='white')d = pygame.Surface((l, l), flags=pygame.HWSURFACE)d.fill(color='black')f = pygame.Surface((l, l), flags=pygame.HWSURFACE)f.fill(color='white')for i in range(2 * a + 1):for j in range(2 * b + 1):if alist[i][j] == 0:screen.blit(c, (i * l, j * l))elif alist[i][j] == 1:screen.blit(d, (i * l, j * l))else:screen.blit(f, (i * l, j * l))pygame.display.flip()else:aaaaaaa = 1c = pygame.Surface((l, l), flags=pygame.HWSURFACE)c.fill(color='white')d = pygame.Surface((l, l), flags=pygame.HWSURFACE)d.fill(color='black')f = pygame.Surface((l, l), flags=pygame.HWSURFACE)f.fill(color='red')for i in range(2 * a + 1):for j in range(2 * b + 1):if alist[i][j] == 0:screen.blit(c, (i * l, j * l))elif alist[i][j] == 1:screen.blit(d, (i * l, j * l))else:screen.blit(f, (i * l, j * l))pygame.display.flip()
通過(guò)這些改動(dòng) , 顯示正確路徑的效果就實(shí)現(xiàn)了 。生成完成以后,窗口上顯示的是沒(méi)有正確路徑的迷宮,而點(diǎn)擊窗口后,正確的路徑就會(huì)顯示(再次點(diǎn)擊隱藏) 。
剛剛那張100×100的迷宮,其正確路徑是:
可以看出,本文中所用的算法生成的迷宮,其正確路徑還是非常曲折的(難度很高) 。你何不將其發(fā)給你的朋友 , 讓其破解一下呢?
完整的代碼:
#coding:utf-8import contextlibwith contextlib.redirect_stdout(None):import pygameimport randomimport sysimport timefrom tkinter.filedialog import *a=int(input("列數(shù):"))b=int(input("行數(shù):"))l=int(input("大?。?))saveit=input("是否保存:")print("生成中...")e = time.time()alist = []aa=0need=[]for j in range(2*a+1):if aa==0:aa = 1alistone = []for i in range(2*b+1):alistone.append(1)alist.append(alistone)else:aa=0alistone = []bb=0for i in range(2*b+1):if bb==0:bb=1alistone.append(1)else:bb = 0need.append((j,i))alistone.append(0)alist.append(alistone)alist[0][1]=0alist[-1][-2]=0x=1y=1need.remove((1, 1))listing=[]while len(need)>0:aroundit=[]try:if x-2<0:print(1+"1")alist[x-2][y]=0if (x-2,y) in need:aroundit.append("alist[x-1][y],x=(0,x-2)")except:while False:print()try:alist[x+2][y]=0if (x+2,y) in need:aroundit.append("alist[x+1][y],x=(0,x+2)")except:while False:print()try:alist[x][y+2]=0if (x,y+2) in need:aroundit.append("alist[x][y+1],y=(0,y+2)")except:while False:print()try:if y-20:listing.append((x,y))exec(random.choice(aroundit))need.remove((x, y))else:x,y=listing[-1]listing.pop()x2=0y2=1listing2=[]while not(alist[-1][-2]==2):alist[x2][y2]=3around2=[]try:if x2-1<0:print(1+"1")if alist[x2-1][y2]==0:around2.append("x2=x2-1")except:while False:print()try:if alist[x2+1][y2]==0:around2.append("x2=x2+1")except:while False:print()try:if alist[x2][y2+1]==0:around2.append("y2=y2+1")except:while False:print()try:if y2-10:listing2.append((x2,y2))exec(random.choice(around2))else:alist[x2][y2]=2x2,y2=listing2[-1]listing2.pop()alist[-1][-2]=3for i in range(len(alist)):for j in range(len(alist[0])):if alist[i][j]==2:alist[i][j]=0print("完成!用時(shí){}秒".format(time.time()-e))if saveit=="1":ccc = askdirectory()h=""bbbbb=1while True:try:open("{}/{}×{}迷宮{}.png".format(ccc,a,b,h),"r")open("{}/{}×{}迷宮(正確線(xiàn)路){}.png".format(ccc,a,b,h),"r")h="({})".format(bbbbb)except:breakbbbbb+=1pygame.init()icon=pygame.image.load("迷宮.png")pygame.display.set_icon(icon)screen=pygame.display.Info()screen = pygame.display.set_mode((l*(2*a+1),l*(2*b+1)))pygame.display.set_caption('迷宮')screen.fill("white")if saveit=="1":c = pygame.Surface((l, l), flags=pygame.HWSURFACE)c.fill(color='white')d = pygame.Surface((l, l), flags=pygame.HWSURFACE)d.fill(color='black')f = pygame.Surface((l, l), flags=pygame.HWSURFACE)f.fill(color='white')for i in range(2 * a + 1):for j in range(2 * b + 1):if alist[i][j] == 0:screen.blit(c, (i * l, j * l))elif alist[i][j] == 1:screen.blit(d, (i * l, j * l))else:screen.blit(f, (i * l, j * l))pygame.image.save(screen, "{}/{}×{}迷宮{}.png".format(ccc, a, b, h))c = pygame.Surface((l, l), flags=pygame.HWSURFACE)c.fill(color='white')d = pygame.Surface((l, l), flags=pygame.HWSURFACE)d.fill(color='black')f = pygame.Surface((l, l), flags=pygame.HWSURFACE)f.fill(color='red')for i in range(2 * a + 1):for j in range(2 * b + 1):if alist[i][j] == 0:screen.blit(c, (i * l, j * l))elif alist[i][j] == 1:screen.blit(d, (i * l, j * l))else:screen.blit(f, (i * l, j * l))pygame.image.save(screen, "{}/{}×{}迷宮(正確線(xiàn)路){}.png".format(ccc, a, b, h))c = pygame.Surface((l, l), flags=pygame.HWSURFACE)c.fill(color='white')d = pygame.Surface((l, l), flags=pygame.HWSURFACE)d.fill(color='black')f = pygame.Surface((l, l), flags=pygame.HWSURFACE)f.fill(color='white')for i in range(2*a+1):for j in range(2*b+1):if alist[i][j]==0:screen.blit(c, (i*l, j*l))elif alist[i][j]==1:screen.blit(d, (i*l, j*l))else:screen.blit(f,(i*l, j*l))pygame.display.flip()aaaaaaa = 0while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.MOUSEBUTTONDOWN:if aaaaaaa == 1:aaaaaaa = 0c = pygame.Surface((l, l), flags=pygame.HWSURFACE)c.fill(color='white')d = pygame.Surface((l, l), flags=pygame.HWSURFACE)d.fill(color='black')f = pygame.Surface((l, l), flags=pygame.HWSURFACE)f.fill(color='white')for i in range(2 * a + 1):for j in range(2 * b + 1):if alist[i][j] == 0:screen.blit(c, (i * l, j * l))elif alist[i][j] == 1:screen.blit(d, (i * l, j * l))else:screen.blit(f, (i * l, j * l))pygame.display.flip()else:aaaaaaa = 1c = pygame.Surface((l, l), flags=pygame.HWSURFACE)c.fill(color='white')d = pygame.Surface((l, l), flags=pygame.HWSURFACE)d.fill(color='black')f = pygame.Surface((l, l), flags=pygame.HWSURFACE)f.fill(color='red')for i in range(2 * a + 1):for j in range(2 * b + 1):if alist[i][j] == 0:screen.blit(c, (i * l, j * l))elif alist[i][j] == 1:screen.blit(d, (i * l, j * l))else:screen.blit(f, (i * l, j * l))pygame.display.flip()
文章來(lái)自
【Python迷宮生成器】本文到此結(jié)束,希望對(duì)大家有所幫助 。