Перейти к содержимому

qwertyMAN

Пользователи
  • Публикации

    1 009
  • Зарегистрирован

  • Посещение

  • Победитель дней

    47

Сообщения, опубликованные пользователем qwertyMAN


  1. Универсальный конвертор систем счисления и цвета

     

     

    Добрый день, игроки. Если вы во время написания своей программы задавались вопросом: "А как же мне перевести один формат в другой", то эта тема для вас.

     

    Я бы хотел вам представить свою библиотеку, которая позволяет конвертировать совершенно любую систему счисления в десятичную и наоборот. А так же конвертировать RGB hex формат в обычный RGB и наоборот.

     

    Данная библиотека имеет следующие функции:

    Функции конвертации в десятичную систему счисления:

     

    conv.bin(input:number)

    Конвертирует бинарный код в десятичный

     

    conv.oct(input:number)

    Конвертирует восьмеричную систему счисления в десятичную

     

    conv.hex(input:string)

    Конвертирует шестнадцатиричную систему счисления в десятичную

    Необходимо вводить текстовый формат "FFFFFF" (не вводить формат 0x000000)

     

    conv.Engine(input:number/string, n:number)

    Движок для предыдущих функций - конвертирует число input:number/string из n системы счисления в десятичную. Необходима для нестандартных систем счисления.

    Настроена так, что можно вводить и текстовый hex формат "FFFFFF"

     

    Функции конвертации из десятичной системы счисления:

     

    conv.abin(input:number)

    Конвертирует десятичную систему счисления в двоичную

     

    conv.aoct(input:number)

    Конвертирует десятичную систему счисления в восьмеричную

     

    conv.ahex(input:number)

    Конвертирует десятичную систему счисления в шестнадцатиричную

    Возвращает текст в самодельном текстовом hex формата "FFFFFF" (не путать с форматом 0x000000)

     

    conv.aEngine(input:number, n:number)

    Движок для предыдущих функций - конвертирует число input:number из десятичной системы счисления в n-ную. Необходима для нестандартных систем счисления.

     

    Функции конвертации RGB кода:

     

    conv.getThreeColor(input:number/string)

    Возвращает три цвета RGB (обозначающие красный, зелёный, синий)

    Все три переменные имеют значения от 0 до 255

    Принимает обычные числа, числа в формате 0x000000 и числа в текстовом hex формате "FFFFFF"

     

    conv.getColor(r:number/string,  g:number/string,  b:number/string)

    Возвращает цифровой формат RGB, который например можно использовать в component.gpu.setBackground(color) в своих программах

    Принимает обычные цифры, вот такой формат 0x00 и текстовый hex формат от "00" до "FF" на одну переменную

     

    conv.invertColor(input:number)

    Инвертирует цвет

    Может быть полезно, чтобы при отображении, текст всегда был виден на фоне.

     

    conv.sumColor(color_1:number,  color_2:number)

    Принимает два цвета в формате 0x000000 или в виде обычных чисел

    Выводит средний цвет, который бы получился при смешивании

     

    Примечание:

    В lua стандартный hex формат 0x000000 автоматически преобразуется в десятичный. По этому поводу я создал свой текстовый hex формат "FFFFFF", вдруг кому пригодится, для отображения print() например. (можно вводить и большие и малые буквы в новом текстовом hex формате)

     

    Ссылка на код:

    http://pastebin.com/tzF3dr0M

    Ссылка на скачивание (если кому надо):

    https://yadi.sk/d/lAo2j9SwmjNxv

     

    P.S. Кто-то сегодня говорил про плюсы ООП и прочее.

    Ну что ж, если будет клон моей библиотеки на ООП, я только за. 

    • Нравится 8

  2.  

    local event = require("event")

     

    function keydown(eventname, keyboardaddress, char, code, playername )

         print(playername.." нажал клавишу "..code)

    end

     

    event.listen("key_down", keydown)

     

    А можно сделать так, чтобы комп выполнял функцию update(), только тогда, когда нажата клавиша или пришёл сигнал с wifi?


  3. А зачем какие то идеи для ловушек? Просто, если комната с ловушкой, зашел в нее и умер. Нужно только снабдить игрока ботинками, которые можно бросать в комнату. И вот тут то актуальной становится командная игра, ибо ботинки заканчиваются.

    А дело в том, куда расставлять ловушки. Конечно можно сделать их рандомными, убрать из тех комнат по которым сюда зашли обеспечив безопасный выход. Поставить их только в тупиках - комнатах с одним входом и без выходов.

    Но в фильме была фишка, по цифрам вычислять ловушки. А я такую фишку к себе в игру не могу позволить. У меня другой принцип нумерации комнат.

     

    Зато добавил возможность пометки комнат как из второй части фильма.

    Можно хоть бинарным кодом помечать комнаты. Цветов для этого 7 сделал.

     

     

    главное - в процессе написания получать удовольствие и учиться чему-нибудь новому, или хотя бы не забывать старое
     

    Вот это действительно важный совет.

    А то я тут словил ошибку при использовании table.remove() и не мог понять в чём дело. Позже вспомнил что нужно цикл перебора в обратную сторону пускать в таких случаях.


  4. Обновление до версии v0.2

    Добавлены следующие преимущества:
    Выбор цвета метки
    Установка метки
    Удаление метки

    Добавлен индикатор текущего выбранного цвета

    Теперь игрок ровно в центре монитора отображается

    Расширены ограничители. Теперь нумерация комнат будет идти до миллиона (ранее до тысячи)

    Обнаружен баг с появлением в игре сразу же в финишной первой комнате (пока не исправлен)

     

    Управление:

    E - установить метку

    X - удалить метку

    Z - выбрать цвет (налево)

    C - выбрать цвет (направо)

     

    Что же касается баланса игры - его нет.

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

     

    Посмотрел вторую часть фильма "Куб" и решил, что разноцветные метки хоть как то помогут не обращаться игроков к ручке и бумажке.


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

    Можно просто сделать ограничитель времени. Не успел - умер.

    Идей для ловушек как то мало. А с босса смысл вообще? Я даже не представляю как он будет выглядеть. Куб который убивает от прикосновения? Графика ОС и СС слишком слабая для каких то серьёзных спец-эффектов. Только пиксели и можно чертить.

    • Нравится 3

  5. P.S. Если понравился фильм, рекомендую одноименную(вроде) карту на Portal. Я фильм не смотрел, но все равно понравилась :)

    Знаю эту карту на игру Portal. Очень мало комнат, да и по сути совсем не то что было в фильме. Лишь отдалённо напоминает Куб.

     

    Я больше не первую часть фильма ориентировался при написании. Там и Кубы разноцветные и заморочки с простыми числами какие то были на счёт ловушек (но у меня ловушек нет).

    Во второй и нулевой части фильма уже как то не то. Белые комнаты и вообще атмосфера другая. Мне больше первый фильм нравится.

     

    P.S. Мне не интересно программировать большинство из того, что есть на этом сайте.

    Если бы кто идею подал проги, которая связана с вычислениями, я бы с радостью сделал её. Нет вычислений - нет мотивации.


  6. Планы на будущее:

     

    Ловушки в комнатах, это конечно круто, но они могут сделать игру непроходимой.

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

     

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

    Например, сервер будет проверять, если 2 или более игроков в одной комнате, любое их движение отсылается на компы тем игрокам которые в этой комнате.

     

    Если всё же будут добавлены ловушки, можно запросто добавить по 2 штуки ловушка-детектора на игрока. Как в фильме Куб, тапок кинул, если ловушки нет то он возвращается в инвентарь.

    • Нравится 3

  7. по абсолютно однотипным комнаткам с дверками или кнопками в поисках выхода

     

    Просто Дуб хочет по фану сделать подобие того что было в фильме "Cube":

     

    Как-то ковыряясь с комблоком я вспомнил фильм "Cube"

     

    Чтобы избежать однотипности и скуки можно сделать так:

    Если игрок проходит в новую комнату, то создаётся ячейка в массиве cube и случайны её интерьер из уже подготовленных. (возможно ловушки разнообразные, если число простое например). Далее если игрок попадёт в комнату с таким же номером, то она не будет снова генерироваться, а будет браться из массива.

    Можно закинуть в массив случайный цвет куба, сделать как и в фильме полностью кубические комнаты из однотонных цветных блоков, сделать 6 выходов.

     

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

     

    В фильме были какие то заморочки с простыми числами, чтобы выйти из куба минуя ловушки.

    А в моём плане нужно совершить несколько прыжков, чтобы определить какая дверь что делает и рассчитать цепочку проходов.

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


  8. Мой план работает всего на одном логическом принципе:

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

     

    Именно для этого дверей должно быть чётное количество - одни с прямой формулой, другие с обратной.

    И именно по этому, можно запутать систему таким образом, что у неё 100% будет решение. Не зависимо, насколько сильно мы её запутаем, оперируя ограниченным количеством правил, которые так же будут использоваться для распутывания задачи, мы её в любом случае в силах распутать.

     

    В жизни, этот принцип можно наблюдать на примере Кубика Рубика:

    Как не запутывай его, со 100% шансом его реально собрать в первоначальное состояние. Любой кубик, даже не классический. Даже 11x11x11. От его формы ничего не зависит.

    Но стоит лишь разобрать Кубик Рубика и повернуть 1 уголок, как он станет абсолютно не собираемым. Его нельзя будет вернуть в то состояние, в котором он не был и не может быть.


  9. Как я понял, у нас есть комната с n количеством выходов, которые телепортят в другие комнаты.

    Каждая комната пронумерована.

     

    Предлагаю так осуществить головоломку:

    Над выходами, на табличках написаны номера комнаты, в которые мы можем телепортится.

    Например дверей 4 в комнате. Над каждой табличка в какую комнату мы телепортнёмся.

    Каждая дверь имеет свою формулу. При телепортации в новую комнату положение дверей изменяется, но не изменяется их формула.

    Задача игрока - понять по какой формуле работают двери. Сделать так, чтобы оказать в комнате номер 1.

    Обязательное условие - количество выходов должно быть чётное количество. 1 дверь работает по формуле, вторая представляет собой обратную формулу.

     

    Пример:

    Комната с 4 дверьми. Мы в 8 комнате.

    1 дверь умножает текущий номер на 2. Другая делит его на 2. То есть мы получаем рандомную формулу (сложнее естественно) и создаём ей дверь с обратной формулой, чтобы дать шанс отката. (так мы дадим себе 100% шанс, что мы сможем вернуться в исходную точку) И так со всеми остальными дверьми.

    Если число не делится без остатка или при вычислении оно может выйти за заранее указанные пределы, то двери нет.

     

    Как будет выглядеть глазами игрока:

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

    Потом находим их, так как они меняют своё расположение при каждом переходе.

    Рассчитываем по каким путям нам прийти в комнату номер 1 и идём к цели.

     

    Как рассчитать конкретный стартовый номер комнаты:

    Взять номер цели - в данном случае мы берём 1 комнату. Проводим 5 раз через формулы, которые уже определили для дверей случайным образом. Всё! У нас есть 100% шанс что данную игру реально пройти!  Причём случайно выйти из головоломки шанс очень низок.

     

    Как будет выглядеть в майнкрафте:

    Обычная комната с несколькими выходами. На выходах стоят например телепорты, которые телепортят в центр комнаты и меняют цифры на табличках, при проходе через них.

    При прохождении головоломки, сверху падает приз из раздатчика в зависимости от степени сложности. Сложность определяется ограничителями (например ограничитель значений от 0 до 100 будет крайне лёгким уровнем сложности)

     

    Можно было бы такое на сервер поставить.

     

    Нужна будет помощь в осуществлении алгоритма, обращайтесь.


  10. Этот код - это здорово и просто!!!!

     

    Спасибо! 

    Нет, ну конечно можно сделать первобытный таймер чтобы подсчитать количество циклов внутри двойного цикла:

     

    local n=0

    for ... for...

    ...

    n=n+1

    tt = alf["p"][ n ]

    ...

    end ... end

     

    Но кому это надо, если есть способ получше. (tx-1)*8+ty Вся красота математики в вполне логичной формуле :D

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

     

    P.S. Чтобы максимально сжать прогу и улучшить её читаемость можно ещё объявить переменные так:

      local x, y, z = 5, 30, 23                  -- фиксирование начальных координат

  11. local function print_txt()

      local x = 5                   -- фиксирование начальных координат

      local y = 30

      local z = 23

     

     

      for tx=1, 6 do                         -- цикл перебора x

        for ty=1, 8 do                       -- цикл перебора y

          tt = alf["p"][ (tx-1)*8+ty ]     --  получить значение (где 8 - это максимум ty)

          hologram.set(x, y, z, tt)    -- отрисовка

          y = y-1                                -- спуститься на 1 пиксель вниз

        end

      x = x+1                                   -- передвинуться вправо на 1 пиксель

      end

    end

     

    P.S. Перевод ячейки сделан специально после отрисовки, чтобы начало отображение было с точно зафиксированных координат. (5,30,23). В твоей же программе отрисовка шла с координат (6,29,23)


  12. local function print_txt()
      local x = 5                   -- фиксирование начальных координат
      local z = 23
    
    
      for at=1, 48 do               -- цикл отрисовки буквы - 48 - кол-во символов в букве
        local y = 30                -- зафиксировать начальный уровень буквы по высоте
        x = x + 1                   -- сделать отступ в право для каждого вертикального слоя
        for ty=1, 8 do              -- цикл для прорисовки вертикального слоя буквы высотой в 8
          y = y-ty                  -- спуститься на 1 пиксель вниз
          tt = alf["p"][at]         --  получить значение 
          hologram.set(x, y, z, tt) -- отрисовка
        end
      end
    end

    С циклами, вроде я ни чего не напутал.

     

    У тебя x 48 раз прибавляется. Хотя бы для приличия вот этот костыль поставил бы if x>6 then x=x-6 end

    А то x уходит далеко-далеко.

     

    А в лучшем случае надо бы переписать код на основе двух циклов x и y.

    И читаемость кода будет лучше и производительность.


  13. Это я уже делал и программа так же выдавала ошибку.

     

    Воспользовался советом Neo и заработало, правда не так, как хотелось.

    У тебя какая то путаница с циклами.

    А должен быть порядок:

     

    Цикл с изменением x от 1 до 8

      В него вкладываешь цикл изменяющий y от 1 до 6

    конец обоих циклов.

     

    А цикл с at вообще не нужен.

     

    Дело в том что двойной цикл и будет давать 6*8= 48 проходов.

    Просто внутри обоих циклов пишем hologram.set(x, y, z, alf[x*y]) и никакого at не надо.

    Ведь x*y - это и есть по сути эквивалент числа at.


  14. Во первых alf[p] заменяем на alf["p"]

    Во вторых tt = alf[p][at] замени на tt = alf["p"][at]

    В третьих, на всякий случай, после того как указана переменная tt сразу же вставь это:

    if tt == 1 then

      tt = true

    elseif tt==0 then

      tt=false

    else

      print("error")

    end

    Возможно hologram.set(x, y, z, tt) не примет обычные цифры.


  15. Как-нибудь потом. Все можно сделать, изменив функцию отрисовки - чтобы снежинки не всей кучей перерисовывались, а индивидуально.

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

    И тогда будет то что надо - хорошая физика с кубической графикой.


  16. Без антиалиасинга и с потерей качества.

     

    VpnLWod.gif

     

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

     

    P.S. Добавь снег снизу и небольшой сугроб.

×
×
  • Создать...