После того, как я закончил реализацию отзывов, полученных на прошлой неделе, о моей игре «Крестики-нолики», я начал портировать ее в Интернет. Мои наставники предложили мне использовать Sinatra, и я был рад использовать то, что использовал раньше.

Я думаю, что я ожидал запомнить больше, чем я сделал, потому что, когда я начал его строить, я понял, что не помню, что я делаю. Я подсчитал, сколько времени прошло с тех пор, как я его использовал, и понял, что прошло более 6 месяцев. Обычно я ожидал бы, что все еще буду помнить многое из того, что я использовал 6 месяцев назад, но на этом этапе быстрого интенсивного обучения мои воспоминания о том, как использовать Sinatra, исчезли.

Первым делом я просмотрел документацию, и она начала возвращаться ко мне. Я пошел его настраивать и вспомнил, что есть очень полезный драгоценный камень, rspec-sinata доступный для быстрого получения информации.

Я начал использовать TDD для индексной страницы с некоторыми очень простыми тестами.

expect(current_path).to eq('/') было достаточно, чтобы написать маршрут. expect(page).to have_content "Tic Tac Toe" привел меня к созданию представления. и т.д

С индексной страницей все прошло довольно хорошо, я довольно сильно заблокировал создание своего игрового объекта. Когда я писал свое приложение командной строки, я написал свой human_player так, чтобы он брал маркер («X» или «O») и экземпляр пользовательского интерфейса (чтобы они могли взаимодействовать с командной строкой, чтобы выбрать свой ход). ), и я не мог понять, как повторно использовать этот класс human_player в приложении Sinatra.

Я обратился по этому поводу к своим наставникам, и они напомнили мне об интерфейсах. У меня есть интерфейс игрока с human_player, simple_computer игроком и expert_computer игроком. В интерфейсе только указано, что для этих типов игроков требуется метод choose_space(board), и абсолютно ничего о конструкторе. Нет никаких причин, по которым я не могу создать web_player, который соответствует моим целям.

Это то, что я делал много-много раз в Java, но, поскольку в Ruby нет интерфейсов, я даже не думал об этом. Я создал свой web_player и довольно быстро снова заработал.

Некоторые вещи, которые я узнал за неделю:

  • Чтобы сохранить данные, вам необходимо включить сеансы.
  • Чтобы использовать дробовик, вам нужно установить секрет сеанса
  • В каждом маршруте вы должны снова установить переменную экземпляра. Я делал это, начиная каждый маршрут с @game = session[:game] (но набрав это сейчас, я понял, что, возможно, могу написать блок before_each).
  • Чтобы получить доступ к данным, введенным пользователем, вам необходимо передать их через контроллер в модель. Я не уверен, что я сделал это лучше всего, но я создал массив с именем move и сохранил его в своем сеансе. Когда я создаю экземпляр игрока-человека, я передаю этот массив движений. Пользователь выбирает пространство, затем мы сохраняем это пространство в массиве перемещения через параметры. Мой метод choose_space(board) является следующим вызываемым методом, и в web_player все, что он делает, это удаляет этот элемент из массива и возвращает его, если это допустимый ход.
def choose_space(board)
  @move.pop if board.check_available_spaces.include? @move[0]
end
  • CSS по-прежнему не мой друг или сильная сторона

Как только я получу отзыв на своем IPM сегодня, я перенесу его на Heroku и опубликую ссылку.