我在Ruby中编写mastermind game。到目前为止,我的代码位于here on github。
我遇到的问题是:当我运行下面的函数时,在游戏开始时生成的实例变量@code在第一次运行函数后返回空。
我已经分配了一个局部变量,tempcode,@ code的值,并且所有操作都是在函数内的tempcode中完成的。我还为@code分配了一个attr_reader,而不是attr_accessor。所以@code不应该改变!
def compare_guess_to_code()
correct_color = "1"
correct_color_and_pos = "2"
incorrect_color = "0"
tempcode = @code
a = 0
@guess.length.times do #maybe a for loop that goes through both arrays simultaneously?
case
when @guess[a] == tempcode[a]
feedback.push(correct_color_and_pos)
tempcode.delete_at[a]
@guess.delete_at[a]
when guess[a] != tempcode[a] && tempcode.include?(guess[a])
feedback.push(correct_color)
tempcode.delete_at[a]
@guess.delete_at[a]
when !(tempcode.include?(guess[a]))
feedback.push(incorrect_color)
tempcode.delete_at[a]
@guess.delete_at[a]
else
puts "Error"
end
end
feedback.sort!
feedback.reverse!
print "Feedback: #{feedback}"
end
反馈回复正常,一切似乎都运行良好,我只是不能在@code清空之前多次执行比较功能。我怎样才能保持价值一致?
如果要运行程序进行测试,请使用mastermind / lib / mastermind.rb。
答案 0 :(得分:0)
您分配数组tempcode = @code
并使用tempcode.delete_at[a]
进行修改,这也会改变@code。要解决此问题,您可以使用
tempcode = @code.clone
这种方式@code
不受tempcode'
更改
答案 1 :(得分:0)
当您指定一个数组时,它只复制引用,并且它们都指向相同的引用。 因此,当您打印其中任何一个时,都会反映出一个更改。
orig_array = [1,2,3,4]<br>
another_array = orig_array
puts orig_array.unshift(0).inspect
puts another_array.inspect
[0,1,2,3,4]
[0,1,2,3,4]
为避免这种情况,您可以使用Marshal从原始数组进行复制,而不会影响复制到的对象。 原始数组中的任何更改都不会更改复制到的对象。
orig_array = [1,2,3,4]<br>
another_array = Marshal.load(Marshal.dump(orig_array))
puts orig_array.unshift(0).inspect
puts another_array.inspect
[0,1,2,3,4]
[1,2,3,4]