Измените облицовку методом turn_left в Ruby - PullRequest
0 голосов
/ 13 ноября 2018

Мне нужно создать метод turn_left, который меняет облицовку, облицовка всегда начинается с: юг (я реализую робота, который перемещается на доску), поэтому, если я вызываю метод turn_left, следует изменить ориентацию на восток, а затем на север и наЗапад, а затем вернуться на юг.Я думаю о чем-то вроде этого:

    {
     0: S
     1: E
     2: N
     3: W
    }

это мой код

# Models the Robor behavior for the game
class Robot

 def initialize(attr = {})
 # @position = attr[:position]
 # @move = attr[:move]
   @facing = :south
 # @turn_left =
 # @turn_right =
 # @errors =
 end

 def position
 end

 def move
 end

 def facing
  @facing
 end

 def turn_left

 end

 def turn_right
 end

 def errors
 end
end

Большое вам спасибо !!!

Ответы [ 4 ]

0 голосов
/ 13 ноября 2018

Я бы пошел с градусами вместо перечисления.Таким образом, вы можете манипулировать лицевой стороной, добавляя / вычитая n градусов от текущей грани.

class Robot
  attr_accessor :facing

  def initialize(**attrs)
    self.facing = attrs[:facing] || 180 # south
  end

  def rotate!(degrees)
    self.facing = (self.facing + degrees) % 360
  end

  def rotate_left!
    rotate!(-90)
  end

  def rotate_right!
    rotate!(90)
  end
end

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

class Robot
  COMPASS_POINTS = %w[N E S W]

  # ...

  def compass_point
    seg_size = 360 / COMPASS_POINTS.size
    COMPASS_POINTS[((facing + (seg_size / 2)) % 360) / seg_size]
  end
end

Этот файл взят из geocoder gem .

Это может показаться немного сложнее, но позволяет сохранять выполненные команды как rotate: 90 или rotate: -90, если вы хотите отслеживать это.Это также позволяет вам поворачивать робота на полные (бесступенчатые) 360 градусов, если это необходимо.

0 голосов
/ 13 ноября 2018

Вы можете сохранить направления в массиве:

def initialize
  @dirs = [:S, :W, :N, :E]
end

Когда запись first является направлением направления:

def facing
  @dirs.first
end

Когда роботповорачивая налево, вы rotate! массив против часовой стрелки:

def turn_left
  @dirs.rotate! -1
end

или по часовой стрелке при повороте вправо: (1 здесь можно опустить)

def turn_right
  @dirs.rotate! 1
end
0 голосов
/ 13 ноября 2018
left = {:n=>:w, :w=>:s, :s=>:e, :e=>:n}
right = left.invert
  #=> {:w=>:n, :s=>:w, :e=>:s, :n=>:e}

pos = :s

pos = left[pos]
  #=> :e
pos = right[pos]
  #=> :w
0 голосов
/ 13 ноября 2018

Как насчет этого:

class Robot
  FACINGS = [:south, :east, :north, :west]

  def initialize(attr = {})
    @facing_index = 0 # south
  end

  def facing
    FACINGS[@facing_index]
  end

  def turn_left
    @facing_index += 1
    @facing_index %= 4
  end

  def turn_right
    @facing_index -= 1
    @facing_index %= 4
  end
end

%= 4 (или, если вы действительно хотите обобщить это, %= FACINGS.length) выполняет арифметику по модулю, чтобы "обернуть" текущий индекс обратно в диапазон 0-3.

Поэтому, увеличивая / уменьшая это число, вы можете переключаться между четырьмя направлениями.


Я не знаю, как вы собираетесь реализовать position, move и errors, но я предполагаю, что это выходит за рамки вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...