- Автор темы
- #1
Когда у меня появился первый мобильный телефон с ИК-портом, я постоянно качал на него различные игры. Когда какие-то из них надоедали, я стирал их, чтобы освободить память, но была одна игра, в которую я ни разу не играл, но и удалить ее руки никак не доходили. Телефон отдал мне отец, который воспринимал его исключительно как средство связи, поэтому библиотека игр на нем была представлена одним-единственным приложением — ужасными шахматами с кислотным дизайном и дерганой графикой. Я иногда видел, как отец гонял красно-зеленые фигуры, но даже он делал это без особого энтузиазма. Я играть в них не умел вообще, но памяти занимали они всего ничего, да и мысль об удалении самой первой игры веяла неким предательством, поэтому шахматы так и болтались где-то между Принцем Персии и Gravity Defied.
Но однажды у моего одноклассника тоже появился новый телефон, в тот день он все уроки не вылезал из него, и какого же было мое удивление, когда я мельком увидел на его экране шахматную доску. Как он потом мне сказал, дома у него в шахматы никто не играет, поэтому с новым телефоном он буквально обрел нового друга, с которым наконец мог наиграться вдоволь.
Придя домой, я как любой порядочный школьник не переодеваясь сел за комп играть очередной Need for Speed, но увлеченность одноклассника мне не давала покоя. С неохотой я все-таки полез в телефон и запустил те самые шахматы. Начав тыкать случайные ходы, я довольно быстро получил мат. Еще один. И еще. Когда отец вернулся с работы, мы весь вечер с ним разбирали правила, и ночью под одеялом я смог обыграть первый уровень сложности.
На следующий день я как бы ненавязчиво прошел мимо того одноклассника с включенными шахматами, его глаз зацепился, и в итоге мы стали иногда играть друг с другом уже на настоящей доске. Я для него был очень слабым соперником, но, как он тогда сказал, пользы от проигрышей я получал куда больше, чем он от выигрышей. Это правда, через полгода я уже спокойно обыгрывал все уровни сложности своего телефона, кроме последнего. Поскольку приложения у нас были разные, градация сложности там тоже отличалась, и у моего одноклассника уровень выше среднего не мог обыграть даже он. Мой последний уровень ему тоже не поддавался, но он это воспринимал вполне спокойно. Он тогда сказал, что сложность регулируется лишь количеством ходов, на которые программа видит вперед, и у компьютера, в отличие от человека, ограничения на этот параметр нет.
Наверное, я бы тоже воспринял непобедимость телефона как данность, если бы не был воспитан играми, к которым всегда были чит-коды. Однако специально закладывать подобное разработчикам любых шахмат смысла, очевидно, нет. Накачав еще несколько шахматных приложений, включая то, где играл одноклассник, я стал искать лазейки в настройках и так далее, но ничего не нашел. В некоторых программах была возможность отматывать ходы, но поскольку это была легальная возможность интерфейса, считать это за самостоятельную находку как-то нелепо.
Вскоре я забросил эту идею, вернулся к своему старому приложению и продолжил просто регулярно играть вечерами, чередуя самый сложный уровень с предпоследним. И так было до тех пор, пока однажды передо мной не всплыла табличка о поздравлении с победой в тот момент, когда увидеть ее я совсем не ожидал. Свернув ее, я посмотрел на доску, на которой не было никакого мата. Я перерисовал себе эту позицию, сидел над ней около часа, показал отцу — королю компьютера был шах, и он определенно точно мог от него отойти. Но компьютер посчитал это матом. На последнем уровне сложности. Так и не поняв, что это было, я продолжил поигрывать, и уже через месяц компьютер опять внезапно фиксирует мою победу. Сравнив ту позицию с этой, я сразу обнаружил общий элемент — и там, и там я воспользовался двойным шахом. На всякий случай поясню — двойным шахом называется позиция, когда король находится под боем сразу двух фигур противника. На самом простом уровне сложности я попробовал воссоздать ситуацию с двойным шахом, но чтобы от него была возможность спрятаться. И опять поздравление. Попробовал в другом приложении — ничего не сработало, король спокойно отошел на небитую клетку. Однако из двадцати имевшихся у меня приложений на двойной шах отреагировало матом целых три. Не вникая в корень этого явления, при встрече с одноклассником я попросил его телефон, включил максимальный уровень, пожертвовал кучу фигур ради нужной позиции, дал двойной шах и протянул телефон обратно. Одноклассник был в шоке. Подвох он быстро заметил, но сам факт того, что компьютер сдался, в его понимании приравнивался к поражению. Я спросил у него, не случалось ли у него подобных инцидентов, на что он поведал лишь о тех ситуациях, когда двойной шах был действительно матовым, следовательно, проверить это явление у него шансов не было.
Обрадовавшись, мы загорелись идеей найти еще что-то подобное. Я стер все свои не шахматные игры, мы накачали под сотню различных приложений и начали искать. В основном все сводилось к попытке воссоздать какую-то нетипичную ситуацию, которая по нашей задумке должна была сломать «мозг компьютеру». Однако поначалу мы просто тыкали пальцем в небо. Среди всех нами проверенных игр еще две откликнулись на баг с двойным шахом, но во всех других придуманных нами случаях, типа шаха рокировкой, программы работали как надо. Тогда мы решили сделать поиски чуть более осознанными и все-таки вникнуть в ситуацию более подробно.
Это был наш первый опыт взаимодействия с программистскими форумами, но до ответа мы докопались очень быстро. Примерно поняв структуру написания кода тогдашних мобильных шахмат, которые порой были очень примитивны, природу бага мы нашли в статусе положения позиции, а именно в работе кода с состоянием шаха. В одном из обсуждений мы все-таки нашли упоминание матующего двойного шаха, который возникал из-за цикла снятия состояния шаха. В тех программах, где это состояние задается увеличивающейся на шаг переменной, двойной шах по сути увеличивал переменную на два шага. Но так как отход короля не обнулял, а уменьшал переменную на один шаг, то король глазами компьютера оставался под шахом. Поэтому программа не могла найти ход, избавляющий от шаха, то бишь видела мат и сдавалась.
Вооружившись пониманием о статусных переменных, мы стали искать в механике шахмат наиболее подходящее для них применение. И мы сразу вышли на почти нетронутое нами поле экспериментов — превращение пешки. Шанс того, что кто-нибудь из умельцев, клепавших свои шахматы на коленке, мог оставить там брешь, нам показался довольно высоким, и мы во всех приложениях подряд стали устраивать чехарду. И в какой-то момент оно щелкнуло. Основной упор нашего исследования пришелся на мгновенный шах от вновь появившейся фигуры, и мой товарищ решил попробовать сразу шаховать короля новым конем. Справедливости ради, баг обнаружился в одном из самых убогих приложений под платформу Symbian, что мы исследовали, и потом он повторился только в одном из более чем ста пробников, тем более, как оказалось от того же автора, просто под другим дизайном. Но тем не менее, как только мы дали шах жеребенком, компьютер вдруг не стал убирать короля с битой клетки, а спокойно пошел другой фигурой, после чего вдруг сразу же дал объявление о мате, не дожидаясь нашего хода. В этом же приложении мы несколько раз повоспроизводили такой же сценарий, однако теперь игра вела себя адекватно, либо двигая короля, либо съедая нашего коня. Но тут снова произошла ситуация, когда король проигнорировал шах и после хода своей же фигуры автоматически сдался.
На форумах мы так и не нашли описания подобной ситуации, но из уже имевшихся у нас знаний и дальнейших наблюдений за поведением кода на данном этапе партии мы пришли к следующему выводу. Интереса ради, в этой же программе мы еще несколько раз пошаховали короля превращающейся пешкой, только выбирая теперь не коня, а другие фигуры. Все шло нормально, король воспринимал угрозу и согласно правилам с ней разбирался. И тут опять же мой одноклассник решил испробовать несколько иной подход. Он подгадал ситуацию, чтобы король был на восьмой горизонтали, то есть на той же, где происходит превращение, но вместо ладьи или ферзя, которые в такой ситуации давали бы шах, выбрал слона. И о чудо, король снова почувствовал шах. Аналогично сработало и для положения, в котором король с клеткой превращения находился на одной диагонали — от ладьи в этой ситуации компьютер шах тоже славливал и искал пути отступления.
Вердикт был однозначен — программа по умолчанию воспринимала превратившуюся пешку за ферзя, но, видимо, лишь на момент непосредственного превращения. Так как конь — это единственная фигура, битые поля которой не совпадают с ферзем, то компьютер не видел никакой угрозы, и, следовательно, мог пойти, никак на коня не ориентируясь. И как только его ход заканчивался, а король оставался на битом поле, в коде видимо и всплывало обновление статуса, что король, оказывается, под шахом. Скорее всего, это давало какой-то сигнал о невозможности хода, и всплывало объявление о мате. Из этих соображений мы даже задумались, кому именно мат он зафиксировал на самом деле — из того интерфейса было не разобрать, поздравляют нас или унижают. Но наличие бага в такой ситуации, как выбор коня, не так уж удивительно — в игровой практике ситуация крайне редкая, думаю, она больше применима для шахматных задач с нестандартным решением, к тому же где-то треть разобранных нами симуляторов вообще не давала никакого выбора и ставила на поле ферзя. В целом разумно — зачем прописывать лишнюю часть кода, если в обычной игре и так все выбирают ферзя?
Хоть этой находкой мы тогда и закрыли очень важный для нас гештальт, поначалу нам казалось, что пользы от этого никакой не будет (нам даже обсудить это толком было не с кем), а поиски заняли у нас, хоть и с перерывами, без малого год. Но как только в старших классах у нас начались основы программирования, мы в полой мере почувствовали отдачу изученной нами базы. На тот момент сами мы еще ничего не программировали, но настолько хорошо были знакомы с архитектурой написания кода, что, получив в руки среду, буквально за полгода стали придумывать себе задачи самостоятельно. Сейчас, зачастую выполняя по работе задачи тестировщика, с уверенностью могу сказать, что ни с чем более полезным за время получения среднего и высшего образования, чем тот марш-бросок по просторам шахматной самодеятельности, я так и не столкнулся.
Сейчас мы иногда списываемся с тем одноклассником, однако тема шахматных симуляторов сейчас уже давно себя исчерпала. Я как-то предложил к ней вернуться, когда вдруг узнал о такой вещи в правилах, как взятие на проходе — удивительно, что я за время наших поисков это упустил, но даже среди моих знакомых, кто говорит, что умеет играть в шахматы, некоторые слышали об этом впервые. Я подумал, что вдруг об этом не знал кто-нибудь и из разработчиков, на что мой товарищ ответил, что взятие на проходе должны уметь делать все шахматные симуляторы, написанные позже 16 века. Да и время тогда сменилось — кнопочные телефоны и самодельные сайты с играми стали медленно сходить на нет. Шахматный софт практически достиг совершенства, а в тех статьях, где люди пытаются выработать эксплойты к тому же Stockfish, рассматриваются довольно сложные механизмы общения кода с самим собой и попытки внести в этот код паразитные составляющие маловероятными в реальной игре позициями.
Спасибо, что дочитали до конца, буду рад узнать, приходилось ли кому-нибудь выискивать подобные вещи из спортивного интереса, и дало ли этот какой-то задел на будущее. Так же, естественно, интересно, удавалось ли кому-то найти дающие победу баги в шахматных кодах, которые мы тогда так и не смогли обнаружить.
Но однажды у моего одноклассника тоже появился новый телефон, в тот день он все уроки не вылезал из него, и какого же было мое удивление, когда я мельком увидел на его экране шахматную доску. Как он потом мне сказал, дома у него в шахматы никто не играет, поэтому с новым телефоном он буквально обрел нового друга, с которым наконец мог наиграться вдоволь.
Придя домой, я как любой порядочный школьник не переодеваясь сел за комп играть очередной Need for Speed, но увлеченность одноклассника мне не давала покоя. С неохотой я все-таки полез в телефон и запустил те самые шахматы. Начав тыкать случайные ходы, я довольно быстро получил мат. Еще один. И еще. Когда отец вернулся с работы, мы весь вечер с ним разбирали правила, и ночью под одеялом я смог обыграть первый уровень сложности.
На следующий день я как бы ненавязчиво прошел мимо того одноклассника с включенными шахматами, его глаз зацепился, и в итоге мы стали иногда играть друг с другом уже на настоящей доске. Я для него был очень слабым соперником, но, как он тогда сказал, пользы от проигрышей я получал куда больше, чем он от выигрышей. Это правда, через полгода я уже спокойно обыгрывал все уровни сложности своего телефона, кроме последнего. Поскольку приложения у нас были разные, градация сложности там тоже отличалась, и у моего одноклассника уровень выше среднего не мог обыграть даже он. Мой последний уровень ему тоже не поддавался, но он это воспринимал вполне спокойно. Он тогда сказал, что сложность регулируется лишь количеством ходов, на которые программа видит вперед, и у компьютера, в отличие от человека, ограничения на этот параметр нет.
Наверное, я бы тоже воспринял непобедимость телефона как данность, если бы не был воспитан играми, к которым всегда были чит-коды. Однако специально закладывать подобное разработчикам любых шахмат смысла, очевидно, нет. Накачав еще несколько шахматных приложений, включая то, где играл одноклассник, я стал искать лазейки в настройках и так далее, но ничего не нашел. В некоторых программах была возможность отматывать ходы, но поскольку это была легальная возможность интерфейса, считать это за самостоятельную находку как-то нелепо.
Вскоре я забросил эту идею, вернулся к своему старому приложению и продолжил просто регулярно играть вечерами, чередуя самый сложный уровень с предпоследним. И так было до тех пор, пока однажды передо мной не всплыла табличка о поздравлении с победой в тот момент, когда увидеть ее я совсем не ожидал. Свернув ее, я посмотрел на доску, на которой не было никакого мата. Я перерисовал себе эту позицию, сидел над ней около часа, показал отцу — королю компьютера был шах, и он определенно точно мог от него отойти. Но компьютер посчитал это матом. На последнем уровне сложности. Так и не поняв, что это было, я продолжил поигрывать, и уже через месяц компьютер опять внезапно фиксирует мою победу. Сравнив ту позицию с этой, я сразу обнаружил общий элемент — и там, и там я воспользовался двойным шахом. На всякий случай поясню — двойным шахом называется позиция, когда король находится под боем сразу двух фигур противника. На самом простом уровне сложности я попробовал воссоздать ситуацию с двойным шахом, но чтобы от него была возможность спрятаться. И опять поздравление. Попробовал в другом приложении — ничего не сработало, король спокойно отошел на небитую клетку. Однако из двадцати имевшихся у меня приложений на двойной шах отреагировало матом целых три. Не вникая в корень этого явления, при встрече с одноклассником я попросил его телефон, включил максимальный уровень, пожертвовал кучу фигур ради нужной позиции, дал двойной шах и протянул телефон обратно. Одноклассник был в шоке. Подвох он быстро заметил, но сам факт того, что компьютер сдался, в его понимании приравнивался к поражению. Я спросил у него, не случалось ли у него подобных инцидентов, на что он поведал лишь о тех ситуациях, когда двойной шах был действительно матовым, следовательно, проверить это явление у него шансов не было.
Обрадовавшись, мы загорелись идеей найти еще что-то подобное. Я стер все свои не шахматные игры, мы накачали под сотню различных приложений и начали искать. В основном все сводилось к попытке воссоздать какую-то нетипичную ситуацию, которая по нашей задумке должна была сломать «мозг компьютеру». Однако поначалу мы просто тыкали пальцем в небо. Среди всех нами проверенных игр еще две откликнулись на баг с двойным шахом, но во всех других придуманных нами случаях, типа шаха рокировкой, программы работали как надо. Тогда мы решили сделать поиски чуть более осознанными и все-таки вникнуть в ситуацию более подробно.
Это был наш первый опыт взаимодействия с программистскими форумами, но до ответа мы докопались очень быстро. Примерно поняв структуру написания кода тогдашних мобильных шахмат, которые порой были очень примитивны, природу бага мы нашли в статусе положения позиции, а именно в работе кода с состоянием шаха. В одном из обсуждений мы все-таки нашли упоминание матующего двойного шаха, который возникал из-за цикла снятия состояния шаха. В тех программах, где это состояние задается увеличивающейся на шаг переменной, двойной шах по сути увеличивал переменную на два шага. Но так как отход короля не обнулял, а уменьшал переменную на один шаг, то король глазами компьютера оставался под шахом. Поэтому программа не могла найти ход, избавляющий от шаха, то бишь видела мат и сдавалась.
Вооружившись пониманием о статусных переменных, мы стали искать в механике шахмат наиболее подходящее для них применение. И мы сразу вышли на почти нетронутое нами поле экспериментов — превращение пешки. Шанс того, что кто-нибудь из умельцев, клепавших свои шахматы на коленке, мог оставить там брешь, нам показался довольно высоким, и мы во всех приложениях подряд стали устраивать чехарду. И в какой-то момент оно щелкнуло. Основной упор нашего исследования пришелся на мгновенный шах от вновь появившейся фигуры, и мой товарищ решил попробовать сразу шаховать короля новым конем. Справедливости ради, баг обнаружился в одном из самых убогих приложений под платформу Symbian, что мы исследовали, и потом он повторился только в одном из более чем ста пробников, тем более, как оказалось от того же автора, просто под другим дизайном. Но тем не менее, как только мы дали шах жеребенком, компьютер вдруг не стал убирать короля с битой клетки, а спокойно пошел другой фигурой, после чего вдруг сразу же дал объявление о мате, не дожидаясь нашего хода. В этом же приложении мы несколько раз повоспроизводили такой же сценарий, однако теперь игра вела себя адекватно, либо двигая короля, либо съедая нашего коня. Но тут снова произошла ситуация, когда король проигнорировал шах и после хода своей же фигуры автоматически сдался.
На форумах мы так и не нашли описания подобной ситуации, но из уже имевшихся у нас знаний и дальнейших наблюдений за поведением кода на данном этапе партии мы пришли к следующему выводу. Интереса ради, в этой же программе мы еще несколько раз пошаховали короля превращающейся пешкой, только выбирая теперь не коня, а другие фигуры. Все шло нормально, король воспринимал угрозу и согласно правилам с ней разбирался. И тут опять же мой одноклассник решил испробовать несколько иной подход. Он подгадал ситуацию, чтобы король был на восьмой горизонтали, то есть на той же, где происходит превращение, но вместо ладьи или ферзя, которые в такой ситуации давали бы шах, выбрал слона. И о чудо, король снова почувствовал шах. Аналогично сработало и для положения, в котором король с клеткой превращения находился на одной диагонали — от ладьи в этой ситуации компьютер шах тоже славливал и искал пути отступления.
Вердикт был однозначен — программа по умолчанию воспринимала превратившуюся пешку за ферзя, но, видимо, лишь на момент непосредственного превращения. Так как конь — это единственная фигура, битые поля которой не совпадают с ферзем, то компьютер не видел никакой угрозы, и, следовательно, мог пойти, никак на коня не ориентируясь. И как только его ход заканчивался, а король оставался на битом поле, в коде видимо и всплывало обновление статуса, что король, оказывается, под шахом. Скорее всего, это давало какой-то сигнал о невозможности хода, и всплывало объявление о мате. Из этих соображений мы даже задумались, кому именно мат он зафиксировал на самом деле — из того интерфейса было не разобрать, поздравляют нас или унижают. Но наличие бага в такой ситуации, как выбор коня, не так уж удивительно — в игровой практике ситуация крайне редкая, думаю, она больше применима для шахматных задач с нестандартным решением, к тому же где-то треть разобранных нами симуляторов вообще не давала никакого выбора и ставила на поле ферзя. В целом разумно — зачем прописывать лишнюю часть кода, если в обычной игре и так все выбирают ферзя?
Хоть этой находкой мы тогда и закрыли очень важный для нас гештальт, поначалу нам казалось, что пользы от этого никакой не будет (нам даже обсудить это толком было не с кем), а поиски заняли у нас, хоть и с перерывами, без малого год. Но как только в старших классах у нас начались основы программирования, мы в полой мере почувствовали отдачу изученной нами базы. На тот момент сами мы еще ничего не программировали, но настолько хорошо были знакомы с архитектурой написания кода, что, получив в руки среду, буквально за полгода стали придумывать себе задачи самостоятельно. Сейчас, зачастую выполняя по работе задачи тестировщика, с уверенностью могу сказать, что ни с чем более полезным за время получения среднего и высшего образования, чем тот марш-бросок по просторам шахматной самодеятельности, я так и не столкнулся.
Сейчас мы иногда списываемся с тем одноклассником, однако тема шахматных симуляторов сейчас уже давно себя исчерпала. Я как-то предложил к ней вернуться, когда вдруг узнал о такой вещи в правилах, как взятие на проходе — удивительно, что я за время наших поисков это упустил, но даже среди моих знакомых, кто говорит, что умеет играть в шахматы, некоторые слышали об этом впервые. Я подумал, что вдруг об этом не знал кто-нибудь и из разработчиков, на что мой товарищ ответил, что взятие на проходе должны уметь делать все шахматные симуляторы, написанные позже 16 века. Да и время тогда сменилось — кнопочные телефоны и самодельные сайты с играми стали медленно сходить на нет. Шахматный софт практически достиг совершенства, а в тех статьях, где люди пытаются выработать эксплойты к тому же Stockfish, рассматриваются довольно сложные механизмы общения кода с самим собой и попытки внести в этот код паразитные составляющие маловероятными в реальной игре позициями.
Спасибо, что дочитали до конца, буду рад узнать, приходилось ли кому-нибудь выискивать подобные вещи из спортивного интереса, и дало ли этот какой-то задел на будущее. Так же, естественно, интересно, удавалось ли кому-то найти дающие победу баги в шахматных кодах, которые мы тогда так и не смогли обнаружить.