Морской бой с искусственным интеллектом — по-честному (original) (raw)
Раз пошла такая пьянка (respect!), решил выложить в opensource свою поделку — игру в морской бой. Проект хостится на googlecode. Там есть SVN. Кроме того, исходники и виндовую сборку можно забрать прямо с моего домашнего компа (почему так — под катом). Основные фичи:
- написан на Qt — запускается где угодно (причём используются только базовые возможности, вам не придётся доустаналивать какой-нибудь QSvgRenderer)
- имеет несколько вариантов правил (нужны ещё? — пишите! :-))
- играет честно (то есть, при выдумывании хода, компьютер не подглядывает в ваше поле)
- автоматическая и ручная расстановка кораблей и прочие мелочи
Собственно, это всё, что я отдаю человечеству, но… взамен я надеюсь на некоторый 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.
Теперь мы имеем то, что имеем.
Вся логика написана, как самостоятельная библиотека. Она не требует ни Qt, ни даже STL. Однако тут классы распиханы по файлам наиболее странно. И местами код требует «си-плюс-плюс-пизации» :-) Это связано с питонской предысторией этого кода.
Весь GUI написан на Qt. Здесь управление памятью полностью отдано на откуп Qt-механизму, всем правят сигналы. Если вы захотите переписать GUI, то сделать это очень легко! Достаточно поддержать обработку всего нескольких сигналов.
Кроме того, есть Qt-класс, управляющий ходом игры. Он хранит состояние игры, получает сигналы от пользователя и передает их GUI. Строго говоря, дело чуть упростилось бы, если бы этот класс был разбит на два… но правильней, наверно, было бы использовать машину состояний… в общем, и тут есть что подправить :-)
Вот и всё. Каждая отдельная деталь этого аппарат хранит некоторые исторические рудименты и/или следы поспешного и не очень аккуратного написания. Однако, всё вместе скомпоновано достаточно стройно, и если у меня будет кураж, я потихоньку перепишу всё. Однако, сейчас мы имеем вполне рабочую версию программы. Выкладывая её я хотел бы
- порадовать людей уже сейчас
- понять, а надо ли ещё что-то дорабатывать, или забросить этот проект, как и всех его предшественников.
Всем успехов в борьбе с искусственным интеллектом на морских просторах! :-)