我正在尝试使用Donal Knuth的5guess算法为红宝石中的Mastermind游戏编程AI。该游戏由一名代码制作者和一名代码破坏者组成,代码制作者使用8个不同的彩色钉子来创建一组4个钉子,后者猜测代码并接收反馈(钉子的红色方块既是正确的颜色又是正确的位置,以及一个白色的正方形,表示颜色正确但在错误位置的钉子)。
我为所有可能的代码创建了一个集合。我的目标是将猜测中的反馈与集合中所有代码的反馈进行比较,然后删除不匹配的代码。好像删除了整个集合。
class ComputerPlayer < Player
def initialize(game)
super(game)
@all_possible_codes = create_codes
@turn = 1
end
def get_code
Array.new(4){rand(1..6)}
end
def get_guess
puts @all_possible_codes.length
if @turn == 0
@turn += 1
cull_set([1, 1, 2, 2])
@all_possible_codes.delete("1122")
return [1, 1, 2, 2]
else
random_sample = @all_possible_codes.to_a.sample.split('').map{|str| str.to_i}
@all_possible_codes.delete(random_sample.join(''))
cull_set(random_sample)
random_sample
end
end
def cull_set(guess)
feedback = @game.feedback_on_guess(guess)
puts feedback
@all_possible_codes.delete_if { |str| @game.feedback_on_guess(str.split.map{|num| num.to_i}) != feedback }
end
def create_codes
set = Set.new
(1..8).each do |i|
(1..8).each do |j|
(1..8).each do |k|
(1..8).each do |l|
set << [i, j, k, l].join('')
end
end
end
end
set
end
end
#this is the feedback_on_guess method used by the above class
def feedback_on_guess(code_guess)
code_duplicate = @code
feedback = []
code_duplicate.map.with_index do |entry, i|
if entry == code_guess[i]
feedback.push('r')
code_guess[i] = -1
-2
else
entry
end
end.each do |entry|
found_index = code_guess.find_index(entry)
if found_index
feedback.push('g')
code_guess[found_index] = -1
end
end
puts feedback
feedback
end
答案 0 :(得分:0)
尝试
copy = something.dup
因为刚结束
copy = something
copy
和something
指向同一对象。您可以通过检查变量引用的对象的object_id
来确认这一点。如果相同,则它是同一对象。
dup
对象时,将创建副本。根据您想要dup
的内容,您可能需要实现/覆盖创建副本的逻辑。对于String
,Hash
之类的内置类,它将立即可用。
请注意,嵌套构造(即包含其他哈希的哈希)不会重复。
h1 = {"a" => {"b" => 2}}
h2 = h1.dup
puts h1.object_id # 70199597610060
puts h2.object_id # 70199597627020
puts h1["a"].object_id # 70199597610080
puts h2["a"].object_id # 70199597610080