【问题标题】:Minmax tic-tac-toeMinmax 井字游戏
【发布时间】:2017-05-16 17:33:21
【问题描述】:

我正在尝试使用minmax algorithm 玩井字游戏。

这是我正在使用的代码,用于在游戏中获得最佳 AI 动作。

 def get_best_move(board, next_player, depth = 0, best_score = {})
    return 0 if tie(board)
    return -1 if game_is_over(board)

    available_spaces = []
    best_move = nil
    board.each do |s|
      if s != "X" && s != "O"
        available_spaces << s
      end
    end

    available_spaces.each do |as|
      board[as.to_i] = @com
      if game_is_over(board)
        best_score[as.to_i] = -1 * get_best_move(board, @com, depth + 1, {})
        board[as.to_i] = as
        return best_score
      else
        board[as.to_i] = @hum
        if game_is_over(board)
          best_score[as.to_i] = -1 * get_best_move(board, @com, depth + 1, {})
          board[as.to_i] = as
          return best_score
        else
          board[as.to_i] = as
        end
      end
    end
    best_move = best_score.max_by { |key, value| value }[0] 
    highest_minimax_score = best_score.max_by { |key, value| value }[1] 

    if depth == 0
      return best_move
    elsif depth > 0
      return highest_minimax_score
    end
  end

我在终端运行游戏时遇到此错误,我想知道如何解决它。

rb:332:in get_best_move': undefined method `[]' for nil:NilClass (NoMethodError)

rb:332 在下面的例子中指的是这两行

best_move = best_score.max_by { |key, value| value }[0] 
highest_minimax_score = best_score.max_by { |key, value| value }[1]

【问题讨论】:

    标签: ruby recursion minmax


    【解决方案1】:

    错误消息非常清楚地说明了问题所在:您试图在nil 上调用[],但nil 没有响应[]。您调用[] 的唯一位置是max_by 的结果。 max_by 在空的Enumerable 上调用时返回nil。因此,best_score 必须为空。事实上:你总是将一个空的Hash 作为参数传递给best_score,并且你从不修改best_score,所以它永远是空的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2015-01-08
      • 1970-01-01
      • 2014-04-12
      相关资源
      最近更新 更多