Открыть список
Как стать автором
Обновить

Комментарии 144

зря картинку ссылкой сделали
раза четыре текст пролистал=)
Осознал. Поправил. Благодарю от лица всех, кто больше не наступит на эти грабли :)
Прикольно!
На поле 500 на 500 (по 1000 единиц с каждой команды) получилась почти ничья.
Ммм… Что-то не по инструкции. Там запутанное управление, интуитивно непонятное, как почти у всех начинающих. Точно одна команда слева, а другая справа? Разные прошивки, BERSERK и COMRADE? Если прошивки одинаковые, то «почти ничья» закономерна. А если юнитов разных команд равномерно перемешать, то интеллектуальное преимущество Комрадов практически нивелируется. Они не успевают скучковаться. Агрессивность Берсеркеров может даже повысить их шансы.
Хм, а на поле 1000x800 отрыв был уже 400.
Да-да, когда меня спросили о параметрах и я покопался, нашёл, вспомнил, тогда и сообразил, в чём было дело. Зрение у юнитов сейчас хорошее, 200 пикселов в каждую сторону. Поэтому на маленьком поле (200+200 почти 500) Берсерки быстро добираются до места схватки, кучкуются почти с такой же скоростью, как и Комрады, и преимущество последних минимизируется.

Собственно, вы уже и сами подошли к отгадке вплотную :)

P.S.
Кстати спасибо за задокументированное доказательство, что на Windows 7 игра таки запускается, хоть и не у всех.
Запускается, при чем запустилась с первого раза и без лишних телодвижений с моей стороны :)
А вот откомпилировать, чтобы проверить, не смогу, ибо не поставил MFC в свое время.
P. P. S.
Если есть возможность перекомпилить, то для малых полей можно сделать зрение похуже, изменив эту строку:
#define UNITDEF_EYESHOT 200
А можно сделать какието знаки различия для роботов с разной программой?
Или статистику по подробней?
Если будет проявлен достаточный интерес, займусь. Хотелось бы не в одиночку. Так скучно.
Интерес есть, и можно не в одиночку.

Пару раз занимался со студентами моделированием одного организма и сообщества-муравейника. Пришла пора и повоевать.
Возможно, я выбрал неудачное время (перед самым НГ), возможно, неудачную область — распределённые системы, искусственный интеллект и т.п. Но итог таков — желающих попрогать практически нет. Ни юнитов, ни среду для них. Кстати, долго не отвечал именно вам, поскольку ждал, чтобы подвести итоги.

Решите самостоятельно продолжить или ещё кого найдёте в партнёры — помогу, чем смогу. Присоединиться не обещаю. Надеюсь поймёте — я несколько разочарован на данный момент :)

Это не первый раз уже так — всем моя идея нравится, многие в восторге. Но желающих доказать интерес на практике — раз-два, и обчёлся. Да и у тех энтузиазм тухнет на глазах.

Обычно так: кто-то может, но уже не хочет. Кто-то хочет, но не может. Уговаривать желания нет, учить — ну не знаю… Вообще-то, мелькнула мысль организовать что-то вроде онлайн-школы практического кодинга, собрать учеников, может быть даже учителей… Но вернусь к этой задумке после НГ.
Не совсем так. Мы с товарищем уже договорились по Вашей игре устроить соревнование своих умов до НГ =)

Кстати, не подскажете — как лучше сделать возможность юнитам отправлять друг другу сообщения? Если юниты рядом, то логично сообщать: «тут враги, сюда» или «тут слишком много врагов, не надо сюда» =)

Вообще, с моей точке зрения, это главное, чего не хватает игре, чтобы быть полноценным полигоном для применения и разработки алгоритмов коллективного разума. Ну и еду можно добавить.
я научился отправлять сообщения, все работает, юниты в бою принимают решения исходя из сообщений, здорово, но теперь хочу сравнить в бою своих общающихся юнитов с обычными. И загвоздка: не могу создать свой тип юнитов! создаю два файла по образу и подобию AIComrade.h и AIComrade.cpp, меняю там все содержащее слово «Comrade» на свое, потом лезу в "_AIInstaller.h" и регистрирую своего юнита. Вроде всё, верно? Но Visual Studio выдает ошибку на этапе линковки

AIPinguinUnit.obj: error LNK2005: «enum ECourse __cdecl sector(class CPoint,class CPoint)» (?sector@@YA?AW4ECourse@@VCPoint@@0@Z) already defined in AIComrade.obj

и соответствующую ей

.\Release/G1.exe: fatal error LNK1169: one or more multiply defined symbols found

Не подскажете, что исправить?
По-русски enum ECourse already defined означает, что тип enum ECourse уже определён. Очевидно, компилятор два раза включает один и тот же заголовочный файл.

Для предотвращения этой ситуации есть два способа, и тут они оба есть:
#if !defined(AFX_AICOMRADE_H__9CC3A2E8_4BF2_43D9_BDD3_6DD3B8C18483__INCLUDED_)
#define AFX_AICOMRADE_H__9CC3A2E8_4BF2_43D9_BDD3_6DD3B8C18483__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


Вот в верхних строчках меняли длинную-длинную константу? Хотя бы просто COMRADE на СВОЁ? Т.е. я тут тоже часто на грабли наступал. Обычно замену надо делать в нескольких регистрах.

Смущает только жалоба на enum ECourse. Это определение в другом файле, в AIBerserk.h.

В общем, если не поможет, выкладывайте где-нибудь архив с исходниками, посмотрю. Заодно погоняю вашего юнита.
Менял в верхних строчках длинную-длинную константу, и само слово COMRADE, и каждое число между символами "_" тоже менял, не помогало.

Помог вечный вариант — загрузить ваш проект с чистого листа и последовательно добавлять свои измененные файлы.

Тем не менее, спасибо за ответ и готовность погонять моих камрадов, это было бы здорово =)

Так что делюсь своим микроусовершенствованием. Хотя всё его отличие состоит в том, что теперь юнит, когда не видит врагов, выбирает в качестве цели ближайшего друга, в поле зрения которого есть враг (об этом он узнает из сообщения тревоги «Alien here!», которую бьют все юниты, видящие врага).

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

Вот архив.

G1 Pif.zip.html (90 кб)
да, почти все мои изменения помечены комментарием

// Pif upgrade
Скачал, тоже пару партий прогнал. Преимущество за говорящими, да, но немые проигрывают совсем немного, примерно 50 в партии 1000х1000. В одной, правда, была «техническая ничья» — сформировалось несколько роёв, и они друг к другу не приближались. Но в вашем рое было больше. Всё равно надо решать проблему инертности роёв для юнитов типа Комрад.

Кстати, тут кто-то пчёл упоминал. Так вот у них есть такой обычай — «пчелиный танец». Пчела, которая нашла мёд, в миниатюре рисует свою траекторию.

Так что вы, в принципе, могли показывать наличие, и даже направление на врага, выполняя различные телодвижения — два шага вперёд, шаг назад, например. Или наоборот, если врагов в поле зрения больше, чем друзей.

Но это, конечно, сложнее. Тут ведь надо запоминать расположение друзей на 2-3 хода назад во времени. Да и несколько нереалистично такое ограничение на общение. Единственное, в чём пока сомневаюсь — что радиус общения совпадает с полем зрения. Имхо надо больше, типа радиосвязь. Или меньше, если это звук. А сейчас это типа язык жестов :)

P. S. Пока писал, третья партия завершилась вничью (два роя, не приближаются), но на этот раз моих больше чуток.
Да, преимущество тут такое… очень зыбкое =) С инертностью надо бороться… но куда идти, если врагов нету? Дрейфовать в случайном направлении?

Про пчел читал у Гордона, очень интересно они танцуют. Там даже не траектория рисуется, а целый язык жестов: летите сначала на восток, потом на юг, выше — ниже… Даже вроде сделали механическую пчелу, и другие пчелы ее понимали.

Но здесь — если танцевать, пока враг атакует — это как-то… мне солдат жалко =)

И память, да. Если договориться, что она есть, то будет хорошо… я тут такую штуку сделал — если врагов много, то бежать. Бежать к самому дальнему союзнику, по вашему способу. Но поскольку радиус зрения ограничен, то эти самые дальние возникают то тут, то там… и юнит мечется. С памятью можно было бы этого избежать.

Не смотря на метания, трусость помогла добиться уже измеримого результата — в среднем более 100 остаются в живых в бою с классическими камрадами, даже под 200.

narod.ru/disk/16337433000/G1%20Pif%2026%20dec%202009.zip.html

И с радиусом общения поиграться — это вы идейку подкинули =)
Да, то что там есть оптимизированные комрады (6-е в списке) — не обращайте внимания, это ваши комрады с ликвидацией вложенного цикла, я думал это ускорит дело. Ничего подобного — ускорение есть, но всего на 20%.
Да, и еще вопросик к вам: вы упомянули в посте сайт DroneSoft.com — я туда зашел, там как-то ничего еще нет, даже странички «о проекте», и про соревнования ИИ тем более. Можно поподробнее? Я бы хотел найти место, где можно с людьми соревноваться.
Поначалу так и думал, что там посоревнуемся. Туда полтыщи человек заглядывало, но самоорганизоваться не смогли — просто постеснялись, надеюсь :)

После НГ многие обещали вернуться. Посмотрим.

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

Мне ещё предлагали выложить код в репозиторий. Чуть разгребу дела, и подыщу. Тогда не придётся вам больше архивы паковать, будете просто коммитить.
Можно и дрейфовать всей толпой, но есть другие варианты и подварианты. Разведка: отдельные юниты, автономные отряды, или цепи юнитов, отстоящих друг от друга на грани видимости. Зачистка — растягивать рой в «колбасу» :) и зигзагами проходить поле. Или цепью от стенки до стенки, но тут можно и на прорыв линии фронта нарваться, если противник ходит роем.

Танцевать — только когда враг ещё далеко.

Память в зародыше уже есть. Юнит ведь помнит случайное направление. Помнит и место схватки (понаблюдайте — бой закончился, враги уже мертвы, а друзья спешат на помощь в ту точку, которую помнят).

Не трусость, а разумная осторожность :)
Ответный ход: G1_20091228_Tolmachov.zip
(и четыре кадра с мест боёв: #1 #2 #3 #4, COMRADE 1.1 выигрывают 230-280 на поле 1920х1200 при количестве юнитов 1000 на 1000).

Главное отличие: режим Collapse, при котором все юниты стягиваются к центру группировки.
ух ты! супер! интрига сохранятся =) очень красиво выглядит #1.

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

Но система по-прежнему распределённая в том что касается зрения. Нет какого-то вида сверху, когда центр всё видит.
а почему не на сайте картинки?
В смысле не на DroneSoft.com? Он пока на консервации до НГ. Если окажется что постновогодняя активность не превысит предновогоднюю, то закрою проект или перепрофилирую под что-нибудь другое.
гы-гы, интерес доказывать на практике никому не хочется

напишу в личку
Прикольно, надо бы сделать поддержку местности, город, непроходимые участки )
Представь что это летают беспилотники и воют между собой )
Беспилотники вертолёты да, выглядит такое наверное сурово.
Самолёты не месте зависать не умеют (кроме ошибок по) =)
1) представьте, что умеют
2) наслаждайтесь
:)
Харьеры?
Подлетают два харьера на небольшое расстояние друг от друга и дубасятся пулемётным огнём xD
А как зрелищно-то было бы:)
А Камрады и Соломоны одинаковые по алгоритму действий?
Визуально они работают одинаково. По результатам ничья, делал несколько прогонов.
Соломон — неудачная модель, поэтому не упоминал даже. Он пытается принимать взвешенные решения, подсчитывая своих и чужих в поле зрения, смотрит, кого больше. Но оказалось, что кучность это не увеличивает. А именно этот фактор решающий пока.

Но простор для совершенствования огромен. Например, когда юниты собьются в кучу, задние бестолково бьются в спины передних, пытаясь их обойти случайным образом. Если же будут обтекать их организованной толпой, то появится такой манёвр, как клещи и даже окружение.
Простор большой. Вижу битвы программистов и их алгоритмов между собой ))
Не ставил ещё. Полагаю, поможет перекомпиляция под эту ось. Если кто пришлёт, выложу.
У меня Windows7 64 bit и все впорядке. У вас .Net Framework какой стоит?
3.5, последний вроде
Хм. Сейчас на двух тачках тестировал. на одной 3.5, на другой 4.0 бета. Все работает.
Возможно проблема в другом.
Какая разница какой фреймворк, программа то на Native C++ написана.
у меня на windows 7 всё великолепно работает =) только когда ботов больше 20к — вылетает…
У меня аналогичная ошибка на Windows 7 32 bit (.Net Framework 3.5)
Перекомпиляция помогает.
Для пользователей других операционок не хватает

Microsoft.VC90.CRT.manifest
msvcm90.dll
msvcp90.dll
msvcr90.dll

Тогда хотя бы под wine можно запустить, а вообще жаль, что игра не написана на qt)

И если Вы отдаете сорцы игры, то может имеет смысл выложить ее в какой-нибудь публичный репозиторий?)
Распространять MFC как-то неудобно что ли. Собственно, это же не инсталлятор. Игра-то для программистов, у которых Visual Studio со всеми прибамбасами уже стоит.

А про репозитории думал. Решил не засорять пока. Будет уверенность, что найдутся продолжатели — выложу.
Распространять MFC как-то неудобно что ли.
Почему же неудобно. Его же и так прям у MS можно скачать. Ну во всяком случае можно ссылочку дать в теме, для тех, у кого не запускается с полпинка.
На Qt, кстати, пробовал писать. Но намного позже освоения MFC. Как ни странно, особых неудобств из-за старых вредных привычек не ощутил :) Хотя писал под Linux'ом, юзал KDevelop (а я ну совсем не линуксоид, чуток знаком, и всё). Просто Qt приложение меня только один раз попросили написать, а вот MFC требовалась постоянно. Увы.

Надеюсь, портировать труда не составит, если кто вздумает заняться.
А там насколько сильно всё на виндовую специфику завязано? (Да, я поленился вчитаться в код)
Только вывод на экран, или ещё что-то эдакое понадобится?

И да, я бы попробовал ещё модульности интеллектов добавить. Так как хочется на любимом Руби AI писать. Надо будет устройство API тогда продумать…

В первых числах января, может, найду время…
MDI. GDI.

Т.е. базовый функционал окон, и самая наипростейшая графика — линии, эллипсы-прямоугольники с заливкой, текст. Ничего специфически виндового. Про .NET в те стародавние времена даже не слыхали.
Блин, а я вот ломаю голову, как бы это лучше в реальновременной стратегии реализовать языконезависимую модульность AI.
Обычное решение для пошаговых стратегий — использовать перенаправление текстового ввода-вывода для управления. Даёт использовать любые языки, где есть scanf/printf, позволяет работать по сети.
В риалтаймовом случае, для тысячи против тысячи, мне становится от такого решения страшно%)

Пожалуй, всё придётся оборачивать в сишные библиотеки со стандартизированым интерфейсом — а там уж каждый сам думает, использовать swig, родные биндинги для любимого языка, транслятор, или что-то ещё…
А что за проект? Просто я не зациклен на своём, это я так, увидел тут на Хабре посты про игры программистов пошли косяками, ну и достал свою старую детскую поделку с дальней полки, пыль сдул, поностальгировал.

Насчёт реального времени — а оно сильно надо, если всё равно нет возможности управлять юнитами «вручную»? Идея в том, чтобы «рендерить» партии заранее. А потом можно посмотреть любой момент с любой скоростью, с любого ракурса в любом увеличении (поскольку рендерится не картинка, и лишь предварительные данные для её быстрого вычисления). Т.е. устраивать разбор партий как в шахматах, кода всё давно сыграно. Тут вполне сгодится stdin/stdout.
Могу попробовать портировать на Qt, только нужно ли это?
Пока непонятно. После НГ загляните на DroneSoft.com. Если там соберётся несколько человек, можно будет у них спросить. А сейчас всем не до кодинга — НГ на носу.
Не то что бы совсем всем не до кодинга. Вот Pinguin модифицировал и среду, и Комрадов, которые теперь бьют моих с небольшим, но стабильным преимуществом.

Вернее били. Сегодня мне это надоело, и я выпустил прошивку Tolmachov.COMRADE 1.1, которые побеждают Pif.COMRADE с преимуществом 230-280 юнитов. Кадры последней битвы: #1 #2 #3 #4
где программировать поведение танчиков? ,)
Надо добавить класс, реализующий интерфейс IUnitSoft и использующий интефейс IUnitBody из трёх методов — Иди, Смотри, Бей.


interface IUnitBody
{
    virtual BOOL See(CUnitInfoArray *&paUnitInfo) = 0;
    virtual BOOL Go(ECourse course) = 0;
    virtual BOOL Beat(ECourse course) = 0;
};


Подсунуть потом этот класс нужно в пару-тройку мест, типа в комбобокс диалога, и всё. Всё довольно просто, детали можно подсмотреть у уже работающих классов AI. Если я недооценил этот момент, и вопрошающих добавится, опишу этот момент подробно.
Не могу удержаться: see — видеть, смотреть — look
Вместо beat лучше attack
Эпично. Только вот не нашел юнита, который бы выходил в конце битвы за почти проигравшую сторону и косил всех вражин. Закон жанра нарушается :(
Сейчас, в свете новых событий имя юниту — Джейк Салли.
Не смотрел ещё. А вы уже весь сюжет рассказали :))
по началу то берсерки явно выигрывают, а потом комрады плотной группой производят зачистку
Сам это так же назвал, зачисткой. Хотя на самом деле термин не совсем подходит. Комрады роятся одной или несколькими группами, и ждут, когда случайный Берсерк проползёт рядом. Поэтому игра иногда очень долго заканчивается на большом поле. Бродит где-нибудь парочка заблудших часами…

Вот если бы рой вытягивался в цепь и действительно прочёсывал местность… В общем, есть что дописать.
ну много чего можно дописать + еще хотелось бы область поражения показывать и область обзора + появлятся строем а не хаотично, разные типы юнитов и.т.д.
… траектории юнитов, полные от начала игры или постепенно растворяющийся след за последние 50 квантов времени, скажем.

«Трупы», т.е. места где кого-то забили до смерти. «Капли крови», т.е. места, где юнит терял здоровье.

И дофига всяких т.д. в запасе :)

А вот асимметричные распределённые системы, с разными типами IUnitBody, это даже в GUI уже заложено. Вот только быстро понял, что и с одним типом такого можно наворотить… Т.е. шахматы — хорошо, но сначала шашки :)
С точки зрения полководца механика понятна, а вот с точки зрения отдельного солдата совсем нет данных.
— На каком минимальном расстоянии происходит атака?
— Сколько хп у юнита?
— Сколько сбивается за удар?
— Может есть еще какие-то моменты?
— Минимальное расстояние предположу что 1
— У юнита 50хп
— За удар сбивается --хп;
p.s. Как сказал автор «это даже заготовкой назвать трудно»
Так что прошу заранее не судить =)
#define UNITDEF_LIFES 50
#define UNITDEF_ACTIONS 1
#define UNITDEF_EYESHOT 200

Разумеется, можно переопределить. Сейчас юнит видит в радиусе 200 пикселов (если можно так выразиться, в их двумерном мире окружность, множество точек равноудалённых от центра — квадрат :) ), и его 50 раз надо стукнуть, чтобы забить до смерти. Одно действие в один квант времени, т.е. или бей, или беги. Не восстанавливаются. Бьют, подобравшись вплотную.
Наверно стоило как-то описать модель игрового мира. Пост начинается глобальными выводами и потом сразу переход к тактике юнитов. По картинкам не очень понятно что происходит.
Чуть выше отписал. Долго вспоминал, где зарыл основное. Что ещё добавить? Недоволен, что изначально выбрал клеточно-шахматрую модель. Нереалистично. GPS наше всё. И бить, подобравшись вплотную — средневековье. Стрельбу надо было реализовать, конечно. Короче, не против основательно переделать этот мир :)

Многих сбивают с толку линии к крестикам, принимают за лазеры. Это все лишь указатели курса, куда на данный момент стремиться попасть юнит. Это или враг, или друг, или случайная точка.
жалко нет поддержки с воздуха и артиллерии, тогда камрадовскому рою наступит конец :)
оо. синхронно об одном подумали :)
не гугл изобрели :)
После того как Комрады скучковались, Берсекам остается только вызвать артиллерию или авиа-налет с ядреной бомбой, что бы разом накрыть всю кучу. :)
Думаю, пройдёт не одно поколения, пока они научатся собирать из пикселов аналог ядерной бомбы. Гении там всякие нужны, уран и проч. При этом им ещё надо будет отбиваться от противника. У Саддама вон не получилось, не успел.
А если серьёзно, то артналёт и авиация пока за рамками модели. Все юниты пока идентичны по железу. Т.е. это шашки, а не шахматы. Вот когда разыгрывать шашечные комбинации надоест, тогда можно будет переделать шашки на шахматы. Добавив, к примеру, более быстрых юнитов, но реже бьющих. Или более медленных, но уж если ударит, так трое лягут :)
Можно попробовать вкрутить простенький генетический алгоритм… и пусть они сами учатся — прошивки выводят. :)

Задать только ограничения типа: толще броня = больший вес = меньше скорость; мощнее вооружение = медленне скорострельность.

И пусть эволюционируют. Будет смысл гонять сражения раз за разом :)
Пока я бы хотел сосредоточится на эволюции их софта, а не их железа.

Хотя была мысль предоставить возможность софту выбирать железо. Только чуть другая: сделать рынок каркасов, брони, пушек, движков, трансмиссий (можно поставить такую, что скорость будет офигенная, но движок станет ненадёжным и короткоживущим), видеокамер (дальше видеть), микрофонов (если добавить возможность слышать шум движков и выстрелы), радиостанций и т.п.

А также рынок виртуального железа, который ближе к виртуальному софту — память, процы, системы охлаждения и т.п. И даже сами прошивки и настройки прошивок. Т.е. одна прошивка может купить другую. Для расширения своих возможностей или для моделирования поведения врага у себя в голове, виртуальность в виртуальности :)

И толпа юнитов перед десантированием сначала делает себе апгрейд на энную сумму, одинаковую обоих для противников. Собственно, тогда даже количество юнитов будет определяться не игроком, а суммой. Будет выбор — накупить самого дорогого оборудования и собрать 10 супер-пупер юнитов, или 10000 китайских :)
Интересная разработка. Из похожего вспомнился NERO game, однако там идёт упор на технологии нейронный сетей.
НЛО прилетело и опубликовало эту надпись здесь
«Без всяких условий выкладываю исходники...»
Это первая строка топика.

И как уже писал в комментах, не вижу препятствий портировать на Qt, Ruby и т.п. Делайте с этими исходниками всё что хотите. Доставайте из топки, тушите… и может таки почитаете, прежде чем жечь мои рукописи? :)
НЛО прилетело и опубликовало эту надпись здесь
а если бы было linux-only?
вознесли бы как божественный дар?
НЛО прилетело и опубликовало эту надпись здесь
а если запускается, но — я оптимизировал AIСomrade — не компилируется?

Очень хочется. Пробовал Visual Studio 2005 и Visual С++ 2008 Express Edition, первая говорит проект устарел (видимо, на самом деле — сделан в 2008 студии), вторая — находит кучу ошибок. Не моих.

Если бы получить уверенность, что установка Visual Studio 2008 поможет… а еще лучше без нее…
Чтобы открыть проект в 2005 студии достаточно в любом текстовом редакторе изменить 9,00 на 8,00 в 4й строчке файла проекта и 10.00 на 9.00 в файле солюшена. Ну или сконвертировать проект для Visual Studio 6 (*.dsp, *.dsw).

Если бы вы процитировали хотя бы парочку ошибок, было бы намного проще угадывать почему не собирается, но с высокой вероятностью из-за отсутсвия MFC в экспресс версии студии, так что установка полноценной студии должна помочь. Ну или опять же — собирайте 2005й.
Спасибо огромное за совет! Исправил по Вашему совету строчки в файлах и компилирую 2005й студией =)

а вот парочка ошибок в 2008й экспресс студии (мне это совсем уже необязательно, но вдруг кому поможет):

1. невозможно преобразовать 'void *' в 'const void *&'
2. невозможно преобразовать 'CObject *' в 'const CObject *&'
3. отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию

Жаль, не могу поставить Вам плюсик =(

Это ошибки не связаны с отсутствием MFC, но странно, что 2008 Professional компилит без всяких ошибок там, где экспресс валится. Но экспресса нет под рукой, так что ничего не скажу по этому поводу.
Да, а оптимизация дала ускорение всего на 20% — гораздо меньше ожидаемого.

Но все же — мелочь, а приятно =)
Спасибо, интересно. Но всё же, игра — это то, в чём ТЫ принимаешь участие. Создание юнитов — это вряд ли можно назвать участием в игре =)
не факт. сим сити и маджести — игры где нету прямого контроля.
Изначальный смысл игры, природный — не развлекалово дабы убить время. Игра из щенят должна сделать волка. Это они в детстве друг друга игриво покусывают. При этом отрабатывают навык рвать глотку. В общем, игра — дело такое, серьёзное :)

К сожалению, современные игры в этом плане сильно проигрывают даже щенячьим. Непрактичны.

А эта (и подобные) хоть научит практическому программированию. И не так уж важно, чем человек потом по жизни будет заниматься, прогать стайки пылесосов или медицинских наноботов. Главное — он будет это делать лучше, чем другие, и рвать глотки конкурентам :)
Интересно. Но исходники бы куда-нибудь на GitHub.com выложили или ещё куда. Просто архивом — неудобно же.
Повторюсь, решил не засорять репозитории. Там и так навалом дохлых проектов. Если у этого будет шанс на реинкарнацию, можно будет выложить.
Репозиториям хуже не будет от ещё одного проекта. А шансы на реюз кода резко возрастают. Гуглём опять же проиндексируется. ;-)
Ладно, признаюсь, есть ещё одна причина, по которой не решусь пока выкладывать в подобные места. Стыдно :) Я же говорю, только начинал тогда прогать. Детство. Здесь-то поймут, а где ещё — не знаю.

Я начинал тестером, очень хотел стать программистом, вот и хватался за что попало. Это всё написал за неделю на коленке. И тут как раз подвернулся шанс перейти из тестерского отдела в программисты.

А проектик этот у меня взял начальник тестерского отдела как тренажёр для начинающих тестеров. К традиционному собеседованию добавили задание на дом: найти баги в этом моём опусе. Потом начальник мой бывший как-то сказал: «Твоя программа просто неисчерпаемый источник багов». Без обид ответил: «Как исчерпаете, я вам их ещё напишу». Гм, может уже пришло время дописывать? :)
Стыдиться в любом случае нечего. Если уж так смущаетесь, приложите соответствующий комментарий, как в начале статьи написали. И копирайты за тот дремучий год поставьте. А неконструктивную критику просто игнорируйте если что.

Выкладывать исходники в архивах, ИМХО, просто обрекать их на смерть.
Конечно, никаких гарантий, что кто-то придёт и будет контрибутить, нет, но сайты типа гитхаба убирают очень много барьеров на пути совместного написания опенсурсного кода.
Хороший шанс дать проекту вторую жизнь упускаете.
Спасибо, за исходники. Буду тренироваться писать AI.
Два вопроса:
1. > Без всяких условий выкладываю исходники
Безо всяких условий означает, что никто не имеет права использовать их в своих разработках и даже пользоваться без вашего личного разрешения. Используйте WTFPL или, хотя бы Public Domain.
2. Почему win-only? :)
В первоначальной редакции текста была фраза, типа «подскажите, какая нужна лицензия, чтобы выложить код свободный от лицензий». Потом убрал, решил, что не смешная шутка. А зря :)

ОК, спасибо, теперь буду знать. Если буду куда выкладывать, укажу WTFPL… Блин, посмотрел что это значит :)) Ещё раз спасибо :)
Win-only — поскольку учить меня в те времена было некому, самоучка, а какой у самоучки выбор? Всё усыпано самоучителями «Windows для чайников». А интернет тогда был только в сказках. Про существование Linux'а, например, узнал довольно поздно и был весьма удивлён, что в мире существует не одна операционная система. Чёрт, и даже не две! :)

А потом с чем только не приходилось работать. Даже под z/OS на мейнфреймах.
WTFPL

Лучше MIT ставьте и не пугайте людей ;-)
Есть такая замечательная игрушка Defcon, там можно повоевать на чуть более глобальном уровне:) А графика та же, «радарная».
Да-да, первая мысль была связано именно с этой игрой.
Помнится, тоже чем-то подобным занимался…
Правда я делал игру крестики-нолики на бесконечном поле, 5 в ряд выстроить надо.
Тоже было весело смотреть, как «бот» с «ботом» бьется. Было 3 уровня сложности, хотя алгоритм у всех один и тот же (сложность определялась как вероятность выбрать «лучший» ход)…
И с человеком можно было играть.
В общем, надо освежить память и тоже выложить ;)
Вспомнил ещё более раннее «детство», спец-училище :) Компьютеры тогда видел только издалека и на картинке, играл «вручную» на деньги, по 10 копеек за фишку. Поллиста в неплохие по тем временам суммы складывались :)
Класс! Спасибо. Интересно.

Судя по моему первому запуску, командная игра мощнее значительно.
Исходные: 1000х1000, поле 1500х900, генерил каждый клан на своей половине. Берсерки и Комрады.
Результат: Б:0, К:506!

Так вышло, что К. за минуты две собрались в 4 атакующих блока (с ореолом отдельных примыкающих единиц), которые потом перешли в 3 (на финише: низ 300 ед., центр 180, верх 30)

Это выглядело как из детства — атака шершней на гнездо пчел (или ос)… шершни каждый по себе и по очереди, а пчелы группой — итог 1в1 «на взгляд».

Хочется придумать сразу тактику собирания К. в группы в зависимости от региона «старта игры» — чтобы не хаотично, а изначально собирались в группы из учета «выстота поля»/3 (/2, /5, и т.п. в соотн. с количеством ед. (хотя этот параметр (общее количество на поле) «каждая единица» может и не знать конечно)…

В целом достаточно интересно.
Жаль нужно быстренько убегать пить пивко с друзьями… Автору СПСБ!!!
Да, и, как кто-то выше писал в комменте (сори, нет времени искать сейчас) — хорошо бы еще генератор преград, хоть простейший:

— тип преграды (можно хоть просто квадрат),
— размеры преграды (высота и ширина или исходя из типа, может быть задание точками или соотнош. сторон)
— позиция на игровом поле (нижнего левого угла к примеру)

чтобы перекрывать «поле зрение» (часть области просмотра)…?
Конечно, эта мысль приходила в голову одной из первых. Настоящие пираты, идущие в обход. Ущелья и мостики, где горстка спартанцев может противостоять армии. Углы, куда можно загнать и окружить. Домики, где десяток юнитов может укрываться от армии и партизанить, охотясь на отбившихся от стада одиночек…

Но решил отложить, как только увидел, насколько ещё много тактик и стратегий можно накодить просто в чистом поле. Преградой тут служат даже свои собственные юниты. Обязательно вернусь к этой идее (и множеству других), если покажется, что потенциал степных войн исчерпан.
Первый абзац прочитал вообще как стеб над моим комментом ;-)
Ок… «вернусь к жизни от пивка» прочитаю еще раз!
Да нет, и не думал стебаться :)

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

Но для описываемого сложного поведения похоже нужно будет две вещи им дать — память и общение. Не обязательно, может быть, но с этим гораздо быстрее дело пойдёт.
Нет уж, память им лучше не давать ;-)
А то они, помня чем все закончилось «в последний раз», пойдут пить пивко в угол поля со всеми вытекающими… хе-хе…
Ну, проблема-то просто решается — пивко ставится в центр поля, и кто успел, тот и… :) У пабов иногда такие бои устраиваются, что аж любо дорого на YouTube выложить :)
Да, ~неделя до НГ — не лучшее время для кодинга :)

По тактике… В этом вся разница программирования «сверху вниз» и «снизу вверх». Надо представлять себя не полководцем, а юнитом. У них сейчас нет памяти, нет понятия о времени. Они не видят поле с высоты птичьего полёта, и понятия не имеют, где находятся. Насколько я помню, они даже стен не видят, пока рогом не упрутся.

И вот исходя из такой ситуации, глядя их глазами — как тут собираться в группы не хаотично? :) Этих парашютистов раскидало рандомным генератором по всему полю (ну по половине, мало что меняет).

Возможное решение (экспромпт): все стоят на месте, кроме увидевших врага. Они бегут организованно отступают в тыл (тыл в противоположной стороне от линии фронта, логично?). Заметив бегущего отступающего товарища, сослуживцы бегут в ту же сторону. И эта волна, по идее, пройдёт до «задней стенки». Уперевшиеся в неё рогом бегут обратно. Увидев бегущих навстречу, паникёры останавливаются в ступоре, потом с воодушевлением бегут рядом уже обратно. Уплотнившаяся волна равномерно достигает линии фронта и зачищает территорию. Не так эффективно, как рой, зато гораздо быстрее.

Но есть в этой тактике… эээ… WALLMAN'ов (так их пока назову) одна неувязочка. Десант необязательно высадят ровно на одной половине. Хотя, как я уже писал, если равномерно перемешать, то кучность по любому уже не поможет, тут нужен микроконтроль.
Интересно, а что если подобную программу использовать для тимбилдинга программерам в рамках одного проекта… *задумалась

а еще, мне кажется, это может быть интересным компромиссом для детей и родителей в вопросе комп игр (тока в этом случае графика должна быть более, так сказать, «ошеломляющей» =) )… Зато представьте как здорово — вырастет поколение ребятишек которые будут не глупо просиживать жизнь в оn-line баймах, но играючи-учиться =) причем с каждым уровнем графика все лучше, сюжет более захватывающий, кодинг более сложный… вот тогда вопрос какого ты lvl будет уже не пустыми «понтами», а показателем знаний и умений.
И вырастет поколение не глупых юзеров-обывателей, но людей, понимающих «как оно работает»… глядишь, и куча проблем и «досадных случайностей» избежать удастся =)
… это я так, не о конкретной проге, а о направлении в целом… размечталась, так сказать =)
НЛО прилетело и опубликовало эту надпись здесь
Возможно, я стал программистом отчасти благодаря игре Жизнь (http://ru.wikipedia.org/wiki/Жизнь_(игра)). Повозился, бросил, но потом были другие мотивы. И до этого были. Как-то в несколько этапов двигался к цели. Да и цель передвигалась.

Это я к чему — может тех, кто бросил, не надо бросать? :) Показать им что-то ещё.
НЛО прилетело и опубликовало эту надпись здесь
Чьорт побъери!
Так вот ты какой — программист боевых человекоподобных роботов!!!
Низкий поклон тебе!!!
В случае соперничества люди проиграют боевым роботам (тупо потому что они сильнее и их больше).
1000 берсерков против 1000 камрадов на поле 1600*900, ровно 500 камрадов выжило :)
Да, уже собрал, сделал с копию комрадов, назвал ее скайнет. Делаю своих умных берсерков. Уже 1к1 воячат.

ЗЫ кучкование таки рулит
Против кучкования должна помочь формация «полумесяц» с последующим окружением.
Э… Строить формации это очень сложно, особенно, если они друг с другом не говорят. Это проблема.
Говорить им с друг-другом или нет — это задача реализации, при желании «разговор» сделать можно.
Кстати… тут еще очень неплох был бы на будущее выделенный сервер (физ или впс сначала, не суть важно).

Где можно было бы, скинув свой исходник юнита, под своим аккаунтом, его скомпилить и «оживить» в противостоянии с любым другим сторонним юнитом.

Разрешить допустим 2 (5,10,...) одновременных «противостояний» и простую бронь поля для противостояния, если «сейчас» все занято.

Я с серверными gcc (и т.п.) знаком лишь по наслышке, но думаю должно быть возможно портировать под *иксы.

Ну и конечно авто-стоп тут просто обязателен.
А как быть с клиентом? Обзор всего широкоформатного поля высокого разрешения одним взглядом — одна из основных черт скромного обаяния :) Возможно, какая-нибудь из современных технологий (flash, silverlight, etc) тут поможет, я просто не в курсе.

Но если даже на это забить, и в браузере показывать только небольшую часть поля, то идея уже имеет право на реализацию.

В конце концов, можно вообще не показывать игр на сайте, показывать только статистику результатов, таблицу рейтингов. Т.е. посетитель гоняет своих юнитов против чужих у себя на машине. Потом видит, что его юнит добился неплохих результатов, и высылает код на сервер. Сервер, погоняв юнита у себя, суёт его результаты в таблицу. Возможно, с небольшим видеороликом самых жарких моментов боёв, чтобы другие могли заценить не только внутреннюю красоту кода (можно и не публиковать, кстати), но и внешние проявления этой красоты.
Если он-лайн, то думаю что флеш вытянет, но конечно канал клиенту нужен будет нормальный.

С другой стороны можно на автомате делать снимки боя с настраиваемой задержкой (3, 5, 10,… сек) и потом их дать на просмотр/скачивание на сутки к примеру.

Ага; и про рейтинги я не написал, хотя вчера это в голове сразу было — рейтинги юнитов под «брендом» участника-программера (или команды)…
Ладно, всё это можно, но пока мало кому нужно (?). Нужна пропаганда «здорового образа игрежа на компьютере», чтобы и сердцу и уму. Пока же в основном всем хватает мозжечка :) Вот в этом плане идей здорово не хватает, не знаю я, как сколотить хотя бы небольшое комьюнити вокруг игры для программистов (пусть даже не этой конкретной, или этой, но переделанной до неузнаваемости).

Вот с этим бы разобраться. Поможет тут сервер или нет. Чисто социопсихология… и экономика, к сожалению. У меня хост 20GB трафа на год проплачен, но понятия не имею, на сколько этого ресурса хватит. И не хотелось бы корпеть-кодить-тестить месяцами, а потом убедиться, что это никому не нужно (десяток энтузиастов не в счёт, они и без сервера таблицу рейтингов построят).
К сожалению, тут одной статистикой не обойдешься (так не увидишь, где ты слаб — толи в одно ядро собраться не смог, толи тебя окружили и съели).
Наверное, стоит записывать бой и проигрывать его потом.
Как самый простой вариант записи и проигрывания — это дать скачать модель врага и работать с повторяемыми наборами псевдо-случайных чисел. В итоге, на запись боя необходимо только модель и 1 число :)
Конечно, давать модель немного нечестно (диссасемблирование еще ни кто не отменял), но тогда можно просто сохранять все действия в файле, сжатие такого файла, думаю, пройдет на «Ура».
Да, примерно так я и хотел реализовать сохранение, не только статику на момент сохранения, но всю динамику, просчитанную от начала игры. Чтобы потом можно было просмотреть любой момент, в т.ч. с ускорением, или обратную перемотку с просмотром сделать.
Но тут со сжатием придется хорошо подумать…
Пусть имеем 2000 юнитов, бой длится 1000 раундов. Для воспроизведения нам необходимо 2 вещи: выбранное действие + координаты цели. Итого минимум байта 4 (1 байт на действие + 3 на координаты цели(12 бит на 1 координату дает поле 4096х4096)).
Это даст около 7.6 МБ объема лога. Пусть в течении игры число объектов сократилось до 0. Тогда объем уменьшится вдвое и составит 3,8 МБ (и это без учета того, что мы не храним информацию о убитых, мы не храним информацию о начальном положении всех юнитов, у нас нет прочей «служебной» информации).
В общем, довольно объемный лог получается…
Да, но если сравнивать с объёмами HD видео… :)
Опять же, объём современных винтов возьмём, и скорость падения цены хранения мегабайта…

Но есть ещё один способ — специфические для данной системы способы сжатия. Например, по биту на соседнюю клетку при движении (8 направлений). Т.е. записываем координаты не каждый кадр, а каждый шестнадцатый, допустим (просто от балды 16). А на промежуточных просто битами ходим от этой начальной точки. Тут есть конечно, тонкости, типа стояния на месте. Но это детали, суть вы ухватили уже, думаю :)

P. S.
И однажды кто-нибудь научит этих однопиксельных тварей ходить строем в конце-то концов. Что сильно положительно скажется на объёме файла сохранения :))
Я не за хранение лога боюсь, а за его передачу пользователю :)
Я и брал биты по направлениям (4 бита задают все 8 направлений + возможное действие — атака или ход). Еще хотел просто сохранить направление указателя цели. Конечно, запись только каждого, скажем, 10 кадра дает хорошее преимущество (0,5 метра, скажем на лог). Может, архивирование даст еще сжатие раза в 2.
Идея, конечно, состоятельна, но может вылезти проблема обработки — на сервере процессора просто не хватит на большой объем сражений (хотя, если не будет вывода информации на экран, то алгоритм работы может ускориться в разы)
поставил, включил 1000 на 10000
вспомнил комбатс, групповые бои :)
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.