Морской бой с искусственным интеллектом — по-честному (original) (raw)

screen.png - upload images with PicamaticРаз пошла такая пьянка (respect!), решил выложить в opensource свою поделку — игру в морской бой. Проект хостится на googlecode. Там есть SVN. Кроме того, исходники и виндовую сборку можно забрать прямо с моего домашнего компа (почему так — под катом). Основные фичи:

Собственно, это всё, что я отдаю человечеству, но… взамен я надеюсь на некоторый feedback ,-)

Осторожно — хабрэффект! :-)
Коллеги! Сейчас с моего домашнего компа одновременно идёт более сотни скачиваний (обслуживается более ста соединений). Скачивание виндового дистрибутива может занять 10-20 минут, не все браузеры это выдерживают :-) Пользуйтесь даунлоадилками, или подождите спада хабраэффекта.
Ещё раз приношу извининея. Никак не мог ожидать такого качалова. Уже более 1000 скачианий :-). Жду ваших комментариев. Спасибо!


Вывалил наспех :-)
Можно взять всё не из дома!
Сорци
Под винду
(из дома скачали уже больше 3000 копий :-) я ожидал, ну максимум 100 :-))

pfactum сообщает, что у него не собиралось из сорцов под Linux и проблема решилась добавлением в src/logic/arena.cpp строчки "#include <stdlib.h>". Видимо, проблема действительно имеет место быть. Если у кого-то есть ещё такие проблемы — пишите.

Прежде всего, спасибо за любые комментарии, но одни комментарии мне будут дороже других :-)

Сейчас мне важнее всего обнаружить

Хорошо: «у приложения нет иконки». Хорошо: «слово `has' написано не в том пªдеже». Такие предолжения будут сразу учтены. Предложения типа «хорошо бы можно было грабить корабли и насиловать матросов обоего пола» будут рассматриваться не раньше 2012 года :-)

Теперь несколько слов, предвосхищающих вопросы.

А будут сборки под мою любимую ОС?

У меня три новости: плохая, хорошая и ещё одна хорошая.

Плохая: я уже создал несколько opensource проектов и пришёл к выводу, что я не в состоянии поддерживать актуальные сборки для всех ОС один. Для этого проекта я принципиально не буду выкладывать сборки.

Хорошая: я обнаружил, что находятся люди, для которых не сложно выкладывать сборки, пакеты, порты, билды… для их любимых ОС.

Я очень надеюсь, что у этой маленькой программки найдутся ценители, которые возьмут на себя скромный труд собирать и выкладывать бинарники. Я с благодарностью размещу на сайте проекта ссылки на эти сборки.

Кроме того, я уверен, что пользователи соотвествующих ОС и дистрибутивов смогут оформить бинаринки в духе и в стиле этих ОС. Например, что я сделал для пользователей Windows? — тупой zip-архив с exe-шником и необходимыми dll-ками. А правильный путь, наверно сделать msi, или инсталяшку какую-нибудь. Чтобы бинарник ставился куда надо, чтобы появлялись иконки, чтобы ОС знала о новом софте и могла его обносить и/или удалить… Я этого делать не умею. И освоить такое искуство для всех и вся… нет — я не в состоянии. Я думаю, что все выиграют, если я не буду брать на себя непосильную ношу и делать корявые сборки. Пусть этим займутся профессионалы.

И ещё одна хорошая новость: для текущей версии я собрал виндовую сборку и вы можете забрать её с моей домашней машины :-) Я сижу на стриме поэтому (1) скорость на отдачу очень не высока, и (2) связь рвется раз в сутки. Прошу простить за неудобства :-)

Что за извращение!? Почему не выложить бинарники и исходники на том же googlecode?

Ну с бинарниками у меня принципиальная позиция (см. выше), а исходники в виде архива обязательно выложу, когда зарелизю окончательную версию 1.0. Пока вы можете взять их из гуглового SVN, или в виде архива с моего домашнего компа. Мне просто не охота засорять download-секцию pre-release версиями. В googlecode удалить из download-секции ничего нельзя; мне не хочется, чтобы там вечно хранились девелоперские варианты.

Я посмотрел ваш код… он странный

О да. Чтобы хотя-бы частично развеять удивление тех, кто заглянул в код, расскажу его историю.

Эра перла. Несколько лет назад я написал на коленке web-приложение «Морской бой». Было оно (оно и сейчас здравствует) сотворено на перле. Логика включала несколько существенных упрощений, что иногда приводило к неадекватностям, но на это можно было закрыть глаза. Написал и забросил.

Эра питона. Больше года назад я пошёл на google developers day 2008. Перед этим делом я решил попробовать GAE. Ничего нового я придумывать не стал, а перекатал перловый код на Python. Причесал его слегка, чуть подчистил протокол взаимодействия с сервером… Но никаких принципиальных изменений не произошло — только смена языка.

Эра питона: смута. На питоне с кодом стало работать приятно и я решил попробовать сделать что-нибудь интересненькое. (Да, — забыл сказать, — GAE меня не вдохновил и я забросил GAE-проект; почему не вдохновил, могу рассказать в комментариях, а сейчас не об этом.) Решил я сделать шестиугольный морской бой. Не квадратные клетки, а шестиугольные соты. Чтобы было удобно работать с сотами, написал несколько классов, и работа оказалась фантастически лёгкой. Идеи, положенные в основу этого кода мне очень понравились, они более чем оправдали мои ожидания. А вот игра получилась не интересная, обычный морской бой на много интересней. Поэтому этот проект я тоже забросил.

Эра Qt. Летом

этого

прошлого года мне пришлось… одним словом, по работе, я столкнулся с Qt и многие идеи Qt мне очень понравились. Я решил переписать моё питонское шестиугольное чудо в классический Qt/C++ морской бой. Структура классов была взята из питонского прототипа — придумывать ничего не пришлось. Были устранены все логические «упрощения», приводившие к безумной игре компьютера. Было прикручено Qt и GUI.

screen-webb.png - image uploaded to PicamaticТеперь мы имеем то, что имеем.

Вся логика написана, как самостоятельная библиотека. Она не требует ни Qt, ни даже STL. Однако тут классы распиханы по файлам наиболее странно. И местами код требует «си-плюс-плюс-пизации» :-) Это связано с питонской предысторией этого кода.

Весь GUI написан на Qt. Здесь управление памятью полностью отдано на откуп Qt-механизму, всем правят сигналы. Если вы захотите переписать GUI, то сделать это очень легко! Достаточно поддержать обработку всего нескольких сигналов.

Кроме того, есть Qt-класс, управляющий ходом игры. Он хранит состояние игры, получает сигналы от пользователя и передает их GUI. Строго говоря, дело чуть упростилось бы, если бы этот класс был разбит на два… но правильней, наверно, было бы использовать машину состояний… в общем, и тут есть что подправить :-)

Вот и всё. Каждая отдельная деталь этого аппарат хранит некоторые исторические рудименты и/или следы поспешного и не очень аккуратного написания. Однако, всё вместе скомпоновано достаточно стройно, и если у меня будет кураж, я потихоньку перепишу всё. Однако, сейчас мы имеем вполне рабочую версию программы. Выкладывая её я хотел бы

  1. порадовать людей уже сейчас
  2. понять, а надо ли ещё что-то дорабатывать, или забросить этот проект, как и всех его предшественников.

Всем успехов в борьбе с искусственным интеллектом на морских просторах! :-)