Изменение переменной экземпляра класса из другого класса - PullRequest
2 голосов
/ 01 октября 2019

В настоящее время я пишу игру Tic Tac Toe для командной строки в Ruby, и у меня возникают проблемы с заменой ячейки на игровом поле на маркер игрока («X» или «O»). В моем коде я обращаюсь к переменной класса cells в классе GameBoard через мой метод make_move в экземпляре класса Player. Однако, когда я запускаю код, ячейка не меняется.

Код:

class GameBoard

    attr_accessor :cells

    def initialize 
        @@cells = [1,2,3,4,5,6,7,8,9]
        display_board
    end

    def self.cells 
        @@cells
    end

    def display_board
        @@cells[0..2].each{|n| print n.to_s + " | "}
        print "\n-----------\n"
        @@cells[3..5].each{|n| print n.to_s + " | "}
        print "\n-----------\n"
        @@cells[6..8].each{|n| print n.to_s + " | "}
    end

end

class Player
    def initialize marker
        @marker = marker
    end

    def make_move number
        GameBoard.cells[number - 1] = @marker.to_s
    end
end 

def play_game
    puts "Welcome to Tic-Tac-Toe!"
    GameBoard.new
end

play_game
bob = Player.new("X")
bob.make_move(1)

Должен отображаться:

             X | 2 | 3
            -----------
             4 | 5 | 6
            -----------
             7 | 8 | 9

1 Ответ

4 голосов
/ 01 октября 2019

Это потребовало некоторого рефакторинга, чтобы сделать его более идиоматичным Ruby, но результат здесь:

class GameBoard
  attr_accessor :cells

  def initialize 
    # Use an instance variable that's local to this particular instance
    @cells = [1,2,3,4,5,6,7,8,9]
  end

  # Define a method that represents this as a string. Note that it's not 
  # printed, meaning the caller can decide how to use this data.
  def to_s
    # Use each_slice to pull out rows of 3 and use join to glue them together
    # in the right layout.
    @cells.each_slice(3).map do |row|
      # Each row is converted from [1,2,3] to "1 | 2 | 3"
      row.join(' | ')
    end.join("\n" + "-" * 10 + "\n")
  end
end

class Player
  # Players are attached to particular boards with a marker
  def initialize marker, board
    @marker = marker
    @board = board
  end

  def make_move number
    @board.cells[number - 1] = @marker.to_s
  end
end 

Тогда основной раздел кода теперь выглядит так:

puts "Welcome to Tic-Tac-Toe!"
board = GameBoard.new

bob = Player.new("X", board)
bob.make_move(1)

# Here the .to_s method is called automatically by puts
puts board
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...