我正在尝试使用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]
答案 0 :(得分:2)
错误消息非常明确地说明了问题所在:您试图在[]
上致电nil
,但nil
没有回复[]
。您致电[]
的唯一地点是max_by
的结果。在空max_by
上调用时,nil
会返回Enumerable
。因此,best_score
必须为空。事实上:你总是将空Hash
作为参数传递给best_score
,而你永远不会修改best_score
,所以它始终是空的。