В своем классе Ruby я создаю игру Connect Four, которую мой профессор будет запускать в командной строке.
Это должно быть сделано с двойным массивом и циклами while, а не с break / exit / abort, loop do, классами, экземплярами или глобальными переменными.
Мой сеточный массив состоит из 64 заполнителей '.' во вложенном массиве. Я пытаюсь начать с нижнего ряда моей сетки 8x8 и добавить кусок плеера: 'X' или '0'.
Я не уверен, как перейти вверх от строки 8 / индекса 7 к строке 7 / индексу 6, если нижняя строка столбца уже занята. Я использую инструкции if или case? Могу ли я уменьшить строку? Я пробовал вставить if / elsif, но ничего не добился.
def print_playing_grid (playing_board)
puts "1 2 3 4 5 6 7 8"
playing_board.each do |row|
puts row.join(" ")
end
end
print_playing_grid(grid_array)
# this 'win'/while is only here for testing so the board will repeat on screen
win = false
while win == false
puts
puts "Please select a column to make your move (Player X):"
user_choice = gets.to_i
row = 7
column = user_choice - 1
while row < grid_array.size
grid_array[row][column] = 'X'
row += 1
end
puts
print_playing_grid(grid_array)
end



Поскольку это только два условия (ячейка занята или нет), я бы с большей вероятностью использовал if, а не case ... Я бы использовал case для нескольких тестов, так как он может быть немного чище, чем if и elsif.
player_token = 'X'
row = grid_array.size - 1
column = user_choice - 1
while (grid_array.size - row) <= grid_array.size
if grid_array[row][column] == '.'
grid_array[row][column] = player_token
row = -1 # (to exit the while loop)
else
row -= 1
end
end
в качестве примера того, где я бы подумал об использовании дела ...
player_token = 'X'
row = grid_array.size - 1
column = user_choice - 1
dropping_a_token = true
while dropping_a_token
case
when row < 0
dropping_a_token = false
when grid_array[row][column] == '.'
grid_array[row][column] = player_token
dropping_a_token = false
else
row -= 1
end
end
Привет, Стив. Я создал метод, который сочетает в себе немного того, что у меня было раньше, и ваш полезный код чрезвычайно, который указал мне правильное направление. Возможность многоразового использования как для моих людей, так и для компьютерных «игроков». Я пишу отлов ошибок для пустых значений массива, которые просачиваются в несуществующие строки. Спасибо за толчок в правильном направлении!
Привет, так что это должен был быть row = grid_array.size -1, идея заключалась в том, чтобы вместо жесткого кодирования «7» вы могли получить последнюю строку из размера массива. Из-за моей ошибки (извините) метод попытался бы получить доступ к grid_array [8] [column] при первом обходе, а grid_array [8] не существует, поэтому вы получите undefined method [] для nil: NilClass (потому что [column] нельзя вызвать на ноль)
Я скорректировал свой ответ, чтобы исправить это (для потомков), но рад, что вы добиваетесь прогресса!
Привет, Стив, спасибо за ответ! В верхнем примере вы можете объяснить причину установки row = grid_array.size? Я получаю неопределенный метод для nil: ошибка NilClass в RubyMine - доступное значение сетки пусто.