Pygame實(shí)戰(zhàn)之迷宮游戲的實(shí)現(xiàn)
導(dǎo)語
哈嘍!哈嘍我是栗子,每日更新來啦——
“玩迷宮游戲長大的我們,欣慰地看到,下一代仍熱愛著這個(gè)經(jīng)典游戲。
如果你的孩子也愛玩迷宮,那真要恭喜你了。”
之前給大家更新過一款《走迷宮》的小游戲大家還記得嘛?!后面有小伙伴兒讓我做一款ai版本的,讓自動兒,今天,讓我們發(fā)揮想象力,一起用代碼做一款A(yù)I版本的迷宮吧!還可以鍛煉腦力一直玩兒啦~
正文
本文小程序用遞歸的方法解決迷宮問題,加入了可以自動生成迷宮,但有些問題還不是很明白生成迷宮用了很笨的方法,在生成20行、列以上的迷宮時(shí)會很慢啦~
就簡單的研究一下,之后有更好的會繼續(xù)學(xué)了給大家更新滴!
1)效果展示
2)主程序
代碼共主要有三塊,太多了所以這里只展示主程序的代碼
import random import pygame FPS = 60 ROW = 10 COL = 10 BLOCK = 20 BORDER = 20 SCREEN_WIDTH = COL * BLOCK + BORDER * 2 SCREEN_HEIGHT = ROW * BLOCK + BORDER * 2 IMPOSSIBLE_COLOR = (128, 128, 128) POSSIBLE_COLOR = (76, 141, 174) ROUTE_COLOR = (12, 137, 24) # noinspection PyPep8Naming class DrawMaze(object): def __init__(self): self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) # 創(chuàng)建屏幕對象 pygame.display.set_caption('{}*{} Maze'.format(ROW, COL)) # 窗口標(biāo)題 self.clock = pygame.time.Clock() self.color = POSSIBLE_COLOR # 首先設(shè)置路徑塊與可能塊的顏色相同 self.maze = MakeMaze().create(ROW, COL) self.no_route = True def display(self): """ 在窗口中顯示迷宮,按任意鍵顯示路徑 """ while True: self.screen.fill((0, 0, 0)) for event in pygame.event.get(): if event.type == pygame.QUIT: exit() if event.type == pygame.MOUSEBUTTONDOWN: # 按鼠標(biāo)顯示路徑,再按取消顯示 if self.no_route: self.color = ROUTE_COLOR self.no_route = False else: self.color = POSSIBLE_COLOR self.no_route = True if event.type == pygame.KEYDOWN: # 按任意鍵重新生成迷宮 self.maze = MakeMaze().create(ROW, COL) self.drawBlock(self.color) self.clock.tick(FPS) pygame.display.update() def drawBlock(self, color): """ 用遍歷取出迷宮數(shù)據(jù)并在窗口中畫顏色塊 """ for i, line in enumerate(self.maze): for j, value in enumerate(line): rect = (j * BLOCK + BORDER, i * BLOCK + BORDER, BLOCK, BLOCK) if value == 0: pygame.draw.rect(self.screen, IMPOSSIBLE_COLOR, rect, 0) elif value == 1: pygame.draw.rect(self.screen, POSSIBLE_COLOR, rect, 0) else: pygame.draw.rect(self.screen, color, rect, 0) # noinspection PyPep8Naming class MakeMaze(object): def __init__(self): self.route_list = [] # 初始化路線列表 # noinspection PyUnusedLocal def create(self, x, y): """ 生成迷宮 """ route_list = [] # 初始化路線列表 while True: maze = [[random.choice([0, 1]) for j in range(y)] for i in range(x)] maze[0][0] = 1 if self.walk(maze, 0, 0): return maze def walk(self, maze, x, y): """ 如果位置是迷宮的出口,說明成功走出迷宮 依次向下、右、左、上進(jìn)行探測,走的通就返回True,然后繼續(xù)探測,走不通就返回False """ if x == len(maze) - 1 and y == len(maze[0]) - 1: maze[x][y] = 2 # 將出口位置做標(biāo)記 return True if self.validPos(maze, x, y): # 遞歸主體實(shí)現(xiàn) self.route_list.append((x, y)) # 將位置加入路線列表中 maze[x][y] = 2 # 做標(biāo)記,防止折回 if self.walk(maze, x + 1, y) or self.walk(maze, x, y + 1) \ or self.walk(maze, x, y - 1) or self.walk(maze, x - 1, y): return True else: maze[x][y] = 1 # 沒走通把上一步位置標(biāo)記取消,以便能夠退回 self.route_list.pop() # 在位置列表中刪除位置,即最后一個(gè)元素 return False return False @staticmethod def pprint(maze): """ 打印迷宮 """ [print(n) for n in maze] @staticmethod def validPos(maze, x, y): """ 判斷坐標(biāo)的有效性,如果超出數(shù)組邊界或是不滿足值為1的條件,說明該點(diǎn)無效返回False,否則返回True """ if len(maze) > x >= 0 and len(maze[0]) > y >= 0 and maze[x][y] == 1: return True else: return False def main(): drawer = DrawMaze() # 用迷宮生成畫圖對象 drawer.display() # 顯示迷宮 if __name__ == '__main__': main()
以上就是Pygame實(shí)戰(zhàn)之迷宮游戲的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Pygame迷宮的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談Python實(shí)現(xiàn)2種文件復(fù)制的方法
這篇文章主要介紹了淺談Python實(shí)現(xiàn)2種文件復(fù)制的方法,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Python下使用Trackbar實(shí)現(xiàn)繪圖板
這篇文章主要為大家詳細(xì)介紹了Python下使用Trackbar實(shí)現(xiàn)繪圖板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10Python執(zhí)行時(shí)間計(jì)算方法以及優(yōu)化總結(jié)
python腳本運(yùn)行時(shí)間遠(yuǎn)遠(yuǎn)大于python腳本中統(tǒng)計(jì)的計(jì)算時(shí)間,所以本文將為大家分享就幾個(gè)Python執(zhí)行時(shí)間計(jì)算方法以及優(yōu)化,感興趣的可以了解一下2022-08-08Python正則表達(dá)式中的量詞符號與組問題小結(jié)
這篇文章主要介紹了Python正則表達(dá)式中的量詞符號與組問題小結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08Python datetime 格式化 明天,昨天實(shí)例
這篇文章主要介紹了Python datetime 格式化 明天,昨天實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03使用Python docx修改word關(guān)鍵詞顏色的操作
這篇文章主要介紹了使用Python docx修改word關(guān)鍵詞顏色的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03python 字符串的駐留機(jī)制及優(yōu)缺點(diǎn)
字符串駐留是一種僅保存一份相同且不可變字符串的方法。這篇文章主要介紹了python 字符串的駐留機(jī)制,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Python Loguru日志封裝裝飾器實(shí)現(xiàn)過程
這篇文章主要介紹了Python Loguru日志封裝裝飾器實(shí)現(xiàn)過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03