首页 > 解决方案 > 极小极大算法井字游戏

问题描述

我坚持为井字游戏实现极小极大算法。我每次都遇到同样的错误(未定义的方法 `<' for nil:NilClass (NoMethodError))但似乎无法修复它。

我的实现如下:

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 = []

  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'
    for hsh in moves
      hsh.each do |move, score|
        if score > best_score
          best_move = move
          best_score = score
        end
      end
    end
  else
    for hsh in moves 
      hsh.each do |move, score|
        if score < best_score
          best_move = move
          best_score = score
        end
      end
    end
  end
  best_move
end

我已经坚持了好几天了,所以任何帮助都将不胜感激。

这是我的其余代码:https ://github.com/YBirader/launch_school/blob/master/RB101/lesson_6/ttt.rb

标签: rubyalgorithmtic-tac-toeminimax

解决方案


我刚刚经历并调试了这个。

事实证明,minimax 方法偶尔会返回 nil,然后将其推入第 94 行的移动哈希中,因为它无法将 nil 与任何数字进行比较,>否则<会引发错误,我们无法继续。

当结果为 nil 时,您只需要添加一个回退到 0,将第 91 行更改为:

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

您也不需要score在循环之外定义,因为该变量仅用于将其添加到第 94 行的哈希中。我之前错过的是在each循环中再次定义了分数。


推荐阅读