Ответы пользователя по тегу C++
  • Знаете ли вы ещё подобные проекты?

    @d0lph1n
    Здравствуйте.

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

    А генетических алгоритмов много. Мне, к примеру, на университетских курсах повезло познакомиться только с тремя, и описанное мной ниже - это т.н. классический ГА:
    • вначале берется случайный набор чисел (популяция особей)
    • из контекста задачи выбирается функция проверки качества (фитнесс-функция, ее-то мы и оптимизируем)
    • числа "спариваются" с определенной вероятностью, часто в районе 0,7 (кроссинговером называется: можно, например, местами поменять старшие и младшие двоичные разряды),
    • появляются и мутируют "дети" с небольшой вероятностью (можно инвертировать один бит, например)
    • при помощи фитнесс-функции собранные вместе предки и потомки ранжируются (чем выше/ниже показатель фитнесс-функции, тем лучше/хуже или хуже/лучше особь)
    • по результатам ранжирования худшие особи отбрасываются

    Как видно, в основу положены базовые биологические эволюционные механизмы. Они применяются для задачи оптимизации, но не симуляции.

    Т.е. возможно, что автор ролика создал параметризуемую симуляцию на основе клеточных автоматов, и эти параметры он оптимизировал при помощи ГА. Задача не столько математическая или техническая, сколько "креативная". А это значит, что Вам, вероятно, будет интереснее разработать самому какой-нибудь комбайн на стыке ГА и клеточных алгоритмов, чем копаться в чужом, возможно, малопонятном коде.
    Ответ написан
    Комментировать
  • Как правильно организовать взаимодействия объектов в игре, что бы не нужно было узнавать тип объекта(с++, ООП)?

    @d0lph1n
    Не вижу красивого решения, подходящего под Ваши ограничения. Мне кажется, можно добавить дополнительную абстракцию: BaseObject <- BasePoint <- Point, а в GameField из LevelLoader передавать не массив BaseObject'ов, а контейнер (назовем его Level, например), который содержит Ваши точки и прочие игровые объекты в отдельных структурах данных.

    С другой стороны, если у Вас GameField - это доска для игры в ГО, на которой всего-то и есть, что черные точки да белые точки, тогда вовсе нет смысла создавать BaseObject. Задача больше похожа на архитектурную, чем на техническую, и решать ее будет удобнее, если Вы подробнее опишете задумку.

    UPD. p. s. От "грязных" трюков совсем уж отказываться не стоит, особенно если приперло. В Qt, например, реализован механизм определения типа, и это не костыль, а жизненно важная фича для реализации концепции управления объектами. А в Java так и вовсе существует т. н. "рефлексия", что подразумевает не только способ определить имя класса, но и получить информацию о его методах и атрибутах. Казалось бы, какая гадость! Но ведь работает.

    UPD2: Не знаю, актуально это еще для Вас или нет, но я наткнулся вот на какой трюк в Книге "Эккель - Философия C++, часть вторая", страница 234.

    template <class t>
    class base {
        static int sn_objects;
    public:
        base() {
            sn_objects++;
        }
        ~base() {
            sn_objects--;
        }
        static int count() {
            return sn_objects;
        }
    };
    
    template<class t> int base<t>::sn_objects = 0;
    
    class daughter : public base<daughter> {};
    class son : public base<son> {};
    
    int main(int argc, char** argv) {
        daughter d1;
        daughter d2;
        daughter d3;
        son s1;
        std::cout << daughter::count() << std::endl; // --------- 3 ---------
        std::cout << son::count() << std::endl; <b>   // --------- 1 ---------
    
        return 0;
    }


    Однако в этом случае мы не сможем посчитать все объекты, унаследованные от base. Только если мы base унаследуем от какого-нибудь другого класса, где будем считать статические переменные по-старинке:

    #include <iostream>
    
    class the_very_base {
        static int sn_common_counter;
    public:
        the_very_base() {
            sn_common_counter++;
        }
        ~the_very_base() {
            sn_common_counter--;
        }
        static int count_all() {
            return sn_common_counter;
        }
    };
    int the_very_base::sn_common_counter = 0;
    
    template <class t>
    class base : public the_very_base {
        static int sn_objects;
    public:
        base() {
            sn_objects++;
        }
        ~base() {
            sn_objects--;
        }
        static int count() {
            return sn_objects;
        }
    };
    
    template<class t> int base<t>::sn_objects = 0;
    
    class daughter : public base<daughter> {};
    class son : public base<son> {};
    
    int main(int argc, char** argv) {
        daughter d1;
        daughter d2;
        daughter d3;
        son s1;
        std::cout << daughter::count() << std::endl;              // --------- 3 ---------
        std::cout << son::count() << std::endl;                       // --------- 1 ---------
        std::cout << the_very_base::count_all() << std::endl; // --------- 4 ---------
    
        return 0;
    }


    Основано, разумеется, на статических переменных, но только в самом исходном коде статическая переменная всего одна - не приходится объявлять их по 10 штук.
    Ответ написан
  • Собираюсь учить С++, но какими знаниями надо обладать?

    @d0lph1n
    Почему-то в последнее время люди одержимы языками программирования, возносят их в абсолют, делают из них манну небесную, эдакую сакральную мудрость, особенно если речь заходит о C или C++. Для того, чтобы научиться программировать, не нужно знать ничего. Поэтому дерзайте - если Вы смогли осилить физику, осилить такую ерунду, как язык программирования, Вам труда не составит. :)

    UPD. Я, кстати, рекомендую Вам прочесть следующие книги и в следующей последовательности:
    1. "Доусон Майкл - C++ через программирование игр". Там, конечно же, не рассказывается, как в одно лицо создать "Кваку", но зато полно красивых и содержательных абстракций, которые не только упростят понимание, но и помогут по-настоящему полюбить язык.
    2. А после Доусона возьмите "Солтер - C++ для профессионалов". Именно после Доусона. Очень хорошая книга в хорошем переводе.

    После этих двух прочтите (погуглите) о современных стандартах: C++11, C++14, C++17. И все - Вы "сипипишник".
    Ответ написан
    Комментировать
  • Как запустить exe ве Qt Creator??

    @d0lph1n
    blog.harrix.org/article/1015

    Хорошая подробная и, что главное, рабочая инструкция.
    Ответ написан
    Комментировать
  • С чего начать изучение C++, если есть опыт программирования на других языках?

    @d0lph1n
    Предлагаю такой марафон:

    1. Доусон Майкл - Изучаем C++ через программирование игр.
    Небольшая книга, полна красивых манипуляций с CPP-классами, разобраны некоторые приемы ООП, и все снабжено настолько показательными и красивыми примерами, что остается только снять шляпу.

    2. После этого рекомендую взять Солтера: "Солтер - C++ для профессионалов".
    Книга очень полезная в качестве самоучителя при имеющемся наборе знаний, а также в качестве справочника. Довольно большая, на 900 страниц, но после Доусона некоторые главы Вы будете пролистывать по диагонали, так что много времени (даже если читать от корки до корки) это не займет.

    3. Однако книга Солтера не переиздавалась с 2006 года. Она осталась актуальной, но перестала быть полной, поэтому прочтите тонкости и фишки новых стандартов: c++11, c++14 и можете замахнуться на c++17, если останется время и будет необходимость. Специальную книгу для этого искать необязательно - просто погуглите.

    4. Для полноты картины прихватите "Гамма, Хелм... - Приемы объектно-ориентированного программирования. Паттерны проектирования". Книга концептульных идей про то, как организовывать структуру и взаимодействие классов. Знания эти применимы к любому объектно-ориентированному языку, но в ней примеры разбираются именно на C++, что очень удобно. Уж не знаю, прочтете ли Вы ее всю, сразу или нет, но держать под рукой не помешает.

    И вот Вам дополнительная ссылка на шпаргалку по паттернам, чтобы было проще ориентироваться в книге.

    5. Если Вам понадобится строить интерфейсы, возьмите книгу по библиотеке Qt "Шлее - Qt 4.8". По Qt есть еще книга товарищей Бланшет и Саммерфилд, но мне она понравилась меньше.

    Пункты 1,2,3 - рекомендуемые. Пункт 4 - рекомендуемый в долгосрочной перспективе. Пункт 5 - популярный (в т.ч. среди работодателей).

    6. Керниган, Ритчи - язык программирования C. Формально язык C++ - это надмножество языка C с полной обратной совместимостью. Книга очень короткая и очень простая. Прочтите, чтобы получить полную картину.
    Ответ написан
    1 комментарий