2014-11-01 3 views
3

Друг и я пытаемся написать программу подметания в Луа, используя рамки Löve. Пока код должен проверить, проверен ли флажок (ячейка), а затем нарисовать его. Мы новичок в Lua, у программы теперь есть недостаток, что она работает только в правом нижнем углу.Как инициализировать таблицу с таблицами в Lua?

ОБНОВЛЕНИЕ: Глядя на него сейчас, я вижу, что значения инициализированного GameBoard имеют одинаковое значение (т. Е. GameBoard[1] до GameBoard[150] - все одинаковые ячейки).

Вот код:

conf.lua имеет некоторые глобальные переменные, определенные:

function love.conf(t) 

    -- Global variables. 
    CELL_SIZE = 40 
    NUM_ROWS = 15 
    NUM_COLS = 10 
    STATS_HEIGHT = 100 
    AMOUNT_OF_CELLS = NUM_ROWS * NUM_COLS 
    GRID_WIDTH = 400 
    GRID_HEIGHT = 700 

end 

Вот соответствующий провал код в main.lua (он идет неправильно в методе загрузки, где GameBoard заполнен Cell с.

-- The Cell table is used for every individual square on 
-- the gameboard 
Cell = {} 

-- The Gameboard (150 Cell objects) 
GameBoard = {} 

-- The function new belongs to Cell and spawns a new object (a table) 
-- with the same attributes as Cell. 
function Cell:new(i, j) 

-- each cell knows: 
    -- its x- and y-coordinates. 
    self.x_min = (i-1) * CELL_SIZE 
    self.x_max = (CELL_SIZE-1) + (i-1) * CELL_SIZE 
    self.y_min = STATS_HEIGHT + (j-1) * CELL_SIZE 
    self.y_max = STATS_HEIGHT + (CELL_SIZE-1) + (j-1) * CELL_SIZE 

    -- if it is a mine (determined with random number generator) 
    isMine = (math.random(1, 8) % 8 == 0) -- Roughly 0.15 (1/7) times true (is a mine) 
    self.isMine = isMine 

    -- do not check the mine initially 
    self.checked = false 

    -- return the cell object 
    return self; 

end 


-- love.load is a love-function that is called once when the game 
-- starts. 
function love.load() 

    -- The index of the cell on the GameBoard (ranging from 1 to 150) 
    local index = 1 

    -- Build a two dimensional table of Cell-objects 
    for i = 1, NUM_COLS, 1 do 
     for j = 1, NUM_ROWS, 1 do  
      GameBoard[ index ] = Cell:new(i, j) 
      index = index + 1 
     end 
    end 
end 

В результате все коробки имеют значения lo wer box с индексом 150 (последний с NUM_ROWS * NUM_COLS = 150). Все элементы (Cells) таблицы (Gameboard) имеют те же значения x и y, что и в методе Cell:new.

Было бы полезно, если бы кто-нибудь мог рассказать нам, как правильно инициализировать и получить доступ к таблице таблиц.

+0

Комментарий о стиле: 'cell.checked' вместо' cell ["checked"] 'и т. Д. – lhf

+0

@inf Спасибо за совет. Это был первый день на этом языке. Вы видите, почему код работает только в правом нижнем углу? Может ли это иметь что-то с переменным объемом? –

ответ

3

В функции Cell:new, self есть таблица Cell, поэтому вы возвращаете ту же таблицу каждый раз.

Простое исправление, чтобы создать новую таблицу вместо:

function Cell:new(i, j) 
    local t = {} 

    t.x_min = (i-1) * CELL_SIZE 
    --omit the rest 

    return t; 
end 

Для дальнейшего улучшения, вы можете быть заинтересованы другим способом, который реализует прототип:

function Cell:new(i, j) 
    local o = {} 
    setmetatable(o, self) 
    self.__index = self 

    self.x_min = (i-1) * CELL_SIZE 
    --omits rest 

    return o; 
end 

Читать PiL: Object-Oriented Programming для получения дополнительной информации ,

+0

Спасибо! Доска работает сейчас. :-) –