Проблема вашего подхода в том, что get_row[get_col]
возвращает элемент random каждый раз, когда он вызывается, поэтому get_row[get_col] = "O"
также установит элемент random в "O"
. Вы проверяете один элемент, а затем устанавливаете другой.
Вы можете быстро это исправить, изменив извлеченный элемент на месте:
if try == "-"
try.replace("O")
# ...
Но семантически мне не очень нравится это исправление , Думая о доске ti c -ta c, я бы скорее присвоил "O"
свободному месту, чем преобразовал существующий заполнитель из "-"
в "O"
.
Сделал Вы заметили, что ваш метод get_row
возвращает массив, тогда как get_col
возвращает индекс? Я думаю, что эта комбинация массивов и индексов делает ваш код немного запутанным.
Намного проще (на мой взгляд) получить доступ как к строке, так и к столбцу через индекс.
Для этого, Вы можете поместить три строки в другой массив:
$board = [
['-', '-', '-'],
['-', '-', '-'],
['-', '-', '-']
]
К первой строке можно получить доступ через $board[0]
, а к ее первому элементу - через $board[0][0]
. Чтобы установить элемент, который вы используете: $board[1][2] = 'O'
(это устанавливает самый правый элемент средней строки на "O"
). Конечно, вы также можете использовать переменные, например, $board[row][col]
.
. С этим двумерным массивом ваш computer_guess
может быть переписан с использованием всего двух случайных индексов: (get_row
и get_col
aren ' больше не нужно)
def computer_guess
loop do
row = rand(3) # random row index
col = rand(3) # random column index
if $board[row][col] == '-' # if corresponding spot is "-"
$board[row][col] = 'O' # set that spot to "O"
break # and break out of the loop
end
end
end
Обратите внимание, что "слепое" угадывание мест, пока вы не найдете свободное, может быть не лучшим подходом.
Вместо этого вы можете создать список "свободных" "пятна. Это можно сделать, сначала сгенерировав массив всех координат 1 , а затем select
с теми парами строк / столбцов, чья точка равна "-"
:
def free_spots
coordinates = [0, 1, 2].product([0, 1, 2])
coordinates.select { |row, col| $board[row][col] == '-' }
end
Теперь вам просто нужно выбрать случайную пару (через sample
) и установить соответствующее место на "O"
:
def computer_guess
row, col = free_spots.sample
$board[row][col] = 'O'
end
1 Array#product
возвращает декартово произведение указанных массивов. Это простой способ получить все пары:
[0, 1, 2].product([0, 1, 2])
#=> [[0, 0], [0, 1], [0, 2],
# [1, 0], [1, 1], [1, 2],
# [2, 0], [2, 1], [2, 2]]