# encoding:utf-8import turtle
from random import randint
defget_maze_list(file_path):"""根据文本生成迷宫列表,文本包含1,2,S,E,以空格间隔,1,2为墙,S为起始点,E为终点"""withopen(file_path)as f:
lines = f.readlines()return[_.strip().split(' ')for _ in lines]defdraw_maze(list_maze):# 分别代表起点的x,y坐标位置,行数,列数,结合global返回数值global x_start, y_start, ci_start, ri_start
for ri inrange(len(list_maze)):for ci inrange(len(list_maze[0])):# 如果为墙则画灰色正方形if list_maze[ri][ci]in['1','2']:
draw_cell(ci, ri)# 如果为起点,则返回全局变量,同时标记为青色点elif list_maze[ri][ci]=='S':# cell_size为主程序变量,代表迷宫图形中一个单元格的像素尺寸,迷宫列表与迷宫图形相对位置一致,即列数方向一致,行数方向相反
x_start, y_start =(ci - cols_count *0.5+0.5)* cell_size,(rows_count *0.5- ri -0.5)* cell_size
ci_start, ri_start = ci, ri
draw_dot(ci, ri,'cyan')# 如果为终点,则标记红点elif list_maze[ri][ci]=='E':
draw_dot(ci, ri,'red')defskip_to(x, y, pen):"""turtle跳跃至指定坐标点"""
pen.up()
pen.goto(x, y)
pen.down()defdraw_cell(ci, ri):# cell_size为主程序变量,代表迷宫图形中一个单元格的像素尺寸,(x,y)分别为单元格的左上角坐标
x, y =(ci - cols_count *0.5)* cell_size,(rows_count *0.5- ri)* cell_size
skip_to(x, y, t_cell)# 随机颜色,RGB需要一致,否则可能不是灰色
n = randint(110,150)
t_cell.color((n, n, n),(n, n, n))
t_cell.begin_fill()for _ inrange(4):
t_cell.forward(cell_size)
t_cell.right(90)
t_cell.end_fill()defdraw_dot(ci, ri, color):# cell_size为主程序变量,代表迷宫图形中一个单元格的像素尺寸,(x,y)分别为单元格的左上角坐标向右下方偏移cell_size*0.5,即x+0.5,y-0.5
x, y =(ci - cols_count *0.5)* cell_size + cell_size *0.5,(rows_count *0.5- ri)* cell_size - cell_size *0.5
skip_to(x, y, t_cell)
t_cell.dot(int(cell_size *0.5), color)defdraw_path(ci, ri, color='blue'):# cell_size为主程序变量,代表迷宫图形中一个单元格的像素尺寸,(x,y)分别为单元格的左上角坐标向右下方偏移cell_size*0.5,即x+0.5,y-0.5
x, y =(ci - cols_count *0.5)* cell_size + cell_size *0.5,(rows_count *0.5- ri)* cell_size - cell_size *0.5
t_line.pencolor(color)
t_line.goto(x, y)defsearch_next(list_maze, ci, ri):# 如果为终点,返回if list_maze[ri][ci]=='E':
draw_path(ci, ri)returnTrueelif list_maze[ri][ci]in['1','2','TRIED']:returnFalseelifnot(0<= ci < cols_count and0<= ri < rows_count):returnFalse
draw_path(ci, ri)# 走过标记
list_maze[ri][ci]='TRIED'# 下一步四个方向,改变方向会影响优先级for x_add, y_add in[(-1,0),(0,1),(0,-1),(1,0)]:# 关键代码,调用自己
isfound = search_next(list_maze, ci + x_add, ri + y_add)if isfound:
draw_path(ci, ri,'green')returnTrueelse:
draw_path(ci, ri,'red')returnFalseif __name__ =='__main__':
list_maze = get_maze_list(r'../turtle练习/301.txt')
rows_count, cols_count, cell_size =len(list_maze),len(list_maze[0]),20
scr = turtle.Screen()
scr.tracer(0)
scr.colormode(255)# 设置窗口大小
scr.setup(cols_count * cell_size, rows_count * cell_size)
t_cell, t_line = turtle.Turtle(), turtle.Turtle()for t in[t_cell, t_line]:
t.hideturtle()
t_line.pensize(cell_size *0.2)# 绘制迷宫图
draw_maze(list_maze)# turtle跳到起点,参数为实际坐标点,非行/列数
skip_to(x_start, y_start, t_line)# 开启动画
scr.tracer(1)# 调用递归函数
search_next(list_maze, ci_start, ri_start)
turtle.done()
1111111111111111111111111111111111000202000002000002000200000000011010101012121012121012101212101211100000020000000002020000000200011110121212101210121010101010121011100 S 00000002020000000202020002011110101212121010121010101010101011100200020000020002020202020202011110101210101012121010101012101211100200000202000202020202000202011110101010121212101210101012101011100202020000000000020202000200011110121210121210101212121212101011100200000000020200000000000202011112101010101010101012101012101211100002020202020202020002000202011112101212121212101012101210101011100000000000020202020000020200011110121210121210121010101210121011100200000000000002020200 E 2020001111111111111111111111111111111111