• Как разделить код на несколько файлов?

    Vindicar
    @Vindicar
    RTFM!
    У тебя будет проблема с циклическим импортом: основной файл будет импортировать модули с функциями, но этим модулям будет требоваться экземпляр бота, описанный в основном файле. Эту проблему можно обойти так:
    # submodule_1.py  - модуль, содержащий часть функций бота
    def setup(bot):  
        # bot - объект бота. Можешь добавить и другие полезные параметры, такие как:
        # - объект logging.Logger для журналирования
        # - объект соединения с БД
        # - ну и что там ещё тебе потребуется
    
        # все обработчики событий объявляем ВНУТРИ setup()
        # тогда они смогут ссылаться на переданные параметры
        @bot.command('/start')  # например, чтобы использовать декораторы
        def on_start(message):
            message.reply('foobar')
    # мы описали функцию setup(), но здесь мы её не вызываем!
    
    
    # main.py - основной файл бота
    bot = ...  # создаём объект бота
    
    import submodule_1  # импортируем модуль с функциями
    # при вызове setup() будут заданы обработчики событий, описанные в ней
    submodule_1.setup(bot)  # функции передаём объект бота (и другие объекты, если она их ожидает)
    # функцию setup() нужно вызывать не более одного раза!
    # так можно добавлять столько модулей, сколько требуется.
    
    bot.run()  # дальше бота запускаем как обычно
    Ответ написан
    2 комментария
  • Что означает это ошибка и как его исправить?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Flask
    Седой и строгий
    Не стоит даже пытаться использовать Flask с pyrogram в одном скрипте. Если хочется из web-приложения ботов запускать, надо искать другие подходы. Вариантов масса: от простых, вроде запуска отдельных скриптов с кодом ботов чем-нибудь вроде Popen, до создания в Kubernetes деплоев с ботом внутри контейнера.
    Ответ написан
    Комментировать
  • Как это верстать?

    delphinpro
    @delphinpro Куратор тега Вёрстка
    frontend developer
    Обычные картинки на фоне.
    Фоны могут быть множественными.
    Фоны могут позиционироваться.
    Плюс медиа-запросы для корректировки.
    Ответ написан
    Комментировать
  • Как это верстать?

    godsplane
    @godsplane
    background-image
    Ответ написан
    Комментировать
  • Как сделать всплывающее окно бразузера?

    @serNoName
    Js:
    window.open("about:blank", "hello", "width=200,height=200");
    Ответ написан
    Комментировать
  • Как сделать так чтобы змейка появлялась с нулевой координаты а не с один блок справа?

    twobomb
    @twobomb
    Поставьте код
    var head = {
          x: px,
          y: py,
        };
        snake.unshift(head);

    после
    if (px >= canvas.width) {
          px = 0;
        }
        if (px + box < 0) {
          px = canvas.width;
        }
        if (py >= canvas.height) {
          py = 0;
        }
        if (py + box < 0) {
          py = canvas.height;
        }

    Потому-что у вас всё по китайски, вы сначала делаете движение,потом добавляете, а потом уже делаете проверки. А нужно все наоборот.
    Использование setInterval для gameLoop - зло, никогда так не делайте. Используйте requestAnimationFrame или setTimeout на худой конец.
    И вообще структура ужасная не читабельно. Разделите отдельно фукнция просчет физики, отдельно рендеринг не смешивайте и вызывайте в gameloop по порядку всё.
    Ответ написан
    Комментировать
  • Почему этот код срабатывает всегда а не только когда змея откусывает себя?

    @yari_check
    Как я понимаю, этот метод нужен только для того, чтобы удлиннить змею, и данное значение потом никуда не передается и просто удаляется в конце
    if (snake.length < maxCell) {
      snake.push({ x: px, y: py });
    }

    Баг выскакивает из-за того, что ты закидываешь значение head в конец массива, а потом весь массив на совпадение с head проверяешь
    for (let i = 1; i < snake.length; i++) {
      if (head.x === snake[i].x && head.y === snake[i].y) {
        console.log("hii");
      }
    }

    Добавляй другое значение в конец и все будет работать :)
    Ответ написан
    1 комментарий
  • Почему код не работает когда змейка кушает яблоко?

    Dr_Elvis
    @Dr_Elvis
    В гугле забанен
    У вас координаты не совпадают
    63d1130e75ab8105557932.png
    Ответ написан
    6 комментариев
  • Знаю основы HTML CSS, но верстать не получается. Как преодолеть баръер?

    Skolpov
    @Skolpov
    Веб-дизайнер
    «Ты в начале крив, косой,
    а потом уж Лев Толстой».


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

    «Боже, я никогда не научусь верстать как они :( ...»
    «Блин эти ребята так круто делают, видимо у меня нет дара...»
    «Наверно это не мое, лучше пойду я отсюда...»

    КОНКРЕТНО О ПРАКТИКЕ НОВИЧКА

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

    Не нужно сразу пытаться сверстать весь сайт, научись верстать отдельные кусочки. Уверен, ты каждый день сидишь в VK. Поставь себе цель — Сверстать страницу регистрации VK например за три дня. Сегодня например сверстай шапку (без перфекционизма). Начни с малого. Со временем одной левой сможешь верстать то, что сейчас тебе кажется тяжелым. Да будет не так, да многое из головы вылетит. Не беда, гугл всему голова. У любого профи есть самый главный Шаолиньский скилл — «Мастерство великого гугления». Не все его постигают в начале пути, но многие все равно придут к нему однажды.

    Перфекционизм и навык PixelPerfect— качество профессионалов, мы новички должны в начале делать ошибки Не надо вылизывать каждый участок макета, к этому ты придешь сам, но тогда, когда ты уже спокойно сможешь верстать. За то время пока ты пытаешься сделать крошечный блок сайта идеальным, ты бы мог уже быстро набросать весь макет и на практике использовать сразу много тегов и увидеть их к действии. Не надо заниматься в начале созданием идеального сайта, первые сайты все равно будут говно.

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

    Главное не останавливаться. И надо смириться, что верстальщик всегда должен развиваться. Не только теорией но и практикой. Это его дар и его проклятье на всю жизнь. А грамотно развиваться поможет только грамотный подход к этому.

    Всего лишь мое маленькое, скромное мнение.
    Ответ написан
    Комментировать
  • Не запускается Open Server "Не удалось запустить MySQL-5.6", что делать?

    @serwiga
    Мне помогло следующее
    Ошибка появилась после очистки папки temp c:\OpenServer\userdata\temp\
    там не было папки upload, после создания каталога сервер стартует без ошибки, нашел через отладочный режим
    Ответ написан
    Комментировать