我写了一个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
中的班级Board
访问变量Game
。我收到了错误:
in `print_board': undefined local variable or method `fields' for #<Game:0x007ffc1a895710> (NameError)
我会感激任何帮助。我很感激任何帮助和解释。
答案 0 :(得分:2)
写board.fields
而不是fields
。
顺便说一下,你没有变量fields
;您在类fields
上有一个实例方法Board
,它引用变量@fields
。
答案 1 :(得分:1)
抱歉,用手机回复。从这看起来,看起来你想在游戏中的print_board方法中使用self.board.fields
。 Fields是Board类的访问器。您将要将其发送到董事会成员的实例。在Game中你有一个访问器,板,如果初始化运行,它有一个可用的板实例。因此,如果您希望可用,请确保您实例化游戏。看起来你确实那样做了。您也可以在打印方法中尝试@board.fields
。我认为这也适用于你制作的主板访问器。
- 在到达真正的计算机后添加此内容。这必须与“自我”做很多事情。在Ruby中。你似乎已经对如何在这里开始有了一个很好的基本把握,尽管如同@WandMaker提到的那样,将#print方法放在船上会更容易,我很高兴你这样做。 &#39;自我红宝石&#39;会发现很多有价值的相关帖子。为了获得更广泛的背景/更好的学习体验,我还推荐了The Well Ground Grounded Rubyist&#39;。如果你学习一些元编程,我想你也会对这个以及其他非常有用的东西有很好的理解。为此,&#39;元编程Ruby&#39;来自PragProgs很好,Ruby Monk上的元编程课程也是如此http://rubymonk.com/learning/books/。
&#39;实用面向对象的Ruby&#39; Sandi Metz可能是最好的,但我还没读过。想... ...
得走了!