2

我写了一个 tictactoe 程序,我正在尝试将它组织成类。

class Board
  attr_accessor :fields

  def initialize
    self.fields = {
      '1' => ' ', '2' => ' ', '3' => ' ',
      '4' => ' ', '5' => ' ', '6' => ' ',
      '7' => ' ', '8' => ' ', '9' => ' '
    }
  end
  def set_stone_at(position, stone)
    fields[position] = stone
  end
  def stone_at(position)
    stone = fields[position]
    puts stone
  end
  def show
    puts fields
  end
end

class Game
  attr_accessor :board

  def initialize
    self.board = Board.new
  end
  def print_board
    puts "\n  #{fields['1']} | #{fields['2']} | #{fields['3']}"
    puts "  --*---*---"
    puts "  #{fields['4']} | #{fields['5']} | #{fields['6']}"
    puts "  --*---*---"
    puts "  #{fields['7']} | #{fields['8']} | #{fields['9']} \n"
  end
end

board = Board.new
board.show
Game.new.board.show
game = Game.new
game.board.set_stone_at('1', 'X')
game.board.set_stone_at('2', 'O')
game.print_board

我无法fields从 classBoard中的 class访问变量Game。我收到错误消息:

in `print_board': undefined local variable or method `fields' for #<Game:0x007ffc1a895710> (NameError)

我将不胜感激任何帮助。我很感激任何帮助和解释。

4

2 回答 2

2

board.fields而不是fields.

顺便说一句,你没有变量fields;你有一个fields类的实例方法Board,它引用一个变量@fields

于 2015-12-20T12:08:47.743 回答
1

抱歉,用手机回复。看了一眼,看起来你想self.board.fields在游戏中的 print_board 方法中使用。Fields 是 Board 类的访问器。您需要将其发送到 board 类的实例。在 Game 中,如果初始化运行,您有一个访问器 board,其中有一个可用的 board 实例。因此,如果您希望游戏可用,您需要确保实例化游戏。看起来你确实这样做了。您也可以尝试@board.fields使用您的打印方法。我认为这也适用于您制作的电路板访问器。

- 在到达一台真正的计算机后添加它。这与 Ruby 中的“自我”有很大关系。您似乎已经对如何从这里开始有了很好的基本了解,尽管正如@WandMaker 提到的那样,在板外制作 #print 方法会更容易,我很高兴您这样做了。'self in ruby​​' 会出现很多有价值的相关帖子。为了获得更广泛的背景/更好的学习体验,我还推荐“The Well Grounded Rubyist”。如果你学习一些元编程,我认为你也会对这个和其他非常有用的东西有很好的理解。为此,PragProgs 的“元编程 Ruby”很好,Ruby Monk http://rubymonk.com/learning/books/上的元编程课程也是如此。

Sandi Metz 的“Practical Object Oriented Ruby”可能是最好的,但我还没有读过。想要...

得走了!

于 2015-12-20T12:08:44.570 回答