2017-03-17 74 views
0

我想制作一个TicTacToe游戏。我试图定义一个将空白字段更改为'X''O'的实例方法。通过调用该对象的实例方法更改对象值

class TicTacToe 
    attr_accessor :fields, :a1, :a2, :a3, :b1, :b2, :b3, :c1, :c2, :c3 

    def initialize 
    @a1,@a2,@a3 = " ", " ", " " 
    @b1,@b2,@b3 = " ", " ", " " 
    @c1,@c2,@c3 = " ", " ", " " 
    @fields = {a1: @a1, a2: @a2, a3: @a3, b1: @b1, b2: @b2, b3: @b3, c1: @c1, c2: @c2, c3: @c3} 
    end 

    def print_table 
    p "#{@fields[:c1]}|#{@fields[:c2]}|#{@fields[:c3]}" 
    p "#{@fields[:b1]}|#{@fields[:b2]}|#{@fields[:b3]}" 
    p "#{@fields[:a1]}|#{@fields[:a2]}|#{@fields[:a3]}" 
    p '# # #' 
    end 
end 
game = TicTacToe.new 
game.print_table #=> fields[:a1] == ' ' 

def to_x field 
    field = "Y" 
end 
p to_x game.fields[:a1] #=> fields[:a1] == 'Y' 

game.print_table #=> fields[:a1] == ' ' 
game.fields[:a1] = "X" #=> fields[:a1] == 'X' 
game.print_table #=> fields[:a1] == 'X' 

当我传递一个字符串或一个哈希对象时,Ruby会引发一个错误。我想以相反的方式并在对象上调用我的方法:

field[:a1].to_x 

我该怎么做?

我也尝试提取类之外的方法,并将对象传递给它,但我无法更改变量值。我猜ruby使得另一个引用同一个对象的对象。

我在做什么错,什么是正确的方法来做到这一点?

+0

_ “我想周围去别的办法” _ - 只是因为错误的? – Stefan

+0

*“红宝石使另一个对象引用相同的对象”* - 这听起来像是对我的矛盾。 – sawa

回答

0

字符串在Ruby中是可变的:

s = "X" 
# => "X" 
s[0] = "O" 
# => "O" 
s 
# => "O" 

所以,你可以写:

def to_x field 
    field[0] = "X" 
end 

def to_o field 
    field[0] = "O" 
end 

to_x game.fields[:a1] 
game.print_table 
# " | | " 
# " | | " 
# "X| | " 
# "# # #" 
to_o game.fields[:a1] 
game.print_table 
# " | | " 
# " | | " 
# "O| | " 
# "# # #"