Многомерные массивы в Monkey

Всем привет! Наткнулся на один интересный момент экспериментируя с Monkey. Представим себе к примеру 2d тайловую карту. Самый удобный способ реализации — двумерный массив. Объявление многомерных массивов в Monkey несколько отличается от BlitzMax:

Local cells:Int[][]

К такому массиву обращаться пока нельзя. Надо сначала его инициализировать. Я создал две локальные переменные width — ширина нашего массива height — высота нашего массива чтоб было проще ориентироваться.

Local width:Int = 24
Local height:Int = 12

Так работать не будет!

Local cells:Int[][] cells = New Int[ width ][ height ]

Надо сначала проинициализировать массив «по ширине», а потом уже работать с ним дальше.

Local cells:Int[][] cells = New Int[ width ][]

Теперь у нас получился числовой массив, где к каждому Int индексу приделан пустой массив. Для того чтоб нашему массиву помимо «ширины» указать ещё и «высоту» надо циклически каждой уже созданной ячейке присвоить «новый» Int массив с нужной нам «высотой».

For Local i:int = 0 Until width
    Self.cells[i] = New Int[height]
Next

Теперь к такому массиву можно спокойно обращаться например так:

cells[3][3] = 255
Print cells[3][3]

Несколько необычно, но привыкнуть можно. С одной стороны такой подход менее удобен чем в BlitzMax, но с другой стороны теперь можно делать неравномерные и разнотиповые массивы. Думаю этому можно найти применение.

И как бонус класс — сетка, используйте на своё усмотрение:

Class Grid
    Private
        Field cells:Int[][]
        Field width:Int, height:Int
    Public
        Method New(gridWidth:Int, gridHeight:Int)
            Self.width = gridWidth
            Self.height = gridHeight

            Self.cells = New Int[gridWidth][]
            For Local i:int = 0 Until gridWidth
                Self.cells[i] = New Int[gridHeight]
            Next 
        End Method

        Method GetWidth:Int()
            Return width
        End Method

        Method GetHeight:Int()
            Return height
        End Method

        Method Get:Int(x:Int , y:Int)
            If x < 0 Or x > (width -1) Or y < 0 Or y > (height -1) Then Return -1   
            Return cells[x][y]
        End Method

        Method Set:Void(x:Int, y:Int, value:Int)
            If x < 0 Or x > (width -1) Or y < 0 Or y > (height -1) Then Return
            cells[x][y] = value
        End Method
End Class