导语

哈喽!
哈喽我是栗子,逐日更新来啦——

“玩迷宫游戏终年夜的我们,欣慰地看到,下一代仍热爱着这个经典游戏。

如果你的孩子也爱玩迷宫游戏,那真要恭喜你了。

你喜好走迷宫那错过这么好的就太可惜了AI版本

之前给大家更新过一款《走迷宫》的小游戏大家还记得嘛?!
后面有小伙伴儿让我做一款ai版本

的,让自动儿,本日,让我们发挥想象力,一起用代码做一款AI版本的迷宫吧!
还可以磨炼脑力一

只玩儿啦~

正文

本文小程序用递归的方法办理迷宫问题,加入了可以自动天生迷宫,但有些问题还不是很明白天生

迷宫用了很笨的方法,在天生20行、列以上的迷宫时会很慢啦~

就大略地研究一下,之后有更好的机会连续学了给大家更新滴!

1)效果展示

2)主程序

代码共紧张有三块,太多了以是这里只展示主程序的代码,完全的见文末"大众号哈!

import randomimport pygameFPS = 60ROW = 10COL = 10BLOCK = 20BORDER = 20SCREEN_WIDTH = COL BLOCK + BORDER 2SCREEN_HEIGHT = ROW BLOCK + BORDER 2IMPOSSIBLE_COLOR = (128, 128, 128)POSSIBLE_COLOR = (76, 141, 174)ROUTE_COLOR = (12, 137, 24)# noinspection PyPep8Namingclass DrawMaze(object): def __init__(self): self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) # 创建屏幕工具 pygame.display.set_caption('{}{} Maze'.format(ROW, COL)) # 窗口标题 self.clock = pygame.time.Clock() self.color = POSSIBLE_COLOR # 首先设置路径块与可能块的颜色相同 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: # 按鼠标显示路径,再按取消显示 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): """ 用遍历取出迷宫数据并在窗口中画颜色块 """ 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 PyPep8Namingclass 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): """ 如果位置是迷宫的出口,解释成功走出迷宫 依次向下、右、左、上进行探测,走的通就返回True,然后连续探测,走不通就返回False """ if x == len(maze) - 1 and y == len(maze[0]) - 1: maze[x][y] = 2 # 将出口位置做标记 return True if self.validPos(maze, x, y): # 递归主体实现 self.route_list.append((x, y)) # 将位置加入路线列表中 maze[x][y] = 2 # 做标记,防止折回 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 # 没走通把上一步位置标记取消,以便能够退回 self.route_list.pop() # 在位置列表中删除位置,即末了一个元素 return False return False @staticmethod def pprint(maze): """ 打印迷宫 """ [print(n) for n in maze] @staticmethod def validPos(maze, x, y): """ 判断坐标的有效性,如果超出数组边界或是不知足值为1的条件,解释该点无效返回False,否则返回True """ if len(maze) > x >= 0 and len(maze[0]) > y >= 0 and maze[x][y] == 1: return True else: return Falsedef main(): drawer = DrawMaze() # 用迷宫天生画图工具 drawer.display() # 显示迷宫if __name__ == '__main__': main()

​总结

兄弟姐妹们,这是你们的升级版《AI走迷宫》嘻嘻拿去不谢!

完全的素材等:滴滴我吖!
或者点击文末自取免费拿的哈~

还有更多更多源码等你来领区啦!

文章汇总——

汇总: Python文章合集 | (入门到实战、游戏、Turtle、案例等)

(文章汇总还有更多案例等你来学习啦~源码找我即可免费!