• Почему персонаж неправильно поворачивается!?

    @YariKartoshe4ka
    Очень трудно разбираться в коде, написанном как в последний раз.
    Если вы собираетесь демонстрировать его другим, почитайте про PEP8

    Ваша проблема заключается в том, что вы не обновляете rect игрока
    Одно из возможных решений:
    sc.blit(player.image, player.image.get_rect(center=(player.x - scroll.x, player.y - scroll.y)))
    Ответ написан
    1 комментарий
  • Возможно ли создать операционную систему для игр сделанных на юнити?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Ну, в теории, можно сделать все. При наличии бюджета с 8+ нулями, пары лет, сотни толковых программистов и договоренностей с поставщиками оборудования, которые решатся создать дрова под вашу ось и, разумеется разрабов unity, согласившихся портировать движок на вашу ось (тоже, разумеется за сумму с приличными нулями).
    Ответ написан
    Комментировать
  • Почему ядро странно себя ведет?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я пишу новую операционную систему и столкнулся с непредвиденным поведением ядра

    Обычно в этот момент люди начинают пользоваться отладчиком.

    проблема в файле kernel\kernel.asm

    Нет. Ядро твоё не запускается, потому что бутлоадер пытается загрузить его поверх собственного кода:

    0x00008122:  bb 00 81                 movw     $0x8100, %bx
    0x00008125:  50                       pushw    %ax
    0x00008126:  b8 00 00                 movw     $0, %ax
    0x00008129:  8e c0                    movw     %ax, %es
    0x0000812b:  58                       popw     %ax
    0x0000812c:  cd 13                    int      $0x13

    -- это вызов int 13 из бутлоадера, посмотри на адреса. Вот куда возвращается выполнение после этого int 13:

    0x0000812e:  00 00                    addb     %al, (%bx, %si)
    0x00008130:  00 00                    addb     %al, (%bx, %si)
    0x00008132:  00 00                    addb     %al, (%bx, %si)
    0x00008134:  00 00                    addb     %al, (%bx, %si)
    0x00008136:  00 00                    addb     %al, (%bx, %si)
    0x00008138:  00 00                    addb     %al, (%bx, %si)
    0x0000813a:  00 00                    addb     %al, (%bx, %si)
    0x0000813c:  00 00                    addb     %al, (%bx, %si)
    0x0000813e:  00 00                    addb     %al, (%bx, %si)
    0x00008140:  00 00                    addb     %al, (%bx, %si)
    0x00008142:  00 00                    addb     %al, (%bx, %si)
    0x00008144:  00 00                    addb     %al, (%bx, %si)


    Такие дампы ты можешь получить запуская своё ядро в qemu следующим образом:
    qemu-system-i386 -hda collector.bin -d in_asm,exec,cpu -D log
    Ответ написан
    7 комментариев
  • Как перейти в P-mode asm?

    @kalapanga
    Есть вот такая книжечка, старенькая, но вроде как раз в тему: https://www.frolov-lib.ru/books/bsp/v06/index.html
    Где её раздобыть - уж сами найдёте.
    Ответ написан
    1 комментарий
  • Как переключать функции в питоне?

    Wispik
    @Wispik
    если я правильно понял проблему, то
    создай словарь
    lang_dict = {
      "EN" : {
        "button1": "button1",
        "button2": "button2"
      }, 
      "RU" : {
        "button1": "кнопка1",
        "button2": "кнопка2"
      }
    }

    и бери из него названия кнопок в зависимости от языка
    lang_dict["RU"]["button1"]
    Ответ написан
    Комментировать
  • Как разложить вложенные массивы в одномерный?

    @denislysenko
    data engineer
    my_list = ['lloc', [['.', 'orgstart']]]
    
    
    def my_function(array):
      res = ''
      for i in array:
        if type(i) != list and i != '.':
          res += i + ' '
        elif type(i) == list and i != '.':
          res += my_function(i)
      
      return res
    
    result = my_function(my_list).split(' ')[:-1]
    print(result) # -> ['lloc', 'orgstart']
    Ответ написан
    4 комментария
  • Какую ОС подобрать для этого ноутбука?

    drygdryg
    @drygdryg
    Python-разработчик
    Ответ написан
    Комментировать
  • Как "забыть" переменную на c/c++?

    @skyazimuth
    Во-первых, переменные с модификатором static видны только в модуле в котором объявлены. Хотя, в общем случае, они будут физически храниться всю жизнь программы. Во-вторых, переменные, объявленные внутри блока живут только на время выполнения этого блока, кроме static внутри функции. Грубо говоря, все что внутри фигурных скобок только там и существует. Причем, блок можно создать и в нетипичных местах, например, case 0: {int i; break;} или вообще в произвольном месте функции. В-третьих, оптимизатор сам следит за тем, где используется переменная. И если он видит, что дальше в функции переменная не используется, то физически на ее месте в памяти может разместить другую. Но с точки зрения текста программы, конечно, она будет считаться видимой до конца блока.
    Ответ написан
    Комментировать
  • Как собрать 32-битный exe файл?

    Vindicar
    @Vindicar
    RTFM!
    Поплярные упаковщики питона в exe просто засовывают туда весь интерпретатор питона (ну может выбирает только используемые модули) вместе с кодом скрипта. Это НЕ настоящая компиляция.
    Так что делай вывод сам, можно ли упаковать скрипт в 32-битный экзешник, не имея 32хбитного питона на машине.
    Если есть полноценный транслятор Питона в C++ или подобный честный комплируемый язык, он мне не известен.
    Ответ написан
    Комментировать
  • Возможно ли отменить форматирование диска?

    @lonelymyp
    Хочу вылезти из минуса по карме.
    Отменить нельзя, но если быстро отключил то данные скорей всего остались целы, в основном.
    Тут важно не делать глупостей. Диск у тебя откажется определяться, на нём нет файловой системы, не пытайся её восстанавливать. Ищи программу для восстановления файлов и сканируй ей свой дохлый раздел.
    Само собой сохранять надо на другой диск и тщательно проверять что восстановилось, ато могут быть неожиданности, название у файла есть, размер правильный, а внутри файл пустой.
    Ответ написан
    Комментировать
  • Возможно ли отменить форматирование диска?

    yakovlev_13
    @yakovlev_13
    Шаманство, экзорцизм и некромантия.
    r.saver в помощь
    Ответ написан
    Комментировать
  • Какой сканер штрих-кодов подходит для процессоров Intel?

    @private_tm
    JAVA dev
    Ответ написан
    Комментировать
  • Как из файла достать нужные данные?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Открыть файл, прочитать содержимое, скормить его парсеру разметки, например lxml или BeautifulSoup.
    Ответ написан
    Комментировать
  • Как создать алгоритм синтаксического анализа списка токенов?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала, ты неправильно ставишь цель. После синтаксического разбора у тебя будет не список, а древовидная структура данных, а итоговый код будет результатом обхода этой структуры в глубину.
    Так что читай про восходящий алгоритм. Идея у него простая. У тебя должен быть набор правил твоей грамматики, например:
    ЦИКЛ_WHILE = 'while' '(' ВЫРАЖЕНИЕ ')' ОПЕРАТОР
    Заглавными я записал нетерминальные символы - что-то, что раскрывается далее в последовательность токенов.
    Остальное - терминальные символы, т.е. токены.
    Итак, у тебя есть цепочка символов - терминальных или нетерминальных. Нетерминальные хранят в себе кусочек дерева программы, терминальные хранят в себе один токен.
    1. Перебираешь правила, ищешь правило, соответствующее текущей позиции в цепочке. Для начала цепочки это будет правило "программа в целом".
    2. Строишь узел дерева, соответствующий найденному правилу.
    3. Помещаешь в этот узел терминальные символы, входящие в правило. В примере выше это будут 'while' и '('. Сдвигаешь позицию в цепочке.
    4. Если в правиле дальше идёт нетерминальный символ, рекурсивно обрабатываешь цепочку по правилу для этого символа, начиная с текущей позиции. Когда обработка закончится, у тебя позиция в цепочке сместится на конец последовательности символов для этого нетерминала, и можно будет продолжить для следующего символа в правиле.
    5. Когда правило закончилось - возвращаешь полученное мини-дерево, чтобы вышележащий код его встроил в свой узел дерева.
    6. Если есть альтернативы, сохраняешь текущую позицию в цепочке и пробуешь альтернативы по очереди. Если альтернатива не сработала (правило тут не подходит), то возвращаешься к сохранённой позиции и пробуешь уже с другой альтернативой.
    7. Если в какой-то момент ни одно правило не подошло, или если мы получили неожиданный терминал, есть синтаксическая ошибка в коде.

    Это сравнительно легко реализуется через косвенную рекурсию. Т.е. у тебя в парсере будет много методов nfrjuj вида (псевдокод!):
    def parse_while_node(tokens: List[Token], pos: int) -> TreeNode, int:
        """Принимает список токенов и позицию в нём, возвращает мини-дерево и новую позицию в списке."""
        node = WhileNode() # узел дерева разбора, соответствующий циклу while
        assert tokens[pos].type == 'while'  # проверяем фиксированный токен, выкидываешь исключение если это не он
        pos += 1
        assert tokens[pos].type == '('
        pos += 1
        # обращаемся к другому правилу для разбора нетерминального символа ВЫРАЖЕНИЕ
        # сохраняем мини-дерево для выражения условия и обновляем позицию
        node.condition, pos = parse_expression_node(tokens, pos)
        assert tokens[pos].type == ')'
        pos += 1
        # аналогично парсим нетерминал ОПЕРАТОР
        node.body, pos = parse_operator_node(tokens, pos)
        # возвращаем вызвавшему нас коду наше минидерево с узлом while на вершине,
        # а также позицию где мы остановились
        return node, pos

    А для реализации правила вида
    ОПЕРАТОР = ПРИСВАИВАНИЕ | ВЕТВЛЕНИЕ | ЦИКЛ_WHILE
    можно будет сделать так:
    def parse_operator_node(tokens: List[Token], pos: int) -> TreeNode, int:
        variants = [parse_assignment_node, parse_if_node, parse_while_node]
        for variant in variants:
            try: # пробуем вариант из ветвления
                node, pos = variant(tokens, pos)
            except:
                pass # вариант не подошёл - пробуем другой
            else: # вариант подошёл
                return node, pos
        else: # ни один вариант не подошёл
            raise Exception()
    Ответ написан
    1 комментарий
  • Как дать понять питону, что если строка является 'null', то ее пробивать нельзя?

    Vindicar
    @Vindicar
    RTFM!
    До чего изобретателен может быть человек, не понимающий что он делает!
    Ключевое слово: кортеж.
    await cur.execute(sql, (id))
    (id) - это то же самое, что id.
    А вот (id,) - это уже кортеж из одного элемента.
    execute() как раз и ожидает вторым параметром кортеж, или иную коллекцию, где один элемент - это одно подставляемое значение.

    Этот метод необходим для удаления скобок, которые ставит pymysql при обычном fetchone

    "Скобки", как ты выразился - это потому что fetchone() возвращает кортеж, по одному элементу на значение в строке (ну или None если очередной строки нет). Т.е. для каждого пункта между SELECT и FROM будет один элемент в кортеже, в том же порядке. Ты запрашиваешь только teleid, поэтому получаешь кортеж из одного элемента.
    Получить этот элемент можно, обратившись по индексу 0.
    row = await cur.fetchone()
    if row is not None: #есть хоть одна строка?
        teleid = row[0]
        # дальше делаешь что хочешь с teleid
    else: # нет такой строки
        print('Беда')

    Перед тем как писать ботов, освой азы языка, а? Структуры данных в частности.
    Ответ написан
    Комментировать
  • Почему объекты при move_ip в Pygame начинают движение с задержкой?

    @YariKartoshe4ka
    У вас 60 FPS, а значит 60 вызовов update в секунду, что значит x каждую секунду увеличивается на - 0.6px (0.01 * 60). Так же стоит учитывать то, что в вычислених pygame.Rect используется целочисленная арифметика, т.е. move_ip не сдвинет вашего персонажа, если текущий x < 1. Таким образом, пока x набирает единицу, у вас получается задержка в ~2 секунды. Если взять инкремент как 0.001, то увеличение будет 0.06px, и x наберет единицу за ~16 секунд (1 / 0.06) и только через 16 секунд персонаж начнет двигаться. Чтобы избежать задержки, как вы уже могли догадаться, нужно первоночально задать x единицой
    Ответ написан
    1 комментарий
  • Можно ли использовать хендлер в хендлере?

    @Kvason
    Веб-разработчик
    А зачем? Я такие вещи в основном делаю через флажок и условие то есть например
    a=0
    @dp.message_handler()
    async def echo(message: types.Message):
    if(message.text=="⚡️ ️Купить билет" and a==0):
        await message.reply(" Загружаем данные")
        keyboard = ReplyKeyboardRemove()
        back = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
        buttons = ["⚡️ Назад"]
        back.add(*buttons)
        a=1
    if(a==1 and message.text=="⚡️ Назад"):
        a=0
        return

    Тогда у Вас назад будет срабатывать только после купить билет
    Ответ написан
    1 комментарий
  • Как использовать в pygame вещественные числа меньше 1?

    @Kole565
    Very beginner python programmer.
    Координаты rect хранятся в виде целочисленного значения. Для того чтобы реализовать движение меньше чем на пиксель надо сохранять значение координат в отдельных вещественных переменных и подставлять их (отбрасывая дробную часть) в текущие координаты объекта. Увеличить также стоит свои вещественные числа, а не текущие координаты напрямую.

    p.s. Мой первый ответ. Не судите строго.
    Ответ написан
    1 комментарий
  • Как сохранить прозрачное изображение в pygame?

    iggor-markin
    @iggor-markin
    Python Developer
    Глубина цвета должна быть 32

    image = pygame.Surface([640,480], pygame.SRCALPHA, 32)
    image = image.convert_alpha()
    Ответ написан
    1 комментарий
  • Почему игра на pygame тормозит?

    @Span4ev Автор вопроса
    Разобрадся. Для тех, кто столкнётся с той же ситуацией, вот пояснение:

    Медленный здесь только я, потому что функцию создания пришельцев
    engine.create_aliens_army(settings, screen, ship, aliens) я запускал в основном цикле While, из-за чего все остальные циклы выполнялись каждую наносекунду. Я перенёс вызов создания армии из основного цикла и всё стало хорошо.
    Следите за тем, где вы вызываете методы.
    Ответ написан
    3 комментария