Сейчас мы занимаемся одной из самых сложных (и одной из самых интересных) фичей игры - промоткой.
Я мог бы довольно подробно описывать здесь алгоритмы, но постараюсь рассказать о ней как можно проще и интереснее.
Представьте, что игра - это робот-ученик, которого мы программируем.
Игрок - это учитель. Он выдаёт ученику задания и ожидает, что ученик эти задания выполнит. Получив готовую работу учитель чувствует удовлетворение.
Наша цель - именно это чувство учительского удовлетворения.
Теперь представим, что учитель, выдав ученику задания, отвлёкся. Например, вышел из комнаты.
Роботу функционировать не обязательно - учитель его не видит. Поэтому из экономии энергии мы его отключаем и включаем заново всего за пару минут до прихода учителя, когда слышно, что тот поворачивает ключ в двери (пускай нам даже приходится чуть попридержать эту дверь, не позволив открыть её слишком быстро).
Ученик - машина. Он способен решить все примеры за мгновение, но учителю не интересно учить машин. Он хочет обучать человека.
А значит нам нужно запрограммировать ученика, чтобы он выглядел усталым, чтобы тетрадь была исписана, а на полу валялись смятые листки. Этот алгоритм мы называем промоткой.
Учитель придёт, увидит что, да, старается парень, и проникнется своим учительским гением.
В конце концов, какая учителю разница, читабельны или нет каракули в тетради, если ответ - верный. Какая ему разница, пустые или нет листки, раскиданные по классу. Он же не будет их поднимать и читать? А может у ученика специально заготовлен целый ранец таких уже заранее смятых листков?
Учителю всё равно, а нам важна каждая доля секунды.
Мы даже можем высчитать среднюю скорость решения примеров для людей и, если учитель вернётся всего через полминуты, предъявить ему не радостного раздолбая, который уже прорешал пол учебника, а того же раздолбая, но склонившегося над партой, пыхтя над особо сложным заданием.
Так учитель не почувствует подвоха.
А теперь представьте, что нам нужно запрограммировать не одного ученика, а целый класс. Учитель хитрый и наблюдательный. Он знает, что, стоит отвернуться, и кто-нибудь обязательно напишет на доске нехорошее слово, а местному зубриле поставят лишний фингал под глазом. Он знает что полкласса всё равно спишут у отличницы, при этом сохранив её же ошибки. Дети есть дети.
Но вот, он уходит на целый час, выдав с десяток сложных примеров. Роботы отключаются и включаются заново за десять секунд. Как нам высчитать эти фингалы и каракули на доске, списывания и ошибки?
Можно конечно пустить механизмы в ускоренном в сотни раз темпе. И где-то полчаса они так действительно могут "промотать" за пяток секунд. Но при попытке быстрого проигрывания сразу трёх уроков, им придётся подпирать дверь не пуская учителя целую минуту. Тот, конечно, возмутится таким нахальством.
Значит эта промотка для промежутков более часа не подходит. Думаем дальше.
Тогда я решил сделать промотку по шагам.
Смысл её том, что ученики быстро садятся в кружок:
- Так. - говорит один - Значит, представим сейчас прошла минута с ухода учителя. Ты... - показывает он пальцем на соседей по очереди. - Занимаешься второй задачей десять минут. Ты - третьей. Пятнацать. Ты - пятой. Семь. А ты ничего не делаешь, ждёшь пока Ленка напишет всё. - Так он выдаёт задания всем. Потом говорит: - Представим прошло шесть минут. Восемь минут. Одиннадцать. Двенадцать.
- Я в это время должна закончить. - Откликается отличница.
- Значит Петров начинает у тебя просить списать и ты соглашаешься через... так, подсчитаем вероятности... двенадцать минут. Едем дальше. Тринадцать минут прошло. Четырнадцать. Пятнадцать.
- Я тогда должен доделать пятую задачу. - Подаёт голос другой робот.
- Значит принимаешься за шестую на двадцать две минуты. Заодно выставляешь фингал Сидорову, пытающемуся отнять решение.
Сидорову ставят фингал и так далее проговаривают мелкими-мелкими шагами пока не восстановят ситуацию до момента возвращения учителя
Это тоже не самый быстрый способ, однако во много раз быстрее обычного ускорения. Как вы понимаете - одно дело, когда вся эта орава носится по классу, и другое дело - когда относительно мирно сидит и разговаривает.
Но тут возникла новая проблема, потому что, промотай мы время таким образом, и вернувшийся учитель застал бы учеников сидящими в кружке, что-то обсуждающими, а не за прерванными занятиями. Тогда мы решили применить комбинированную промотку, когда большая часть времени мотается по шагам, а последние несколько минут - ускорением.
Но и этот алгоритм, при всей его точности, было крайне сложно запрограммировать. Быстро прогнать "параллельными потоками" (и постоянно влияющими друг на друга) десятки учеников и отловить все баги - казалось практически невыполнимой задачей.
И тогда мы пошли ещё дальше, сделав механизм промотки большими шагами.
Смысл в том, что ученики тоже садятся в круг, после чего "ведущий" говорит:
- Пошли первые пятнадцать минут. Ты за это время сделаешь три задачи. Ты пять. Ты ни одной. Ты две. - Так он выдаёт всем задания, после чего проверяет ключевые точки. - Пришло ли время списывать? Пришло ли время писать что-то на доске? Заснул ли уже Иванов? Как там идёт процесс глумёжа над хлюпиками? - Если ключевые точки срабатывают, робот выставляет изменения на следующие пятнадцать минут и пускает следующий шаг.
С одной стороны, это делает промотку менее точной, поскольку "ключевые события" происходят с некоторой задержкой, однако учитель всё равно не сможет определить точно, когда что там случилось, так что и волки сыты и овцы целы.
Однако тут начинаются нюансы.
Представьте, что в классе стоит видеокамера, и учитель просит одного ученика незаметно включать её, если вдруг кто-то решит драться, чтобы по приходу предъявить эту запись в виде доказательства директору, дабы хулиганов исключили. (Да и сам он, чего уж кривить душой, не против на такое посмотреть.) У нас в игре это называется показом катсцен после промотки.
Естественно, об этом знают все ученики - центральный компьютер у них один. Обмануть учителя становится сложнее. Конечно, они могут потом забраться в учительский стол и перезаписать видео, когда учитель снова уйдёт, но им нужно знать в какой точно момент происходит это событие, чтобы окружающие "сцену" роботы вели себя так, как они должны были себя вести во время прошлой промотки.
Делается это так - после каждого большого шага роботы проверяют, не пришло ли время включать камеру. Если пришло, один из них старательно записывает внешнее состояние класса и всех учеников, чтобы потом по этой записи воссоздать ситуацию.
Вот, в самых общих чертах, так.)
Отсюда мораль: Боты тоже умеют мухлевать.
Юридическая сторона
[Print]
Гость