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