воскресенье, 8 ноября 2009 г.

Шарики за ролики... Или как я ковырял игру пузырьки!


Снова всех приветствую! На часах пол второго ночи, общаться со мной никто не хочет, и я тут решил начеркать простенькую статейку про "Пузыри ВКонтакте". Да, да, вы не ослышались, теперь и меня можно найти во все Российской базе ФСБ под кодовым названием "ВКонтакте". Завтра на пары надо идти по этому попытаюсь все рассказать как можно более сжато (хотя то что вы только что прочли украла у меня целых 5 минут времени). Ну как говорится. Гоу!
(автор статьи не несет ответственности ни за что, что в ней написано и не призывает ни к чему, читайте эту статью на свой страх и риск!!!)




Теория

Многие жители славной базы ФСБ слышали про игру "Пузыри вконтакте" (возможно даже играли в нее четно пытаясь занять 1 место в рейтинге). Суть её в том чтобы набрать как можно больше очков лопая шарики разноцветные шарики до тех пор, пока их не останется на поле вовсе, или хотя бы не будет возможностей дальнейших "лопаней". Шарики лопать можно лишь в связке не менее 2 штук одного цвета, причем чем больше цепочка, тем больше дают очков! Смотрите ниже количество очков в зависимости от количества шариков.

  • 2 шарика - 10 очков
  • 3 шарика - 30 очков
  • 4 шарика - 60 очков
  • 5 шарика - 100 очков
  • 6 шарика - 150 очков
ну и так далее..


Убивалка времени

О боже! Смотрите! Это чудо, проступает лик формулы! (КОЛИЧЕСТВО*5)*(КОЛИЧЕСТВО-1)
Легко подсчитать что для того чтобы набрать максимальное количество очков нужно что сделать? Кто сказал взломать?  (хотя мысль правильная) Нужно выстроить максимально длинную цепочку из шариков одного цвета. Давайте немного по "математим". Эх люблю знаете, заперевшись в комнате, пока никто не видит часами "математить" что нибудь! Дак вот, размер игрового поля 11x19 шариков, что в совокупности получается 209! Не мало, правда? Забыл упомянуть что в игре 5 разновидностей шариков. Вам для того чтобы набрать хотя бы 20000 очков следует составить цепочку минимум из 57 шариков (15960 очков) , при условии, что на остальных цветах вы наберете недостающие 4040 очков. Кажется что это пустяк, ведь у нас вон как мнооого шариков, а не спешите. У нас ведь 5 разновидностей шариков, 209 их в сумме, еще немного математим и у нас выходит в среднем 41.8 шариков каждого цвета. Но компутер не жадный, он генерирует их в разных количествах, но процент того что у нас выпадут хотя бы 57 шариков одного цвета, очень невысок.(это мы еще не берем во внимание то что вы их можете не выстроить в ровные соприкасающиеся колонны). Кому хочется тратить время на "воду" (это я придумал такой сленг для шариков, чтобы круче звучало "вода"-без перспективный раунд), хочется же набрать как можно больше очков, и как можно быстрее, а сидеть считать вручную все эти шарики и прикидывать свои шансы как то не Айс. И тут появляюсь Я, как суппер герой, весь в плаще и маске,  я сохраню ваше время!


Такие нынче супер герои

Как то на днях у нас с моим одногрупником (далее для анонимности и скрытности этого человека я буду звать его Кириешка ) зашел разговор о вечном, как победить в игре "Пузыри вконтакте"! И он мне поведал, что где то там, на большой земле есть сервер, на сервере том есть папка, а в папке той содержится куча файлов с расширением *.map, и зверь лютый живущий в браузере кормиться этими файлами, и формирует из них каждый новый раунд! Покумеков на досуге я решил, не будем мы время свое тратить на козенные "водные" раунды, будем только по делу играть и выигрывать...

От теории к практике!

Что нам понадобиться:
  1. Голова!!!
  2. Матлаб (или умение на чем либо кодить)
  3. HTTPAnalyzer (или другой снифер трафика)
Как все это дело работает...

Для начала пишем маленькую программку на чем угодно, я выбрал матлаб ибо проще и быстрее писать! Суть программки проста, получает сплошную строку, парсит ее и выводит количество встречаемых в ней символов (а точнее циферок 1,2,3,4,5 каждая из которых отвечает за цвет шарика). У меня получилась что то вроде этого:

function kol(s)
i=1;
[j,i]=size(s);
while (i)
switch s(i)
    case '1'
        kras=kras+1;
    case '2'
        siniy=siniy+1;
    case '3'
        zholt=zholt+1;
    case '4'
        fiol=fiol+1;
    case '5'
        zelen=zelen+1;
end
i=i-1;
end


Следующим этапом нам надо поймать ответ от сервера с расположением шариков. Запускаем программку HTTPAnalyzer (или любую другую) и смотрим весь получаемый трафик (я указал фильтры чтобы мне выдавался только тот трафик который мне нужен), в поле response-content мы и получаем нашу заветную строку. Сразу говорю, что бессмысленно просто сидеть и ждать пока строка не упадет, она сама и не прибежит пока вы не начнете новый раунд, ну или  пока не обновите страничку, как это делаю я =)


Так мы ловим наши строчки...

Остается подставить строчку в нашу программку и смотреть стоит ли продолжать играть этот раунд, а если и стоит то из каких шаров строить цепочку, а какими жертвовать в первую очередь! =) На каждый раунд у меня уходило секунд 20 но после их я мог с уверенностью сказать сколько максимум я могу поиметь очков с этих раундов.

Можно конечно еще по математить и вывести алгоритм оптимальной игры. Или же напиать программку для перебора всех вариантов. Но это уже совсем другая статья...

Всех прошу в комментарии, так сказать Велкоме! А я пойду спать!!! =)

1 комментарий:

  1. Это не для средних умов. К сожалению.
    Маринка.

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