Минимаксный алгоритм Ruby Tic Tac Toe - PullRequest
0 голосов
/ 23 октября 2018

Я пишу непобедимую игру в крестики-нолики, используя минимаксный алгоритм.По какой-то причине мои хэш-значения теряют свою ценность, когда выходят из цикла.Если это происходит, значит, я делаю что-то не так, что не могу уловить.Я новичок в кодировании.Нужна помощь!

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

1 Ответ

0 голосов
/ 26 октября 2018

Похоже, вы каждый раз передаете пустой хэш обратно в best_move.То, что вы, вероятно, хотите сделать, это передавать баллы в каждом повторении, чтобы создать объект с движениями и баллами.

scores[move] = best_move(spots[1..-1], mark, other_mark, depth += 1, scores)

...