— Привет, Фрэнк. Я видел твое электронное письмо о Deep Black & White. Сделка по дистрибуции — отличная новость, — сказал Аллан, программист C++, который разрабатывал игровой движок на искусственном интеллекте, сделавший Deep Black & White таким сильным игроком.
— Возьми пончик, Фрэнк, — предложила Саша и подвинула к нему почти пустую коробку.
— Спасибо, — ответил Фрэнк и запустил руку в коробку.
— Фрэнк, это Карлос, — сказала Саша. — Он опытный agile-тренер. Мы пригласили его, чтобы он помог нам освоить этот новый agile-подход к работе.
Фрэнк и Карлос обменялись рукопожатиями и приветствиями.
— Похоже, все в сборе, за исключением Роуз, — сказал Фрэнк. — Давайте начнем. Мы введем ее в курс дела позже. Вряд ли на этом совещании разговор пойдет о художественном оформлении.
— Мы не можем начать, Фрэнк, — сказал Карлос. — Это важный момент. Нужно, чтобы присутствовала вся команда. Значительная часть выгоды, которую мы хотим получить в результате применения agile-процесса, зависит от участия всех членов команды. Роуз, возможно, мало что скажет об искусственном интеллекте в игровом движке, но нам все равно нужно знать ее мнение, если мы хотим создать лучшую игру.
— Она всегда появляется по понедельникам в пять минут десятого. Ей приходится отвозить Брук в школу по понедельникам, средам и пятницам. Она вот-вот придет, — заметил Прасад. И точно, стоило ему сказать это, как отворилась дверь и в конференц-зал вошла Роуз.
— Извините, пробки, — сказала Роуз, быстро усаживаясь в кресло.
— Итак, Делани, ты занималась исследованием продукта для проекта Havannah, — обратился Фрэнк к аналитику. — Прошло довольно много времени с того момента, как я задумал эту игру. Прошу прощения, но напомни мне, пожалуйста, как в нее играют.
— Конечно, Фрэнк. Прежде всего игровое поле выглядит вот так, — сказала Делани, вытащила деревянную доску из сумки и положила ее на стол (рис. 23.1). — В игре участвуют два игрока, которые по очереди ставят фишки на поле. У каждого игрока фишки своего цвета. После размещения фишки на поле двигать ее больше нельзя.
— Правильно, но, в отличие от го, фишки не захватывают. Цель игры Havannah — построить кольцо, мост или вилку. Кто первым это сделает, тот и выигрывает.
— А что такое кольца, мосты и вилки? — спросил Фрэнк, когда Делани взяла пригоршню фишек и начала ставить их на доску.
— Кольцо — самая простая фигура. Оно выглядит так, — ответила Делани, расставляя фишки, как показано на рис. 23.2. — Кольцо — это ряд стоящих на соседних клетках фишек, которые окружают одну или несколько клеток.
— Ну, это выглядит довольно просто. Что усложняет игру? — спросил Аллан. Он уже начал думать о том, как создать движок на основе искусственного интеллекта, который будет выбирать ходы.
— Не забывайте, что кольцо — только один из путей к победе. Выиграть можно также, построив вилку или мост, — продолжила Делани, расставляя фишки, как показано на рис. 23.3. — Мост соединяет любые два угла. Он может представлять собой прямую линию, идущую по краю от одного угла к другому. Чаще, однако, мост выглядит так. — Она показала на мост в правой части доски на рис. 23.3.
— Должен ли игрок говорить до начала игры, какую фигуру он попытается построить? — поинтересовался Аллан.
— Нет, это часть интриги и часть задачи. Ты можешь начать со строительства моста, понять, что он не получается, и попытаться построить вилку.
— А что такое вилка?
— Вилка выглядит вот так, Фрэнк, — сказала Делани, добавив несколько фишек на доску, как показано на рис. 23.4. — Вилка соединяет три обреза доски, а не углы. Углы — это не обрезы, поэтому их нельзя использовать для создания вилки, они подходят только для моста.
— Создание генератора ходов будет проблемой. При таком большом количестве возможных вариантов достижения победы и таком количестве клеток на доске число комбинаций огромно.
— Именно так, Аллан, — сказала Делани. — Многие считают, что эта игра сложнее, чем шахматы, поскольку в ней больше вариантов и невозможно использовать огромную базу эндшпилей. В шахматах, когда остается всего несколько фигур, можно использовать базу лучших завершений партии и не нужно полагаться только на генератор ходов. В игре Havannah слишком много фишек и слишком много позиций.
— Но ведь тебе неинтересно возиться с какой-нибудь простенькой игровой программой, правда же, Аллан? — поддела его Саша.
По виду Аллана было похоже, что в этот раз он не прочь заняться чем-нибудь попроще.
— Не волнуйся. Из-за того, что сейчас в эту игру мало кто играет, нам не понадобится такой же мощный движок, как в Deep Black & White, — поспешила успокоить его Делани. — В конечном итоге мы доберемся и до такого же уровня, но в версии 1.0 этого пока не нужно. Вполне подойдет движок, который берет верх над людьми в большинстве случаев.
— Окей, Делани. Есть ли еще какие-то правила, о которых нам нужно знать? — спросил Фрэнк.
— Нет, это все. Правила простые, но эта игра реально заставляет поломать голову. Именно поэтому мы считаем, что она понравится клиентам, которые уже покупали наши игры.
— Так ты уже оформила документ с требованиями?
— Пока нет, Фрэнк. Из того, что мы узнали от Карлоса об agile-подходе к разработке программного обеспечения, следует, что команда должна формулировать требования коллективно.
— Совершенно верно, — добавил Карлос. — Мы собираемся начать сегодняшнее совещание с написания пользовательских историй. Это краткие заявления о функциях, но изложенные от лица пользователей. Например, «Как пользователь я хочу иметь возможность сохранить игру, которая еще не доиграна». Примерно так.
— Звучит довольно просто. А что мы будем делать с ними, когда сформулируем?
— Мы оценим каждую из них, приоритизируем, а потом найдем наилучший баланс между функциями и сроками, — сказал Карлос.
— Ну и как же составляются эти пользовательские истории? — спросил Фрэнк.
— Мы будем использовать вот эти карточки, — Карлос положил по пачке карточек перед каждым из присутствовавших. — Мне нравится записывать пользовательские истории в следующем формате. — Карлос взял фломастер и написал на магнитно-маркерной доске: «Как <тип пользователя> я хочу <цель> с тем, чтобы <причина>». — Делани, ты уже разобралась в этой игре Havannah, можешь дать нам пример?