1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
% Copyright (C) 2023 by Sicheng Du <siddsc@foxmail.com>
% 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
|