Сетка линкора - Как вставить символы новой строки в определенные моменты? - PullRequest
0 голосов
/ 15 октября 2019

Я строю линкор, пока учу себя Руби. В моем классе доски я заполняю все ячейки в диапазоне (1..4, "A" .. "D"), поэтому он выглядит как "A1", "A2", "A3" и т. Д. Буквы показывают строку, а цифры показывают столбец.

Теперь я пытаюсь сделать доску. Я подумал, что могу взять свой хэш ячеек, отделить ключи (буквенно-цифровую координату) и вставить символ новой строки после окончания каждой комбинации букв (A, затем B на \ n и C на \ n и т. Д.)Я могу заставить его работать очень статично, но я не уверен, как сделать его более динамичным, чтобы соответствовать доске - чтобы разрешить плату нестандартного размера. Мой текущий вывод выглядит следующим образом, когда я вызываю board.cells ...

{"A1"=>#<Cell:0x007f8edf3231e0 @coordinate="A1", @fired=false, @render=**".", @ship=nil**>,
"A2"=>#<Cell:0x007f8edf323118 @coordinate="A2", @fired=false, @render=**".", @ship=nil**>,
"A3"=>#<Cell:0x007f8edf323000 @coordinate="A3", @fired=false, @render=**".", @ship=nil**>,
"A4"=>#<Cell:0x007f8edf322ee8 @coordinate="A4", @fired=false, @render=**".", @ship=nil**>,
"B1"=>#<Cell:0x007f8edf322da8 @coordinate="B1", @fired=false, @render=**".", @ship=nil**>,
"B2"=>#<Cell:0x007f8edf322cb8 @coordinate="B2", @fired=false, @render=**".", @ship=nil**>,
"B3"=>#<Cell:0x007f8edf322ba0 @coordinate="B3", @fired=false, @render=**".", @ship=nil**>,
"B4"=>#<Cell:0x007f8edf322a88 @coordinate="B4", @fired=false, @render=**".", @ship=nil**>,
...C...D...etc...}

В настоящее время я работаю над рендерингом платы, поэтому моя логика заключалась в том, чтобы я мог разделить ячейки на каждую другую букву(cell.keys [0]), тогда я смогу поработать над запуском @render и манипулировать им оттуда.

Пожалуйста, скажите мне, если моя логика - дерьмо :) Мне нужна обратная связь, чтобы изучить. Кроме того, если вы знаете, как заставить \ n работать так, как я думаю, можете ли вы указать мне правильное направление? Если я думаю об этом неправильно, пожалуйста, объясните.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Допустим, это ваш класс:

class Cell
  attr_accessor :fired, :coordinate, :render, :ship

  def initialize(coord)
    @coordinate = coord
    @fired = false
    @render = '='
  end

  def fired!
    @fired = true
    @render = 'x'
  end

end

и вы определили свою таблицу Хэш:

n = 4
rows = (:a..:z).first(n)
cols = (1..n).to_a
cells = rows.product(cols).map(&:join)
#=> ["a1", "a2", "a3", "a4", "b1", "b2", "b3", "b4", "c1", "c2", "c3", "c4", "d1", "d2", "d3", "d4"]
table = cells.map { |coord| [coord, Cell.new(coord)] }.to_h

Давайте запустим одну ячейку:

table["c3"].fired!

Этоэто опция, которую вы можете визуализировать в таблице (если вы не испортили хэш, изменив порядок ячеек):

table.values.map { |cell| cell.render }.each_slice(n).to_a
# [["=", "=", "=", "="], ["=", "=", "=", "="], ["=", "=", "x", "="], ["=", "=", "=", "="]]

или в виде строки:

puts table.values.map { |cell| cell.render }.each_slice(n).map(&:join).join("\n")
# ====
# ====
# ==x=
# ====
0 голосов
/ 15 октября 2019

Я бы попробовал group_by

%w(a1 a2 a3 b1 b2 b3 c1 c2 c3).sort.group_by{|e| e[0]}

Более полный ответ:

%w(a1 a2 a3 b1 b2 b3 c1 c2 c3).sort.group_by{|e| e[0]}.each{|k, v| v.each{|e| print "#{k}=>#{e} "}; puts}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...