Онлайн ресурсы:

  • Обновления. AsmX, как и все языки постоянно развивается. Сам язык программирования AsmX можно посмотреть тут.

  • Документация.

  • Расширение для подсветки AsmX кода тут (VS Code).

  • Сама игра тут находится. (под лицензией) (Недавно открылась AsmX Games Studios).

Введение

Разработка игр на языке AsmX - увлекательный процесс, который позволяет создавать неповторимые миры и персонажей. Одной из таких игр является "Рулетка Фруктов". В данной статье мы рассмотрим, как создавалась данная игра, начиная от идеи и концепции игры, до разработки графики и программной части.

Часть 1: Идея и концепция игры

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

Часть 2: Разработка графики

Второй этап - это разработка графической части игры. Для игры на языке AsmX используется библиотека gpu для импортирования графических элементов. В игре "Рулетка Фруктов" использован обычный UI с красочными фруктами.

Часть 3: Программирование игры

Третий этап - это программирование игры на языке AsmX. Для отображения фруктов в ячейках автомата использовалось ветвление. Для отрисовки автомата использовались функции, которые вызывались в соответствии с рандомным числом.

@import gpu; # в начале файла нужно прописать это - импорт библиотеки gpu

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

@label grapes:         # ветка с именем grapes
    @route '????';       # добавляем в стек виноград '????'
    @invoke 0x05;      # 0x05 - Отрисовка на текущей строке
                       # Рисуем последний элемент из стека ($lis - последний элемент стека)

Аналогично можно использовать и другие фрукты, например, черешню:

@label cherry:
    @route '????';
    @invoke 0x05;

Или лимон:

@label lemon:
    @route '????';
    @invoke 0x05;

А также апельсин:

@label orange:
    @route '????';
    @invoke 0x05;

Таким образом, используя ветвления и соответствующие символы, можно отображать различные фрукты в игровом автомате при помощи языка AsmX.

Теперь нам нужно нарисовать сам игровой автомат. AsmX поддерживает отображение в Юникоде, эмодзи и многое другое. Давайте сделаем аппарат красным и отобразим случайный фрукт. Нам нужно сделать это в подпрограмме с именем "start".

@subprogram start:                                 # подпрограмма с именем start
    @call print(RED);
    @call print('\t\t\t┏━━━━┳━━━━┳━━━━┳━━━━┓┏━');  # отрисовка крышки иггрового автомата
    @execute rand 1 4;                             # 1
    @set cell_1 Int $ret;                          # 2
    @execute rand 1 4;
    @set cell_2 Int $ret;
    @execute rand 1 4;
    @set cell_3 Int $ret;
    @execute rand 1 4;
    @set cell_4 Int $ret;
    @route "\t\t\t┃\u0020";                        # отрисовка границ игрового автомата
    @invoke 0x05;
    @execute goto_sbp check_emoji_1;               # 3
    @route "\u0020┃\u0020";
    @invoke 0x05;
    @execute goto_sbp check_emoji_2;
    @route "\u0020┃\u0020";
    @invoke 0x05;
    @execute goto_sbp check_emoji_3;
    @route "\u0020┃\u0020";
    @invoke 0x05;
    @execute goto_sbp check_emoji_4;
    @route "\u0020┣┛";
    @invoke 0x05;
    @call print('\n\t\t\t┗━━━━┻━━━━┻━━━━┻━━━━┛');  # отрисовка конца игрового автомата
    @call print(RESET);                            # сбрасываем цвет текста и фона

Позвольте мне объяснить, что происходит в приведенном выше списке кода.
Нам нужно нарисовать 4 фрукта в автомате, поэтому нам нужны числа от 1 до 4. Используя команду rand, мы получим случайные числа от 1 до 4, и пронумеруем каждую ячейку. Мы сохраняем результат в переменной, потому что регистры $art и $math изменятся в следующий раз. Здесь фрукт уже извлекается из полученного случайного числа. Кроме того, машина становится красной.

Давайте теперь напишем четыре функции, которые отвечают за вывод нужного фрукта из полученной переменной.

@subprogram check_emoji_1:
    @execute eq set::cell_1 0x01;   # $eq = a == b
    @execute jmp_equal grapes;      # jmp_equal это переход на ветку если $eq = true
    @execute eq set::cell_1 0x02;
    @execute jmp_equal cherry;
    @execute eq set::cell_1 0x03;
    @execute jmp_equal lemon;
    @execute eq set::cell_1 0x04;
    @execute jmp_equal orange;

Эта функция проверяет значения рандомного числа из первой ячейки и вызывает нужные ветки для отрисовки. Теперь скопируем три таких же функции и измените нумерацию переменных и название ячеек. Вот собственно результат:

@subprogram check_emoji_1:
    @execute eq set::cell_1 0x01;
    @execute jmp_equal grapes;
    @execute eq set::cell_1 0x02;
    @execute jmp_equal cherry;
    @execute eq set::cell_1 0x03;
    @execute jmp_equal lemon;
    @execute eq set::cell_1 0x04;
    @execute jmp_equal orange;

@subprogram check_emoji_2:
    @execute eq set::cell_2 0x01;
    @execute jmp_equal grapes;
    @execute eq set::cell_2 0x02;
    @execute jmp_equal cherry;
    @execute eq set::cell_2 0x03;
    @execute jmp_equal lemon;
    @execute eq set::cell_2 0x04;
    @execute jmp_equal orange;

@subprogram check_emoji_3:
    @execute eq set::cell_3 0x01;
    @execute jmp_equal grapes;
    @execute eq set::cell_3 0x02;
    @execute jmp_equal cherry;
    @execute eq set::cell_3 0x03;
    @execute jmp_equal lemon;
    @execute eq set::cell_3 0x04;
    @execute jmp_equal orange;

@subprogram check_emoji_4:
    @execute eq set::cell_4 0x01;
    @execute jmp_equal grapes;
    @execute eq set::cell_4 0x02;
    @execute jmp_equal cherry;
    @execute eq set::cell_4 0x03;
    @execute jmp_equal lemon;
    @execute eq set::cell_4 0x04;
    @execute jmp_equal orange;

Теперь нам нужно инициализировать все подпрограммы, в том числе ветки, которые мы написали. Также мы должны вызвать главную подпрограмму start.

@import gpu;

@using label grapes;
@using label cherry;
@using label lemon;
@using label orange;

@Using subprogram check_emoji_1;
@Using subprogram check_emoji_2;
@Using subprogram check_emoji_3;
@Using subprogram check_emoji_4;

@using subprogram start;
@execute goto_sbp start;
Полный исходный код
@import gpu;

@using label grapes;
@using label cherry;
@using label lemon;
@using label orange;

@Using subprogram check_emoji_1;
@Using subprogram check_emoji_2;
@Using subprogram check_emoji_3;
@Using subprogram check_emoji_4;

@using subprogram start;
@execute goto_sbp start;


#----------------------------------------------------------------
@subprogram start:
    @call print(RED);
    @call print('\t\t\t┏━━━━┳━━━━┳━━━━┳━━━━┓┏━');
    @execute rand 1 4;
    @set cell_1 Int $ret;
    @execute rand 1 4;
    @set cell_2 Int $ret;
    @execute rand 1 4;
    @set cell_3 Int $ret;
    @execute rand 1 4;
    @set cell_4 Int $ret;
    @route "\t\t\t┃\u0020";
    @invoke 0x05;
    @execute goto_sbp check_emoji_1;
    @route "\u0020┃\u0020";
    @invoke 0x05;
    @execute goto_sbp check_emoji_2;
    @route "\u0020┃\u0020";
    @invoke 0x05;
    @execute goto_sbp check_emoji_3;
    @route "\u0020┃\u0020";
    @invoke 0x05;
    @execute goto_sbp check_emoji_4;
    @route "\u0020┣┛";
    @invoke 0x05;
    @call print('\n\t\t\t┗━━━━┻━━━━┻━━━━┻━━━━┛');
    @call print(RESET);
#----------------------------------------------------------------


#----------------------------------------------------------------
@subprogram check_emoji_1:
    @execute eq set::cell_1 0x01;
    @execute jmp_equal grapes;
    @execute eq set::cell_1 0x02;
    @execute jmp_equal cherry;
    @execute eq set::cell_1 0x03;
    @execute jmp_equal lemon;
    @execute eq set::cell_1 0x04;
    @execute jmp_equal orange;

@subprogram check_emoji_2:
    @execute eq set::cell_2 0x01;
    @execute jmp_equal grapes;
    @execute eq set::cell_2 0x02;
    @execute jmp_equal cherry;
    @execute eq set::cell_2 0x03;
    @execute jmp_equal lemon;
    @execute eq set::cell_2 0x04;
    @execute jmp_equal orange;

@subprogram check_emoji_3:
    @execute eq set::cell_3 0x01;
    @execute jmp_equal grapes;
    @execute eq set::cell_3 0x02;
    @execute jmp_equal cherry;
    @execute eq set::cell_3 0x03;
    @execute jmp_equal lemon;
    @execute eq set::cell_3 0x04;
    @execute jmp_equal orange;

@subprogram check_emoji_4:
    @execute eq set::cell_4 0x01;
    @execute jmp_equal grapes;
    @execute eq set::cell_4 0x02;
    @execute jmp_equal cherry;
    @execute eq set::cell_4 0x03;
    @execute jmp_equal lemon;
    @execute eq set::cell_4 0x04;
    @execute jmp_equal orange;
#----------------------------------------------------------------

@label grapes:
    @route '????';
    @invoke 0x05;

@label cherry:
    @route '????';
    @invoke 0x05;

@label lemon:
    @route '????';
    @invoke 0x05;

@label orange:
    @route '????';
    @invoke 0x05;

Заключение

В этой статье мы рассмотрели процесс создания игры "Рулетка Фруктов" на языке AsmX. Основные этапы программирования игры - это создание идеи и концепции, разработка графической части и программирование игры с использованием ветвления и подпрограмм. Отметим, что данный процесс требует тщательной разработки и отладки, но результат максимально увлекателен для игроков.

Комментарии (13)


  1. lair
    22.05.2023 12:54
    +1

    Такие статьи неплохо бы начинать со введения типа "Что за язык AsmX, и зачем он нужен".

    (а то тут есть люди, которые помнят .ASMX-файлы)


    1. dynamica
      22.05.2023 12:54
      +17

      Что за язык AsmX, и зачем он нужен

      AsmX - это не язык, а недоразумение. ТС написал интерпретатор ассемблероподобного языка на js, который работает, только в js-окружении (в его случае только в ноде).

      ТС категорично не понимает, чем его разработка отличается от языка, тем более от ассемблера. Он не понимает концепции ABI/системных вызовов/какого-либо интеропа с чем-угодно. Разниц между компиляцией, интепретацией, трансляцией тоже не понимает.

      Под не понимает подразумевается то, что он отказывает это делать. Ему пытались объяснить и не раз. У него есть какая-то своя позиция (никто не знает какая) и он принципиально ей верен, по каким-то причинам.

      AsmX не умеет ничего, кроме как работать с выводом в stdout, средствами nodejs.

      Многие ошибочно принимают ТС за тролля, но это не так, и винить ТС в его профанации, в общем-то не стоит.

      Дело в том, что он во-первых еще достаточно юн - ему 16 лет. Во-вторых он инвалид по рождению, имеющий как физиологические недостатки, так и ментальные расстройства.

      Это уже его вторая статья на этом ресурсе, а комьюнити-чаты он уже давно засорил. Что с ним делать, на самом деле не ясно. Кто-то банит, кто-то подыгрывает, кто-то игнорирует.


      1. candyboah
        22.05.2023 12:54

        Удивлен что у вас есть время на это всё????


      1. cat_chi
        22.05.2023 12:54

        Вы даже задеанонить его ухитрились? :)

        Что с ним делать, на самом деле не ясно.

        Как вариант – ничего? Вреда он не причиняет.


        1. candyboah
          22.05.2023 12:54

          Я думаю этот чел из Телеграм'а просто, потому знает его.


      1. raspberry-porridge
        22.05.2023 12:54
        +3

        Тем не менее, я в 16 лет только юКоз дёргал за вымя. А тут хотя бы что-то рабочее. Другое дело, что бесполезное, а пафосу позавидуют Бабушкин и Попов.


      1. Lirix_vladimir
        22.05.2023 12:54

        Ничего себе. 16 лет и уже свой интерпритатор. Достойно уважения на самом деле. И упорность автора тоже достойна уважения.


  1. nkozhevnikov
    22.05.2023 12:54
    +2

    Офтопик: время для цитаты от создателя BolgenOS

    Вы говорите что HTML невозможно программировать. По-моему вы просто жутко наелись конфет…


  1. vilgeforce
    22.05.2023 12:54

    Какая печаль, столько энергии и не туда :-(


    1. cat_chi
      22.05.2023 12:54
      +2

      Ну а что делать?
      Человек выбрал себе путь и куда-то идёт. Критики он не слушает и не слышит. Вероятно, нездоров, т.к. для троллинга слишком много работы проделано. Зато никому не вредит, просто тихо занимается чем-то бесполезным.


      1. vilgeforce
        22.05.2023 12:54
        +4

        Наличие кучи бесполезной информации вредит тем, кто ищет информацию полезную. Увы :-(


        1. cat_chi
          22.05.2023 12:54
          +1

          Не переживайте, никто не будет искать полезную информацию по AsmX :)

          И вред, наносимый этой статьёй, не составляет и доли процента от того потока дерьма, которым засоряют Хабр некоторые (хорошо хоть не все) корпоративные блоги


  1. Disinterpreter
    22.05.2023 12:54
    +7

    Я: Мам, давай купим GPU

    Мама: Нет, у нас есть GPU дома

    GPU дома: