Вот некоторые вещи, которые могут помочь, основываясь на том, что я вижу в примере кода.
Это простой способ создать массив, если вы хотите, чтобы он был определенного размера, заполненного nil
значениями:
foo = [nil] * 5
=> [nil, nil, nil, nil, nil]
Если вы хотите сплести два массива, таких как массив нулей и другой со значениями:
TOTAL_ELEMENTS = 5
([nil] * TOTAL_ELEMENTS).zip((1..TOTAL_ELEMENTS).to_a).flatten
=> [nil, 1, nil, 2, nil, 3, nil, 4, nil, 5]
Исходя из комментария ОП ниже, что это для игры в крестики-нолики, вот несколько способов создать x
:
Array.new(9)
[nil] * 9
Оба из которых возвращают:
=> [nil, nil, nil, nil, nil, nil, nil, nil, nil]
Это полезно, если вы получаете координату ячейки в виде смещения от 0.
Для сетки крестики-нолики может быть более полезно иметь три строки по три столбца, если вы получаете координаты ячейки в виде пары строка / столбец:
Array.new(3) { Array.new(3) }
[[nil] * 3] * 3
Возвращение:
=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
И некоторые вещи для медитации:
ROWS = COLUMNS = 3
x = Array.new( ROWS * COLUMNS ) # for offsets
x = Array.new(ROWS) { Array.new(COLUMNS) } # for rows and columns
Если вы получаете свою позицию как смещение, но хотите преобразовать ее в строку / столбец,
используйте divmod
. Ваше смещение будет 0,8, и будет преобразовано в сетку 3х3,
то есть [0..2][0..2]
. Конвертировать обратно тоже легко:
def row_col_to_offset(x,y)
x * ROW + y
end
>> row_col_to_offset(0,0) # => 0
>> row_col_to_offset(0,1) # => 1
>> row_col_to_offset(1,1) # => 4
>> row_col_to_offset(2,2) # => 8
def offset_to_row_col(o)
o.divmod(ROW)
end
>> offset_to_row_col(0) # => [0, 0]
>> offset_to_row_col(1) # => [0, 1]
>> offset_to_row_col(4) # => [1, 1]
>> offset_to_row_col(8) # => [2, 2]
Теперь вам нужно узнать о переменных экземпляра @
в Ruby и правильном использовании метода initialize
.