• Как работает ИИ в играх?

    @loysob
    Вопрос скорее про "скриптовую игровую логику в играх". Следует подумать о ключевом примере (псевдокод):
    monster1.walkTo(level.homepointA); // идет из текущей точки в точку A, длится минуты
    monster1.walkTo(level.coverpointD); // идет из точки A в точку D, длится минуты
    monster1.fireAt(enemy, 5.0); //  стрелять по врагу 5 минут
    monster1.walkTo(level.homepointA); // идти обратно в точку A

    Входные данные:
    - Статические: Разметка карты невидимыми объектами с именами. Их использует скрипт. У объектов могут быть свойства (высота укрытия например)
    - Времени выполнения: enemy - ссылка на объект врага. Обычно монстр получает уведомление о появлении игрока в радиусе видимости. (Думать о реализации событий и нотификаций)
    Императивные действия, "глаголы":
    Вы правильно заметили про потоки и последовательности. Хотелось бы чтобы действия "длились" и выполнялись последовательно и параллельно для разных ботов. В mainstream языках это невозможно стандартными методами. И поэтому там каждой строчке будет соответствовать состояние в стейт-машине. (Читать про FSM).
    В идеале же для работы в "последовательном стиле" можно воспользоваться coroutines. Это псевдо-потоки как раз для описанного случая. Разумеется, все описанные выше действия можно дополнять стандартными ветками if/else, циклами for/while и т.д.
    Вот пример интеграции Lua и C++: https://github.com/loyso/LuaCSP

    Для начинающего лучше конечно реализовать подход 1 бот = 1 стейт-машина.
    Ответ написан
    Комментировать
  • Как собрать все окна с двух мониторов на один?

    GavriKos
    @GavriKos
    Ну про одновременно - не знаю, но вместо Alt+space и переместить используйте Win+shift+влево/вправо, в зависимости от того, какой монитор был основным. Это намного проще для одного окна.
    Ответ написан
    1 комментарий
  • Логгирование Python, как быстро сделать вывод ошибок в файл?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Самое первое, что нужно делать в любом более-менее полезном скрипте или большой программе - это настроить логирование.
    В самом простейшем виде его можно устроить так:
    import sys
    import logging
    if __name__ == '__main__':
        log = logging.getLogger()
        log.level = logging.DEBUG
        log.addHandler(logging.StreamHandler(sys.stderr))
    else:
        log = logging.getLogger(__name__)
    
    ## Используем так:
    log.info('any text')
    log.debug('Something about %r in %s', log, __name__)
    
    ## Здесь размещаем весь остальной код
    if __name__ == '__main__':
        pass  # А здесь, если надо, размещаем то, что будет выполняться, когда модуль запускают как скрипт

    Тут всё логирование заворачивается в sys.stderr, не настроено форматирование, вывод в файл и ротация. Это минимальный уровень, дающий возможность отказаться от print для логирования.
    Пример для питона 2.7.
    Добавлю, что при непосредственном запуске этого кода логгер создаётся с именем по умолчанию (root). Это значит, что в других модулях проекта, управление которым передаётся,
    log = logging.getLogger(__name__)

    создаст логгер с именем модуля, и в главном файле можно будет настроить роутинг логов с учетом этих имён.
    Роутинг настраивается добавлением дополнительных хендлеров и к ним разных фильтров. Если есть какие-то затруднения с этим - пишите, поясню.
    Использовать правильное управляемое, расширяемое и гибкое логирование вместо россыпи принтов очень просто. Нужно просто себя приучить к этому, как к чему-то обязательному вроде чистки зубов, использования системы контроля версий и своевременного бэкапа.
    Ответ написан
    Комментировать
  • Логгирование Python, как быстро сделать вывод ошибок в файл?

    qlkvg
    @qlkvg
    python backend developer
    прикрутите logging, пока не поздно. Один раз создать логгер и поменять все print на logger.info - дело где-то 5 минут. Взамен получите возможность быстрого переключения логирования в файл/консоль, разбивку сообщений по уровням (очень удобно отделять дебажные сообщения от информационных и диагностических), полноценное логирование исключений и еще кучу всяких плюшек.
    Ответ написан
    Комментировать
  • Как с помощью ползунка изменять размер картинки в окне?

    mmmaaak
    @mmmaaak
    Задаешь диапазон значений ползунку в редакторе интерфейса, в коде подписываешься на событие изменения положения ползунка, в обработчике меняешь размер картинки и перерисовываешь, или как они там у тебя отображаются
    Ответ написан
    Комментировать
  • OpenCart или Woocommerce в 2018?

    Marrriya
    @Marrriya
    WооСommerce - дополнение к WordPress

    Можно добавить доставку и заказы; добавление товаров и категорий, меток, атрибутов, управление комментариями - удобно. там больше 60 бесплатных плагинов и около 10 бесплатных тем, и он чуть проще, чем OpenCart. Хотя у меня друг сейчас запускает интернет-магазин игрушек, ассортимент примерно как у вас, делает на опенкарте, очень доволен. Он в Академии интернет-бизнеса учится, вроде там кураторы советовали, тоже можете вопрос задать.
    Ответ написан
    Комментировать
  • Как передать параметры в виде словаря в функцию?

    sortarage
    @sortarage Автор вопроса
    Я тучка-тучка-тучка, я вовсе не медведь
    Пока писал вопрос, подумал с другого конца и нашел решение :)

    d = dict(p1=1, p2=2)
    def f2(p1,p2):
        print p1, p2
    f2(**d)
    Ответ написан
    3 комментария
  • Как ограничить точность времени до миллисекунд в питоне?

    ZeroDX
    @ZeroDX
    Бездельник
    mcs = int(res.microsecond/1000)*1000
    res -= datetime.timedelta(microseconds=mcs)
    Ответ написан
    Комментировать
  • Сложить значения одинаковых ключей множества словарей объеденённых списком?

    JaxxDexx
    @JaxxDexx
    from collections import Counter
    
    a = ({'Петя': 6, 'Вася': 8, 'Дима': 11, 'Юля': 3}, {'Петя': 5, 'Вася': 36, 'Дима': 4, 'Юля': 8}, {'Петя': 54, 'Вася': 21, 'Дима': 22, 'Юля': 39}, {'Петя': 61, 'Вася': 48, 'Дима': 71, 'Юля': 73})
    c = Counter()
    for d in a:
        c.update(d)
    Ответ написан
    1 комментарий
  • OpenCart или Woocommerce в 2018?

    maxxannik
    @maxxannik
    Сайты на WordPress + Интернет магазины WooCommerce
    WooCommerce - это №1 на рынке в мире. В РФ пока что нет. Но все больше плагинов появляется под русские системы платежей и доставки. Самые популярные уже можно найти.
    Плюс - простой в использовании, дает все преимущества ВордПресс включая разные СЕО плагины. Гибкий в разработке с одним но...
    Минус - разработку на нем стоит вести если есть большие бюджеты на дорогих программистов. Джуниоры и мидлы с его системой хуков могут не справиться. Надо уметь читать исходники и понимать архитектуру хуков. Большинству программистов такое не по мозгам. Однако если получится найти хорошего программиста - то гибкость там колоссальная. Можно любую задумку реализовать не ломая ядро и не теряя возможности обновляться.

    Рекомендация - если бюджет меньше 1 млн руб в месяц то брать тему Сторфронт, настраивать типовую механику. Получите современный, удобный, адаптивный магазин без существенных затрат. Что то придумывать, звать программистов, пилить какие то фантазии есть смысли лишь при наличии бюджет от 1 млн руб/мес и выше.
    Ответ написан
    Комментировать
  • OpenCart или Woocommerce в 2018?

    sim3x
    @sim3x
    На крайний случай - магента

    Базовый вариант - статические файлы на базе вашего прайслиста, собирающиеся автоматом сборщиком

    опенкарт
    широко распростаренен
    качество кода - плохое
    багфиксы никто регулярно не накатывает (а иногда их и нет вообще)
    куча нуленных скриптов с вирусами
    огромное количество средств для автовзлома

    вордпресс
    широко распространен
    качество кода получше
    багфиксы никто не накатывает
    те же проблемы со скриптами с вирусами
    оргомное колличество скриптов для автовзлома

    Те просто запустип магазин на WP/OC и работаете - не получится
    Ответ написан
    4 комментария
  • OpenCart или Woocommerce в 2018?

    zorca
    @zorca
    Если только магазин с оплатой через сайт и нужно быстро, конечно Opencart. Если нужен только каталог, без возможности покупки на сайте, то это решается штатными средствами, без установки Woocommerce.
    Ответ написан
    3 комментария
  • Когда делать ORM mapping?

    phoenixbk
    @phoenixbk
    В своем приложении вы описываете объекты хранения в виде ООП классов. Далее, при работе с этими объектами в Python, система ORM транслирует объектные взаимодействия в SQL в соответствии с указанным провайдером.
    Например, print(Person[person_id].name) сгенерирует следующий SQL код для SQLite:
    SELECT "id", "name", "age"
    FROM "Person"
    WHERE "id" = ?

    Где вместо вопроса подставит указанный person_id. Он выполнится в SQLite, вернет данные в ORM и она уже выдаст нам запрошенные данные в виде объекта Person, из которого в данном случае мы выводим имя.
    И это будет работать так независимо от того, первый раз вы запускаете приложение или сотый.
    На официальной странице Pony ORM все довольно понятно расписано в разделе первые шаги:
    Getting Started with Pony
    Для понимания взаимодействия ORM с базой данных советую включить отладочный режим: set_sql_debug(True). В это случае в консоль будет выводиться все взаимодействие с БД.
    Ответ написан
    Комментировать
  • Какой бесплатное универсальное IDE под Python?

    mmmaaak
    @mmmaaak
    Pycharm CE
    Ответ написан
    Комментировать
  • Книги по Python для начинающих?

    zooks
    @zooks
    Frontend
    4-е издание Лутца "Изучаем Python" содержит Python 3-ей версии. Поэтому читать не только можно, но и нужно.
    Ответ написан
    8 комментариев
  • Cмысл декоратора property?

    AtomKrieg
    @AtomKrieg
    Давай я поищу в Google за тебя
    "чем отличается первый метод от второго?"
    первый метод нужно вызывать без скобок и он прикидывается обычной переменной-членом класса, хотя внутри может быть спрятана весьма замысловатая логика. Обычный геттер, только более удобный.
    Ответ написан
    1 комментарий
  • Cмысл декоратора property?

    zymanch
    @zymanch
    python/django web-developer
    что, вкратце, делает декоратор property:
    class property(object):
        def __init__(self, fget):
            self.fget = fget
    
        def __get__(self, obj, type = None):
            return self.fget(obj)

    т.о., property реализован через дескриптор, в котором есть только getter
    в случае вашего примера, с точки зрения внутренней архитектуры python, разница будет такова:
    obj = Person()
    # obj.full_name_2()
    Person.__dict__['full_name_2'](obj)
    # obj.full_name_1
    Person.__dict__['full_name_1'].__get__(obj)

    зачем это нужно? для себя я вижу пока что только одну причину - отделить свойства класса от методов, позволив обращаться к "вычисляемым" свойствам не как к функциям, а как к атрибутам
    Ответ написан
    Комментировать
  • Cмысл декоратора property?

    @abcd0x00
    >>> class Person:
    ...     first_name = 'First'
    ...     last_name = 'Last'
    ...     
    ...     @property
    ...     def full_name_1(self):
    ...         return ' '.join([self.first_name, self.last_name])
    ...     
    ...     def full_name_2(self):
    ...         return ' '.join([self.first_name, self.last_name])
    ... 
    >>> p = Person()
    >>> p.full_name_1
    'First Last'
    >>> p.full_name_2()
    'First Last'
    >>> p.full_name_2
    <bound method Person.full_name_2 of <__main__.Person object at 0xb739a5ec>>
    >>>
    Ответ написан
    1 комментарий