Я пишу непревзойденную игру в крестики-нолики, используя алгоритм минимакса. По какой-то причине мой хэш результатов теряет свою ценность, поскольку выходит за цикл. Если это происходит, значит, я делаю что-то не так, что не могу уловить. Я новичок в программировании. Нужна помощь!!!
отметка - отметка текущего игрока
mark1 и mark2 - две метки для player1 и player2 соответственно
пятна - это пустые места на доске
require_relative 'board'
class ComputerPlayer
attr_reader :board
def initialize
@board = Board.new
@optimal_moves = [0, 2, 4, 6, 8]
end
def get_position(name, spots, mark, mark1, mark2)
position = nil
other_mark = nil
mark == mark1 ? other_mark = mark2 : other_mark = mark1
if spots.length == 9
position = @optimal_moves.sample.to_i
else
position = best_move(spots, mark, other_mark)
end
print "Enter your move #{name}: #{position}\n"
position
end
def best_move(spots, mark, other_mark, depth = 0, scores = {})
return 1 if board.winner == mark
return 0 if board.draw?
return -1 if board.winner == other_mark
spots.each do |move|
board.place_mark(move, mark)
scores[move] = best_move(spots[1..-1], mark, other_mark, depth += 1, {})
board.reset_position(move)
end
# it does not keep the value of scores. scores here is {}
return scores.max_by { |key, value| value }[0] if depth == 0
return scores.max_by { |key, value| value }[1] if depth > 0
return scores.min_by { |key, value| value }[1] if depth < 0
end
end
Да все верно. как только он выходит из пятен. все баллы пусты.
Единственная возможность, почему это могло произойти, - это то, что spots
там пуст, а цикл вообще не запущен. Проверьте spots
.
Фу. По моему опыту, отладка рекурсивных функций может быть очень сложной задачей ...
Похоже, вы каждый раз передаете пустой хеш обратно в best_move. Что вы, вероятно, захотите сделать, так это выставлять баллы при каждом повторении, чтобы создать объект с ходами и счетами.
scores[move] = best_move(spots[1..-1], mark, other_mark, depth += 1, scores)
Какой цикл вы имеете в виду?
spots.each
, возможно?