Maze generation: Difference between revisions

→‎{{header|Elixir}}: change :random -> :rand module, Process dictionary -> Map
m (J: add some comments - probably should make a sub-page which goes into more detail)
(→‎{{header|Elixir}}: change :random -> :rand module, Process dictionary -> Map)
Line 1,815:
<lang elixir>defmodule Maze do
def generate(w, h) do
maze = (for i <- 1..w, j <- 1..h, into: Map.new, do: {{:vis, i, j}, true})
:random.seed(:os.timestamp)
(for i <- 1..w, j <- 1 |> walk(:rand..huniform(w), do: {i,j}rand.uniform(h)) |>
print(maze, w, h)
Enum.each(fn{i,j} -> Process.put({:vis, i, j}, true) end)
maze
walk(:random.uniform(w), :random.uniform(h))
print(w, h)
end
defp walk(map, x, y) do
ProcessEnum.putshuffle({:vis [[x-1,y], [x,y+1], [x+1,y}], false[x,y-1]] )
|> Enum.eachreduce(EnumMap.shuffleput([[x-1map,y] {:vis, [x,y+1], [x+1,y]}, [x,y-1]]false), fn [i,j],acc ->
if Process.get(acc[{:vis, i, j})] do
{k, v} = if i == x, do: Process.put({{:hor, x, max(y, j)}, "+ ")},
else: Process.put({{:ver, max(x, i), y}, " ")}
walk(Map.put(acc, k, v), i, j)
else
acc
end
end)
end
defp print(map, w, h) do
Enum.each(1..h, fn j ->
IO.puts (Enum.mapmap_join(1..w, fn i -> ProcessMap.get(map, {:hor, i, j}, "+---") end) |> Enum.join) <> "+"
IO.puts (Enum.mapmap_join(1..w, fn i -> ProcessMap.get(map, {:ver, i, j}, "| ") end) |> Enum.join) <> "|"
end)
IO.puts String.duplicate("+---", w) <> "+"
Line 1,868 ⟶ 1,869:
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
</pre>
 
=={{header|Elm}}==
<lang elm>import Maybe as M
Anonymous user