试图剔除一组,但该组不断消失

时间:2019-06-23 20:12:51

标签: ruby

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

尝试

copy = something.dup

因为刚结束

copy = something

copysomething指向同一对象。您可以通过检查变量引用的对象的object_id来确认这一点。如果相同,则它是同一对象。

dup对象时,将创建副本。根据您想要dup的内容,您可能需要实现/覆盖创建副本的逻辑。对于StringHash之类的内置类,它将立即可用。

请注意,嵌套构造(即包含其他哈希的哈希)不会重复。

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