вторник, 20 апреля 2010 г.

Chess Url (Чешурл) - Easy Chess Puzzles Sharing

Привет, Друзья!

Недавно стал играть в шахматы с Другом. Занятие это настолько увлекательное, что начал решать шахматные задачки. Но вот беда - решаю я их на смартфоне (ну нету у меня ифона, нету), а поделиться интересной задачкой хочется. Как быть?

Как всегда, пошел в Google, в поисках подходящего сервиса, а там этих сервисов... что Кот наплакал. То, что удалось найти имело фантастически убогий интерфейс и потрясающее неудобство использования. Вобщем, почему бы не сделать свой сервис? - Сделал. О нем и речь в сегодняшней статье.

Знакомьтесь - Chess Url


Чешурл позволяет расставить фигуры на доске и получить URL к картинке, которая соответствует расстановке. Например, в следующем примере у белых есть прекрасный ход. Какой?

White to Move
Ход белых

Эта картинка имеет следующий URL:

http://chessurl.appspot.com/?RA8,PA7,KB4,PC5,PF6/RA6,PB5,PC6,PD5,KF7

До слеша идут белые фигуры (RA8,PA7,KB4,PC5,PF6), после слеша - черные (RA6,PB5,PC6,PD5,KF7). Фигура начинается с имени (K - King, Q - Queen, R - Rook (ладья), B - Bishop, N - Knight (конь), P - Pawn). Следующие два символа - координаты фигуры на доске.

Как делался Chess Url?


Программа состоит из двух частей: дизайнера и просмотрщика. Дизайнер написан на Silverlight 4.0, просмотрщик на... Python в Google App Engine. Суть дизайнера - дать пользователю интерактивность при создании шахматной комбинации. Просмотрщик отвечает за генерацию картинки по указанным параметрам строки запроса.

Исходники дизайнера (Silverlight части) можно скачать здесь. Я решил открыть их под Microsoft Public License. Что касается исходников просмотрщика - позвольте оставить их за кулисами... Дело в том, что мои познания в Python настолько глубоки, что написанный код стыдно показывать blush. Отсутствие Python-исходников попробую компенсировать, поделившись полученным опытом.

  • Откуда картинки? - Изображения шахматных фигур я нашел на Википедии, в формате SVG.

  • Как конвертировать SVG в XAML? - Нужно скачать последнюю версию Inkscape. Редактор позволяет экспортировать SVG в XAML, и является абсолютно бесплатным. Единственный минус, у меня некорректно обработалась одна трансформация в SVG файле. Пришлось дотачивать напильником, но процесс этот безболезненный, т.к. форматы очень похожи.

  • Как происходит отрисовка картинки по строке запроса? - В состав Google App Engine входит Images API, который позволяет производить трансформации над картинками. Однако тут не без сюрпризов. Когда объединяешь .PNG файлы с прозрачностью, App Engine игнорирует прозрачность, заливая все белым цветом (как на эмуляторе сервера, так и на сервере). Решилась проблема использованием .GIF файлов. Благо Paint.NET легко конвертирует файлы.

  • В чем разрабатывалось Python приложение? - Мне очень понравилась Aptana. Это IDE, с открытым исходным кодом. Для Python устанавливается плагин, и вы получаете хороший user experience, имея полноценный intellisense в Python. Кстати, этим же IDE я пользуюсь для создания JavaScript приложений (прости меня Студия, но ты и рядом не стояло).

  • Сколько времени ушло на разработку? - около 4-х часов. Но я молчу о поиске изображений и их конвертировании. Так же промолчу и о поисках багов и их "конвертировании" :). Суммарных усилий хватило на два выходных дня.

Самым приятным сюрпризом был App Engine. Во-первых, очень либеральные квоты (один гиг трафика на вход и один на выход... в день). Во-вторых, простота программирования. Я заметил, что много потребляю ресурсов на конвертирование изображений (а это тоже входит в квоту: 2 592 000 трансформаций в день). Решение в три строчки кода: прикрутил Memcache. Теперь число трансформаций упало в разы.

Что вы думаете?


Буду очень рад услышать ваше мнение о сервисе, коде и шахматной задаче сверху :). Если у вас есть свои интересные задачки - пишите, вставляйте в блог, пользуйтесь на здоровье :). Надеюсь, вам понравится.

Спасибо за ваше внимание! Отличного программирования :)!

6 комментариев:

  1. Классный сервис и интересный пазл! Я поражаюсь твоей работоспособности и целеустремленности, честное слово! :)

    У меня какой-то вариант решения есть. Но кто хочет порешать сам - не читайте его ниже, чтобы не испортить себе удовольствие.

    ---

    Ладья в противоположный угол, "жертвуя" пешку. Черной ладье остается либо бить пешку, тогда белая ладья на шаг ниже (нет разметки - не могу точно сказать, кстати, можно добавить разметку, а то без нее сложно). Черный король уходит, скорее всего, беря белую пешку, и белая ладья берет черную. Но, должен сказать, не факт, что белые выиграют. У черных на 2 пешки больше и при помощи короля одну из них можно провести вниз. Конечно, ладья - это хорошо, но не уверен, что она решит судьбу поединка. Белый король не успеет перекрыть подходы черному к своим пешкам. Скорее всего, ничья.

    Да, чтобы не допустить этой ситуации, черные могут попытаться не брать белую пешку ладьей, а взять другую королем, но ничего не меняется. Белая пешка -> белый ферзь, черная ладья берет ферзя, белая ладья берет черную. Результат тот же :)

    ---

    Давай побольше пазлов! :)

    ОтветитьУдалить
  2. Спасибо, Санек, за теплые слова и пожелания :)! Доску нумеровать хочу в следующих версиях.

    Ответ правильный :). Молодец, ты первый!

    Я подсоберу интересные задачи и выложу к концу недели, чтобы было чем размяться на выходных :)

    ОтветитьУдалить
  3. "То, что удалось найти имело фантастически убогий интерфейс и потрясающее неудобство использования"
    Ужасно прекрасная фраза :))

    Жаль что в комплекте нет исходников AppEngine части на пайтоне, интересно взглянуть и тем более, на код новичка в этом деле :) Ибо наверняка путь к решению проблемы он преодолевал по пути наименьшего сопротивления.. что весьма пригодится другому такому же новичку :)

    PS. Я б долго не думая подвинул бы ладью на 2 клетки вправо. при любом раскладе должен остаться в плюсах.

    ОтветитьУдалить
  4. хм. тут выше оказывается прозвучал вроде как правильный ответ - ладью в угол -> ничья.. имхо в моем варианте ферзь против ладью - шансы на исход поинтересней вышее :)
    В качестве пожелания - осталось к этой апликухе прикрутить какой-нить движечек для сражений p2p и будет вообще цельная картинка :) Заодно бы и проверили чей ход сильнее ;)

    ОтветитьУдалить
  5. Тоже вариант, но не уверен, что он не ведет к проигрышу.

    Ладья на две клетки вправо -> черная ладья съедает белую пешку (потому что остаться на месте - потерять ладью или получить под боком ферзя) -> белая съедает черную пешку, лишая две остальные защиты. После этого черный король не может съесть белую пешку и в то же время привязан к ней, а черной ладье нужно защищать хотя одну из оставшихся своих пешек (скорее всего, правую). Но дальше нужно смотреть, потому что теперь атакуют черные. При хорошем раскладе черные могут либо провести пешку в ферзя, либо разменять ее на белую ладью, оставив свою небитой.

    Андрей, как ты считаешь? :)

    ОтветитьУдалить
  6. :) Думаю, самый идеальный вариант - ладью на h8. Имея три пешки против ладьи - это нужно хорошо постараться, чтобы их довести до конца...

    ОтветитьУдалить