% Copyright (C) 2023 by Sicheng Du % This project is distributed under the LaTeX Project Public License, version 1.3c. %-------------------------% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{maze}[1.2] \ExplSyntaxOn \int_new:N\l_maze_rand_int \int_new:N\l_maze_old_int \int_new:N\l_maze_new_int \dim_const:Nn\g_maze_size_dim{\linewidth} \intarray_new:Nn\g_maze_map_intarray{10000} \intarray_new:Nn\g_walls_v_intarray{9900} \intarray_new:Nn\g_walls_h_intarray{9900} \newcommand{\m@ze}[2]{ \sys_gset_rand_seed:n{#2} \intarray_gzero:N\g_maze_map_intarray \intarray_gzero:N\g_walls_v_intarray \intarray_gzero:N\g_walls_h_intarray \int_step_inline:nn{#1*#1}{ \intarray_gset:Nnn\g_maze_map_intarray{##1}{##1} } \int_step_inline:nn{#1*(#1-1)}{ \intarray_gset:Nnn\g_walls_v_intarray{##1}{1} \intarray_gset:Nnn\g_walls_h_intarray{##1}{1} } \bool_do_until:nn{ \int_compare_p:nNn{\intarray_item:Nn\g_maze_map_intarray{1}} ={\intarray_item:Nn\g_maze_map_intarray{#1*#1}} }{ \int_set:Nn\l_maze_rand_int{\int_rand:n{#1*(#1-1)}} \int_compare:nNnTF{0}={\intarray_item:Nn\g_walls_v_intarray{\l_maze_rand_int}}{}{ \int_compare:nNnTF{ \intarray_item:Nn\g_maze_map_intarray{ \l_maze_rand_int+\int_div_truncate:nn{\l_maze_rand_int-1}{#1-1} } }={ \intarray_item:Nn\g_maze_map_intarray{ 1+\l_maze_rand_int+\int_div_truncate:nn{\l_maze_rand_int-1}{#1-1} } }{}{ \int_set:Nn\l_maze_new_int{ \intarray_item:Nn\g_maze_map_intarray{ 1+\l_maze_rand_int+\int_div_truncate:nn{\l_maze_rand_int-1}{#1-1} } } \int_set:Nn\l_maze_old_int{ \intarray_item:Nn\g_maze_map_intarray{ \l_maze_rand_int+\int_div_truncate:nn{\l_maze_rand_int-1}{#1-1} } } \intarray_gset:Nnn\g_walls_v_intarray{\l_maze_rand_int}{0} \int_step_inline:nn{#1*#1}{ \int_compare:nNnTF{\l_maze_old_int}={\intarray_item:Nn\g_maze_map_intarray{##1}} {\intarray_gset:Nnn\g_maze_map_intarray{##1}{\l_maze_new_int}}{} } } } \int_set:Nn\l_maze_rand_int{\int_rand:n{#1*(#1-1)}} \int_compare:nNnTF{0}={\intarray_item:Nn\g_walls_h_intarray{\l_maze_rand_int}}{}{ \int_compare:nNnTF{\intarray_item:Nn\g_maze_map_intarray{\l_maze_rand_int}} ={\intarray_item:Nn\g_maze_map_intarray{#1+\l_maze_rand_int}}{}{ \int_set:Nn\l_maze_new_int{ \intarray_item:Nn\g_maze_map_intarray{#1+\l_maze_rand_int} } \int_set:Nn\l_maze_old_int{ \intarray_item:Nn\g_maze_map_intarray{\l_maze_rand_int} } \intarray_gset:Nnn\g_walls_h_intarray{\l_maze_rand_int}{0} \int_step_inline:nn{#1*#1}{ \int_compare:nNnTF{\l_maze_old_int}={\intarray_item:Nn\g_maze_map_intarray{##1}} {\intarray_gset:Nnn\g_maze_map_intarray{##1}{\l_maze_new_int}}{} } } } } } \NewDocumentCommand\maze{mO{\c_sys_minute_int}}{ \m@ze{#1}{#2} \setlength{\unitlength}{\fp_eval:n{.4/#1}\g_maze_size_dim} \begin{picture}(#1,#1)(0,0) \put(0,0){\line(0,1){#1}} \put(#1,#1){\line(0,-1){#1}} \put(\int_eval:n{#1-1},#1){\line(-1,0){\int_eval:n{#1-1}}} \put(1,0){\line(1,0){\int_eval:n{#1-1}}} \int_step_inline:nn{#1*(#1-1)}{ \int_compare:nNnTF{0}={\intarray_item:Nn\g_walls_h_intarray{##1}}{}{ \put( \int_mod:nn{##1-1}{#1}, \int_eval:n{1+\int_div_truncate:nn{##1-1}{#1}} ){\line(1,0){1}} } \int_compare:nNnTF{0}={\intarray_item:Nn\g_walls_v_intarray{##1}}{}{ \put( \int_mod:nn{##1}{#1-1}, \int_div_truncate:nn{##1-1}{#1-1} ){\line(0,1){1}} } } \end{picture} } \ExplSyntaxOff % End of package code