Building a 2D game, and I’ve used multidimensional array’s in the past. However, the `Array`

version in Elm is a bit unwieldy because of all the Maybe’s + nested rows. The grid is known ahead of time, and there won’t be resizing of the lists later. Is there another data type I could use?

In general I would make a `Grid`

module and experiment with it’s internal representation.

An easy option is to just use a 1-d Array:

```
module Grid exposing (Grid, init, get)
import Array exposing (Array)
type Grid a =
Grid Int Int (Array a)
init : Int -> Int -> a -> Grid a
init w h initial =
Array.initialize (w * h) (always initial)
get : Int -> Int -> Grid a -> Maybe a
get x y (Grid w h arr) =
Array.get (y * w + x) arr
```

This would also be a great place to add domain specific functions that will make your domain logic neater:

```
neighbours : Int -> Int -> Grid a -> List a
neighbours x y (Grid w h arr as grid) =
List.filterMap (\(x_, y_) ->
if x_ >= 0 && x_ < w && y_ >= 0 && y_ < h then
get x_ y_ grid
else
Nothing
) [ ( x - 1, y), ( x, y - 1), (x + 1, y), (x, y + 1) ]
```

or what not.

Finally a quick search for “grid” on elm packages reveals a few decent looking options.

If your grid has <= 60 rows/columns, you might want to try the fixed size and safely accessible Chadtech/elm-vector

If you’re up for something more powerful/generic/experimental,

there’s lue-bird/elm-typesafe-array which allows you to safely access elements when it knows its array length. If you have questions on that, you can ask me here or @lue on slack.

There is also Dict (Int,Int) Cell

Examples:

Getting neighbours is Dict.filter (x and y absolute value one off asked position)

And allowed movement for a horse in chess is x=2 off and y is one off or the other way around and not outside board limits.

Rad, I didn’t even think to search for “Grid”, hah, appreciate that and the sample code!

Dude, this Vector is doooope!

Oh man, I completely missed that `filter`

gives you a `Dict`

back, I just assumed everything was a Maybe or List, appreciate this!

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.