Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
60
Task/Maze-generation/Picat/maze-generation.picat
Normal file
60
Task/Maze-generation/Picat/maze-generation.picat
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
main =>
|
||||
gen_maze(8,8).
|
||||
|
||||
main([RStr,CStr]) =>
|
||||
MaxR = to_int(RStr),
|
||||
MaxC = to_int(CStr),
|
||||
gen_maze(MaxR,MaxC).
|
||||
|
||||
gen_maze(MaxR,MaxC) =>
|
||||
Maze = new_array(MaxR,MaxC),
|
||||
foreach (R in 1..MaxR, C in 1..MaxC)
|
||||
Maze[R,C] = 0
|
||||
end,
|
||||
gen_maze(Maze,MaxR,MaxC,1,1),
|
||||
display_maze(Maze,MaxR,MaxC).
|
||||
|
||||
gen_maze(Maze,MaxR,MaxC,R,C) =>
|
||||
Dirs = shuffle([left, right, up, down]),
|
||||
foreach (Dir in Dirs)
|
||||
dir(Dir,Dr,Dc,B,OB),
|
||||
R1 := R+Dr,
|
||||
C1 := C+Dc,
|
||||
if (R1 >= 1 && R1 =< MaxR && C1 >= 1 && C1 =< MaxC && Maze[R1,C1] == 0) then
|
||||
Maze[R,C] := Maze[R,C] \/ B,
|
||||
Maze[R1,C1] := Maze[R1,C1] \/ OB,
|
||||
gen_maze(Maze,MaxR,MaxC,R1,C1)
|
||||
end
|
||||
end.
|
||||
|
||||
% dir(direction, Dr, Dc, Bit, OppBit)
|
||||
dir(left, 0, -1, 1, 2).
|
||||
dir(right, 0, 1, 2, 1).
|
||||
dir(up, -1, 0, 4, 8).
|
||||
dir(down, 1, 0, 8, 4).
|
||||
|
||||
shuffle(Arr) = Res =>
|
||||
foreach (_ in 1..10)
|
||||
I1 = random() mod 4 + 1,
|
||||
I2 = random() mod 4 + 1,
|
||||
T := Arr[I1],
|
||||
Arr[I1] := Arr[I2],
|
||||
Arr[I2] := T
|
||||
end,
|
||||
Res = Arr.
|
||||
|
||||
display_maze(Maze,MaxR,MaxC) =>
|
||||
foreach (R in 1..MaxR)
|
||||
foreach (C in 1..MaxC)
|
||||
printf("%s", cond(Maze[R,C] /\ 4 == 0, "+---", "+ "))
|
||||
end,
|
||||
println("+"),
|
||||
foreach (C in 1..MaxC)
|
||||
printf("%s", cond(Maze[R,C] /\ 1 == 0, "| ", " ")),
|
||||
end,
|
||||
println("|")
|
||||
end,
|
||||
foreach (C in 1..MaxC)
|
||||
print("+---")
|
||||
end,
|
||||
println("+").
|
||||
Loading…
Add table
Add a link
Reference in a new issue