【问题标题】:Anyone fancy a challenge? minimax tic-tac-toe有人喜欢挑战吗? minimax 井字游戏
【发布时间】:2020-12-01 10:42:50
【问题描述】:

我一直坚持为井字游戏实现极小极大算法。我每次都遇到同样的错误(未定义的方法 `

我的极小极大实现如下:

def minimax(current_board, current_player)
  if user_won?(current_board)
    return -10
  elsif computer_won?(current_board)
    return 10
  elsif tie?(current_board)
    return 0
  end

  available_squares = empty_squares(current_board)
  moves = []
  score = nil

  available_squares.each do |available_square|
    move = {}
    current_board[available_square] = COMPUTER_MARKER if current_player == 'computer'
    current_board[available_square] = PLAYER_MARKER if current_player == 'player'
    score = minimax(current_board, alternate_player(current_player))
    current_board[available_square] = INITIAL_MARKER
    move[available_square] = score
    moves.push(move)
  end

  best_move = nil
  best_score = current_player == 'computer' ? -Float::INFINITY : Float:: INFINITY

  if current_player == 'computer'
    moves.each do |hsh|
      hsh.each do |move, score|
        if score > best_score
          best_move = move
          best_score = score
        end
      end
    end
  else
    moves.each do |hsh| 
      hsh.each do |move, score|
        if score < best_score
          best_move = move
          best_score = score
        end
      end
    end
  end
  best_move
end

当递归调用 minimax 时,它有时会返回 nil,然后将其附加到 move 散列中,其中 move 然后附加到 moves 数组中。这会导致&lt; 运算符引发上述异常。我不知道为什么nil 会被退回。

我只能假设我的逻辑有缺陷。在尝试了可能的电路板状态后,我的电路板可能没有正确重置,但老实说,我不知道如何继续。我尝试了多种实现,但总是得到相同的错误。

我已经坚持了一个多星期,非常感谢一些帮助。

【问题讨论】:

  • 这能回答你的问题吗? minimax algorithm tic-tac-toe
  • 不 :(。不幸的是它没有。
  • “我不知道为什么返回 nil” – 当moves 为空时,即[]best_move 保持nil 然后变为返回值。
  • 我不明白minimax 是如何工作的,但是如果您需要一个数值,您可以将方法的最后一行更改为best_move || 0 以提供默认值(将0 更改为任何值有道理)
  • 没关系@Stefan。我不知道 Ruby 但 MiniMax 并尝试解决问题 ;)

标签: ruby recursion tic-tac-toe minimax


【解决方案1】:

我想我找到了问题所在。在我的if tie?(current_board) 条件下,tie? 应该采用available_squares 参数。这会阻止引发异常。

另外,正如@Stefan 指出的(归功于他),设置默认值可确保输出正确的值,并且可以写为:

score = minimax(current_board, alternate_player(current_player)) || 0

这样就解决了。

【讨论】:

    【解决方案2】:

    循环available_squares.each 必须跟在return 0 ifc 之后,那里不再移动。

    【讨论】:

    • 但这不是在我的终端条件下得到照顾的,我写过:if tie?(board) return 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多