ruby - 极小极大算法井字游戏
问题描述
我坚持为井字游戏实现极小极大算法。我每次都遇到同样的错误(未定义的方法 `<' 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
解决方案
我刚刚经历并调试了这个。
事实证明,minimax 方法偶尔会返回 nil,然后将其推入第 94 行的移动哈希中,因为它无法将 nil 与任何数字进行比较,>
否则<
会引发错误,我们无法继续。
当结果为 nil 时,您只需要添加一个回退到 0,将第 91 行更改为:
minimax(current_board, alternate_player(current_player)) || 0
您也不需要score
在循环之外定义,因为该变量仅用于将其添加到第 94 行的哈希中。我之前错过的是在each
循环中再次定义了分数。
推荐阅读
- android - 是否可以在给定的时间段内使用 firebase 控制台向所有用户统一发送推送通知?
- python - Scipy 像 Excel Solver 一样最小化
- ios - 资产中的 HEIC 图像生成“CompileAssetCatalog 失败,退出代码为非零”
- asynchronous - Dart 在异步修改主体上的 runZoned() 行为
- android - 在 Android 中实现应用程序更新功能
- php - 如果 opcache 是打开的,为什么我的新代码即使没有任何 php-fpm 重启也能工作?
- azure - 如何监控 AKS pod 可用性 cpu 和内存利用率?
- arduino - 禁用 esp32 softAP 的 dhcp 服务器
- python - 如何使用 lambda 表达式进行比较?
- c++ - 为什么打开双缓冲会破坏我的列表控件并调整窗口大小然后修复它?