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

Zer0Galaxy

Гуру
  • Публикации

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

  • Посещение

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

    189

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


  1. О структуре ip-адреса и таблицах маршрутизации в сети rednet (продолжение)

     

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

    post-6-14160783991598_thumb.gif

    На рисунке изображены четыре роутера (я их назвал first, second, third и fourth). К некоторым из них подключены хосты.

    Как теперь пакету от хоста 11 добраться до хоста, скажем, 14? Прямой связи роутера first с хостом 14 нет. Значит пакет нужно направить на один из роутеров 8 или 9. Прописываем таблицу маршрутизации

     

    v_pupkin 13 – Уже известный нам хост Васи Пупкина

    14 9 – Пакеты на 14-й хост шлем через роутер third

     

    Но хостов, подключенных к роутерам second, third и fourth может быть очень много да и добавляться они могут слишком часто. Неужели их всех нужно руками прописывать в таблицу маршрутизации? Давайте пересмотрим структуру ip-адреса. Пусть теперь этот адрес состоит из двух составляющих: адреса роутера, к которому подключен хост и адреса самого хоста разделенных точкой. Пример fourth.14

    Теперь роутеру first не нужно помнить адреса всех хостов сети. Нужно лишь знать пути к роутерам. Вот так выглядит новая таблица маршрутизации.

     

    First.self 10 – Это что бы отличать свои хосты от чужих

    First.v_pupkin 13 – Уже известный нам хост Васи Пупкина

    second 8 – Пакеты на роутер second

    third 9 – Пакеты на роутер third

    fourth 9 – Пакеты на роутер fourth шлем через роутер third

     

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

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

     

    Продолжение следует...


  2. Ребята, давайте не будем спорить о том кто что знает о маршрутизации. Дело в том, что маршрутизация в реальном мире и в мире майнкрафта это две большие разницы. И не нужно переносить свои знания из реала в майн. Давайте лучше подумаем как такую маршрутизацию сделать, во-первых, работоспособной, во-вторых, максимально эффективной. Способ, предложенный Neo, действительно работает в сети из двух роутеров, но над эффективностью нужно еще поработать.

     

    Предлагаю для размышления такой способ маршрутизации.

    Предположим, наша сеть состоит всего из одного роутера и нескольких хостов.

    post-6-14160783991101_thumb.gif

    Пакет, направляемый хостом-передатчиком в сторону роутера должен содержать адрес хоста-приемника. Роутер извлекает этот адрес и переправляет пакет далее в нужном направлении. Какой должна быть структура ip-адреса в такой сети, если забыть на минутку о реальных ip-адресах? Первое, что приходит в голову, это должно быть одно единственное число, по возможности совпадающее с id хоста. Такую сеть будем называть одноуровневой.

     

    Нужна ли в одноуровневой сети таблица маршрутизации? Мне кажется, что нет, поскольку всю необходимую информацию о дальнейшем пути пакета роутер может извлечь из самого пакета. Ну разве что какой либо из пользователей не захочет иметь в качестве адреса число, а захочет иметь строку. Скажем Вася Пупкин, владелец хоста с id 13, ненавидит число 13. Он может обратиться к администратору роутера и тот пропишет вот такую таблицу маршрутизации:

     

    v_pupkin 13

     

    Теперь все пакеты с адресом получателя "v_pupkin" будут перенаправляться на id 13. Остальные же пакеты, с числовыми адресами получателей, будут обрабатываться роутером как и прежде.

    post-6-14160783991308_thumb.gif

    Продолжение следует...


  3. Не совсем так. Таблица маршрутизации все же есть. Заполняется она динамически при первом прохождении пакета методом волны. Но вот если количество роутеров в сети больше двух (есть вариант ветвления волны) то волна эта никогда не затухнет.


  4. Проанализировал код. Подправил описание в соответствии со своим пониманием. Коментарии - в скобках курсивом.

     

    Роутер - это компьютер и специальное программное обеспечение предназначенные для организации маршрутизации пакетов в сети rednet.

    После запуска программы роутера необходимо ввести номер его подсети. Это должно быть число от 0 до 255, несовпадающее с подсетями других роутеров.

    (Роутер это, как правило, редко обслуживаемый компьютер и запуск его программы будет скорее всего из стартапа. А значит никаких read() быть не должно. Используй парамерт запуска либо принимай номер подсети равным id роутера)

     

    Прежде чем начать работу, терминалу (компьютеру, который отправляет или получает пакет) необходимо подключится к роутеру. Для этого нужно отправить login-пакет на адрес роутера.

    Такой пакет представляет собой сериализированный массив, состоящий из следующих элементов:

    1. nil, 2. "login"

    (почему команда "login" на втором месте? Логичнее было бы команду ставить вперед)

     

    Когда login-пакет приходит на роутер он проверяет нету ли этого терминала в базе , если нету генерирует в своей подсети случайный ip, проверяет что бы он не совпал с другими ip и отправляет его терминалу

    (А если есть? Вдруг я выходил из программы и хочу снова подключиться. Надобы вернуть мне мой прежний ip)

     

    ip представляет собой строку состоящую из четырех чисел, разделенных точкой.

    Первое из этих чисел совпадает с номером подсети роутера, а последующие генерируются случайным образом в диапазоне 0-255

    (Какова функциональность такого ip? Поможет ли она скорейшему нахождению маршрута? Если нет, то может не стоит копировать реал, а придумать что то свое?)

     

    Для передачи данных другому терминалу нужно быть потключеным к роутеру, знать свой ip и ip адресата

    (А зачем знать свой ip если его знает роутер?)

     

    Пакет для передачи представляет собой сериализированный массив, состоящий из элементов:

    1. ip отправителя, 2. ip получятеля, 3. Передаваемые данные 4. "transport"

    (Опять таки, команду "transport" логичнее вынести на первое место. Она и обрабатывается первой и место ее не меняется по сравнению с "login".

    О сериализации уже говорил. Нужно потихоньку от нее избавляться. Что нам нужно? Слепить четыре строки в одну? Так это не проблема. Потом разлепить? Я помогу, если сложно.)

     

    передача происходит таким способом

    1 пакет попадает на роутер, если этот пакет не от его терминалов , а от роутеров заносит

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

    2 роутер проверяет авторизирован ли терминал если да то переходит к 3 шагу

    3 ищет в своей базе ip терминала-получателя, если нет переходит к 4 шагу , если да то отправляет пакет адресату

    4 ищет в своей базе ip адрес адресата и id роутера куда нужно пакет отправить,

    если находит то отправляет на тот роутер что указан в базе,если нет переходит к 5 шагу

    5 отправляет пакет на все роутеры которые прописаны в нём

     

    (Т.е. поиск маршрута осуществляется методом волны. Если терминал А отправляет пакет терминалу Б, тот пакет этот обойдет ВЕСЬ Интернет. Причем распространяться будет равномерно во все стороны, отражаясь и переотражаясь. Количество пакетов множиться буддет в геометрической прогрессии пока не завалит своей массой игровой сервер.

    Следует подумать над следующими вопросами:

    1. Оптимизация поиска маршрута

    2. Ограничение времени жизни пакета для исключения зацикливания

    3. Оптимизация функциональности программы вообще. Если ты пишешь программу, которая как предполагается, будет работать постоянно на множестве компьютеров, то такая программа не должна выполнять лишних действий, а не лишние должна выполнять наиболее оптимальным способом. Чего, например стоит код:

    term.clear()
            term.setCursorPos(1,1)
            print("__=Ip list=__")
            for i=1,#ip,1 do
              print("Ip : ",ip[i]," Mac : ",id[i])
            end --for
            for i=1,#router,1 do
              print("__=Router=__"..router[i])
            end
            for i=1,pr,1 do
              print("__=path=__")
              print("ip :",ip_path[i]," router :",router_path[i])
            end
            for i=1,14,1 do
              print()
            end
            write("                                  Programmed By NEO")
            print("")
    
    который выполняется при каждом получении пакета. А ведь вывод на экран это одна из наиболее медленных операций)

  5. Можно ли считывать живую карту из камня. Все таки совместить два слоя удобнее вживую, какие-то туннели и бойницы сделать, на однослойном рисунке как это совместить из двух слоев, не хочется фантазировать в уме, как они наложатся друг на друга.

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

  6. Я не знаю каким образом разделить строку на несколько переменных, что бы одним пакетом передать.

    Давай для начала поймем как можно объединять и разделять строки. Строки объединяются просто, при помощи оператора .. (две точки). Он называется конкатенация и просто сливает две строки в одну. Пример: message=login..password

    Но разделить, таким образом объединенные, строки однозначно будет невозможно.

    Самый простой способ объединения строк, да и любых данных, это поместить их в таблицу, а потом сериализовать, т.е. преобразовать в строку. Пример:

    message=textutils.serialize({login,password,name})

    На принимающей стороне эту строку можно будет преобразовать снова в таблицу при помощи функции textutils.unserialize(message)


  7. Честно говоря, не совсем понятно, что приведенный код делает.

    1) Почему ты считаешь, что одновременно регистрировать несколько пользователей не получится?

    2) Функция RednetProtect вернет true если id равно 1 и false в противном случае. До второго ифа она не дойдет. Я так понимаю, она должна проверять id на равенство 1, 2 или 3. Цепочка ифов для этого не лучший вариант. Лучше заведи таблицу. Например так:

    validID={[1]=true, [2]=true, [3]=true}
    function RednetProtect(id)
      return validID[id]
    end
    3) Зачем 'register', login, password, name передавать разными пакетами. Гораздо быстрее втиснуть в один и передать одним разом.

    4) А где собственно регистрация?

    5) Зачем функция login?


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

    Создание карты начинается с прорисовки эскиза в пайнте. Причем нижний и верхний слои карты прорисовываются и сохраняются в разных файлах, например map1 и map2. Затем на компьютере прораба выполняется команда buildmap map1 map2, по которой эскизы карты рассылаются черепахам-строителям. И черепахи начинают строить. Постройка вот такой карты

    post-6-14160783988111_thumb.jpg

    занимает порядка 2,5 минут. Выложил бы видео имей я доступ к ютубу.

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


  9. Руководство по настройке сервера сообщений и пример работы с клиентом

    На первый компьютер (который будет сервером) записываем файл mess_serv.

    Запускаем mess_serv

    При первом запуске сервер создает:

    - файл passwd, в котором будут храниться пароли пользователей

    - директорию messages, в которой будут храниться непрочитанные сообщения

    - директорию readed, в которой будут храниться прочитанные сообщения

    - директорию news, в которую необходимо помещать новости

    На другой компьютер записываем файл mess_client. Придется подкорректировать

    первую строчку этого файла, указать ID первого компьютера.

    Запускаем mess_client. В дальнейшем все команды вводим на компьютере-клиенте

    Видим меню

    Регистрируем первого пользователя. Клик по пункту "New user"

    Вводим ник и пароль, например Vasya и 123

    Видим сообщение "User Vasya connected"

    отконекчиваемся "Logout"

    и регистрируем второго пользователя "New user"

    Petya 456

    Посылаем сообщение первому пользователю "Send mess"

    После запроса Destination user nick вводим имя первого пользователя (Vasya)

    или стрелками Вверх-Вниз выбираем из уже зарегистрированных

    и текст сообщения (Privet ot Peti)

    отконекчиваемся "Logout"

    Регистрируем третьего пользователя

    Посылаем сообщение первому пользователю

    отконекчиваемся

    Заходим снова под первым пользователем: "Login", вспоминаем имя и пароль

    Проверяем почту "Check mess"

    Видим сообщение You have 2 new message(s)

    Читаем первое сообщение "Read mess"

    Видим <Petya> Privet ot Peti

    Его можно удалить <Del> или перейти к следующему <Стрелка вправо>

    Видим <Sasha> Privet ot Sashi

     

    На сервере:

    a - для получения id и имен активных пользователей

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

    q - выход

     

    В директории news создаем несколько файлов с текстами новостей и снова

    запускаем сервер, после чего их можно будет почитать с клиента нажав пункт "News"

     

    Сервер http://pastebin.com/K7VhM2N5

    Клиент http://pastebin.com/1RUTNKNx


  10. сундучки, как Вы их там правильно показали, только иногда пополнять углем и бэдроком. Там их, правда, несколько, 2-3, поставить нужно, с разными предметами, допустим снизу, сверху и слева.

    Если не использовать блоки и предметы, которые разрушаются (например, стекло) то при демонтаже они возвращаются в инвентарь черепахи и в пополнении не нуждаются. Поэтому подзаправлять черепаху нужно только углем, а значит хватит одного сундука. Все таки одна черепаха строит половинку карты довольно долго. Зрители устанут ждать. Сейчас рассматриваю вариант одновременной работы трех черепах. В принципе это будет легко изменить настройками.

  11. Алекс, я начал программировать систему для постройки карты по заданному массиву.

    Хочу уточнить такие вопросы:

    1. Половинки карт всегда симметричны?

    2. Если да, то симметрия зеркальная или осевая?

    3. Из какого количества типов блоков должна состоять карта? Пока предполагается три типа строительных блоков плюс один специальный (сундук, лампа и т.д.)

     

    На данный момент предполагается, что карта будет прорисовываться в пайнте. Кто нибудь придумает алгоритм генерации карты случайным образом? Neo?


  12. Функция serialize довольно ресурсоемкая (см. модуль textutils. Рекурсии там и прочее). Если вызывать ее разово, это конечно, ни на чем не сказывается. Но, если десятки роутеров будут только тем и заниматься, что сериалазить, это может здорово подгрузить сервер.

    Функция unserialize это дыра для хакера поскольку пытается выполнить входящий пакет как строку Lua. Т.е. при желании можно заставить твой роутер выполнить любой код какой только вздумается.


  13. О вероятностях.

    Вероятность выпадения семерки на отдельно взятом барабане - 0,1. Вероятность не выпадения - 0,9. Эти два факта, вроде, сомнений не вызывают.

    Теперь какие возможны варианты выпадения семерок на трех барабанах?

    1) Ни одной семерки не выпало. Это означает, что на первом барабане не выпало И на втором не выпало И на третьем не выпало. Поскольку независимые события собираются по "И" вероятности перемножаются. Т. е. имеем

    P0=0,9*0,9*0,9=0,729

    2) Только на одном барабане выпала семерка. Это означает, что на первом барабане выпала семерка И на втором не выпала И на третьем не выпала. А так же надо учесть варианты, когда семерка выпала на втором ИЛИ на третьем барабане. Там где независимые события собираются по "И" - вероятности умножаем, там где взаимоисключающие события собираются по "ИЛИ" - складываем:

    P1=0,1*0,9*0,9+0,9*0,1*0,9+0,9*0,9*0,1=0,243

    3) Семерки выпали на двух барабанах: рассуждения аналогичны п.2

    P2=0,1*0,1*0,9+0,1*0,9*0,1+0,9*0,1*0,1=0,027

    4) Выпали три семерки: P3=0,1*0,1*0,1=0,001

    Эти четыре варианта исхода являются взаимоисключающими (т.е. возникновение двух из них одновременно невозможно) и взаимодополняющими (других вариантов нет), а значит сумма их вероятностей должна равняться единице. Проверяем

    P=P0+P1+P2+P3=0,729+0,243+0,027+0,001=1

    • Нравится 2

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

    Над чем еще следует подумать:

    - работа одновременно нескольких черепах на одной территории для сокращения времени работы;

    - координация работающих черепах с компьютера.


  15. А вот и программка

    local W_Size=15
    local H_Size=15
    local Coal_slot=16
    
    function open()
        for n,sSide in ipairs( rs.getSides() ) do
            if rednet.isOpen( sSide ) then
              return true
            end
        end
        for n,sSide in ipairs( rs.getSides() ) do
            if peripheral.getType( sSide )=='modem' then
              rednet.open(sSide)
              return true
            end
        end
        return false
    end
    
    local function getCoal()
      if turtle.getItemCount(Coal_slot)==0 then
        turtle.select(Coal_slot)
        turtle.suckDown()
      end
    end
    
    local function Refuel()
      if turtle.getFuelLevel()<1000 then
        turtle.select(Coal_slot)
        turtle.refuel(1)
      end
    end
    
    local function openCoble()
      Refuel()
      turtle.select(Coal_slot-1)
      turtle.dig()
      turtle.forward()
    end
    
    local function closeCoble()
      turtle.back()
      turtle.select(Coal_slot-1)
      turtle.place()
    end
    
    function buildLine(line)
      openCoble()
      for i=1,H_Size do
        if turtle.detect() then turtle.dig() end
        turtle.forward()
        if turtle.detectDown() then turtle.digDown() end
      end
      for i=H_Size,1,-1 do
        if line[i][1] then
          turtle.select(line[i][1]*4-3)
          if turtle.getItemCount(line[i][1]*4-3)<2 then
            repeat
              turtle.select(turtle.getSelectedSlot()+1)
            until turtle.getItemCount(turtle.getSelectedSlot())>0
          end
          turtle.placeDown()
        end
        turtle.back()
        if line[i][2] then
          turtle.select(line[i][2]*4-3)
          if turtle.getItemCount(line[i][2]*4-3)<2 then
            repeat
              turtle.select(turtle.getSelectedSlot()+1)
            until turtle.getItemCount(turtle.getSelectedSlot())>0
          end
          turtle.place()
        end
      end
      closeCoble()
    end
    
    function clearLine()
      openCoble()
      for i=1,H_Size do
        if turtle.detect() then turtle.dig() end
        turtle.forward()
        if turtle.detectDown() then turtle.digDown() end
      end
      for i=1,H_Size do turtle.back() end
      closeCoble()
    end
    
    function scanLine()
      local line={}
      openCoble()
      for i=1,H_Size do
        local p={}
        if turtle.detect() then
          for j=1,4 do
            turtle.select(j*4-3)
            if turtle.compare() then p[2]=j break end
          end
          turtle.dig()
        end
        turtle.forward()
        if turtle.detectDown() then
          for j=1,4 do
            turtle.select(j*4-3)
            if turtle.compareDown() then p[1]=j break end
          end
        end
        line[i]=p
      end
      for i=H_Size,1,-1 do
        turtle.back()
        if line[i][2] then
          turtle.select(line[i][2]*4-3)
          turtle.place()
        end
      end
      closeCoble()
      return line
    end
    
    function buildMap(map)
      getCoal()
      for i=1,W_Size-1 do
        buildLine(map[i])
        turtle.turnRight()
        turtle.forward()
        turtle.turnLeft()
      end
      buildLine(map[W_Size])
      turtle.turnLeft()
      for i=1,W_Size-1 do turtle.forward() end
      turtle.turnRight()
    end
    
    function clearMap()
      getCoal()
      for i=1,W_Size-1 do
        clearLine()
        turtle.turnRight()
        turtle.forward()
        turtle.turnLeft()
      end
      clearLine()
      turtle.turnLeft()
      for i=1,W_Size-1 do turtle.forward() end
      turtle.turnRight()
    end
    
    function scanMap()
      local map={}
      getCoal()
      for i=1,W_Size-1 do
        map[i]=scanLine()
        turtle.turnRight()
        turtle.forward()
        turtle.turnLeft()
      end
      map[W_Size]=scanLine()
      turtle.turnLeft()
      for i=1,W_Size-1 do turtle.forward() end
      turtle.turnRight()
      return map
    end
    
    Доступны следующие функции:

    buildMap - заполняет игровое пространство по заданной таблице

    clearMap - очищает игровое пространство

    scanMap - сканирует игровое пространство и возвращает его в виде таблицы


  16. Да, действительно. Часть озвученных вопросов находится в компетенции администрации проекта (это организация боя и контроль соблюдения правил), а часть - в компетенции команды программистов. Но поскольку мы еще не разделились на тех и других, вопросы тоже не делим, а решаем сообща.

    Я вот создал черепаху-строителя, которая заполняет игровую арену различными препятствиями. Арена у меня выглядит вот так:

    post-6-1416078398366_thumb.png

    и представляет собой пространство 15х30 высотой два блока. По бокам арена ограждена каменными блоками, сверху защащена кварцевым стеклом. Конструкция из красного и серого кирпича (см. рисунок) построена черепахой-строителем. Начальное положение черепахи - левый ближний к нам угол за пределами арены во втором слое. В сундуке под черепахой хранится уголь или другое топливо, которым автоматически заправляется черепаха.

    Для постройки карты доступны четыре вида блоков: три любых строительных блока (кроме камня) и сундуки. Их следует разместить в инвентаре черепах таким образом:

    post-6-14160783984535_thumb.png

    слоты 1-4 блок первого вида (в примере - красный кирпич), 5-8 - блок второго вида (серый кирпич), 9-12 - блок третьего вида (песок), слоты 13-14 - сундуки. Слоты 15-16 зарезервированы для нужд черепахи.


  17. Как же работает эта машина?

     

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

     

    Когда ставка принята, нажимаем кнопку. И вот теперь всё зависит от фортуны. Что же выпадет на баранах? Если нам повезло и среди выпавших цифр есть хотя бы одна семерка, получаем выигрыш из левой трубы.

     

    Для завершения нам осталось создать файл startup с текстом shell.run(“monitor right casino”), перегрузить компьютер и сделать корпус из GoldBlockCover.

    post-6-14160783982988_thumb.png

    На этом можно было бы и закончить, но для тех, кто дружит с математикой, я хотел бы добавить еще вот что. В строке номер 100 файла casino можно найти табличку bonus={2,20,200}. Она содержит числа, которые определяют выигрыш игрока в случае выпадения одной, двух или трех семерок соответственно. Давайте подсчитаем матожидание выигрыша.

     

    M=B1*P1+B2*P2+B3*P3

     

    Где B1, B2, B3 – выигрыш в случае выпадения одной, двух или трех семерок;

     

    P1, P2, P3 – вероятность соответствующего события.

     

    Вероятность выпадения только одной семерки равна 0,243. Вероятность выпадения двух семерок – 0,027. Трех семерок – 0,001. Кто силен в комбинаторике, проверьте меня.

     

    Таким образом, матожидание выигрыша равняется:

     

    M=2*0,243+20*0,027+200*0,001=1,226

     

    Что это значит? Это значит, что на тысячу принятых слитков автомат выдаст в качестве призов 1226. Согласитесь, для казино разорительно. И если вы, построив такой автомат, хотите сколотить на нем состояние то вам стоит подкорректировать табличку bonus.

     

    Считайте ваши денежки и удачной вам игры!


  18. Заходим в терминал компьютера и выполняем команду pastebin get ihL5CTxd casino

     

    Возможно, полученную программу придется чуть подкорректировать. Сначала определим координаты сундука относительно сенсора. Для этого выполним ocs/programs/sensorview

     

    Выбираем элемент с именем DiamondChest. Если вы используете сундук другого типа, то и имя его должно быть соответствующим.

    post-6-14160783980868_thumb.png

    Запоминаем координаты сундука относительно сенсора. В случае на картинке это -1,-1,1.

     

    Выходим из sensorview и открываем на редактирование файл casino. Находим в пятой строчке переменную ChestPos и присваиваем ей значение ‘-1,-1,1’

    post-6-14160783981689_thumb.png

    Сохраняем файл casino и запускаем его вот таким образом monitor right casino.

     

    Если всё сделано правильно, на мониторе мы должны увидеть вот такую картину.

    post-6-14160783982403_thumb.png


  19. Теперь сделаем трубу, по которой слитки будут извлекаться из сундука, для выдачи игроку его выигрыша. Это должен быть, разумеется, отрезок деревянной трубы. Установим и настроим при помощи ключа отрезок железной трубы. Оставшуюся часть трубы сделаем из золота. Другой конец трубы выведем под левым нижним углом монитора как показано на рисунке.

    post-6-14160783977422_thumb.png

    Для извлечения предметов из сундука установим на деревянную трубу пульсирующий гейт.

    post-6-14160783978181_thumb.png

    Настроим пульсирующий гейт на управление редстоун-сигналом и выберем ему функцию – «EnergyPulser».

    post-6-14160783979272_thumb.png

    Нам осталось установить над компьютером сенсор. Сенсор нужен для того, чтобы компьютер мог контролировать количество предметов в сундуке. В сенсор нужно зарядить Inventory Sensor Card.

    post-6-14160783980281_thumb.png

    На этом аппаратная часть закончена. Приступаем к программированию.


  20. Под правым нижним углом монитора установим обсидиановую трубу. В нее игрок будет вносить свою ставку.

    post-6-14160783976022_thumb.png

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

     

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

    post-6-14160783976779_thumb.png

    В сундук тоже нужно положить 20-30 стаков железных слитков.


  21. Доброго времени суток. Хочу рассказать вам, как можно в игре MineCraft построить игровой автомат на подобии всем известного «Однорукого бандита». Для тех кто подзабыл напомню принцип действия этого автомата http://ru.wikipedia.org/wiki/Слот-машина. Игрок делает ставку после чего запускает машину. Машина имеет три вращающихся барабана с нанесенными на них различными символами. Барабаны останавливаются в случайном положении и в зависимости от выпавших символов игрок либо проигрывает, либо получает свою ставку умноженную в несколько (иногда в сотни) раз.

     

    Для постройки у вас должны быть установлены следующие моды: ComputerCraft(как же без него) с аддоном OpenCCSensors, BuildCraft и ProjectRed.

     

    Построим вот такую конструкцию из золотого блока и шести золотых мониторов. На золотой блок установим кнопку.

    post-6-14160783972457_thumb.png

    С обратной стороны монитора установим компьютер (подойдет как золотой так и обычный) и соединим его с золотым блоком при помощи красного провода как показано на рисунке.

    post-6-14160783974183_thumb.png

    Чуть в сторонке от компьютера, по диагонали установите сундук.

    post-6-14160783975016_thumb.png

    Этот сундук будет использоваться для хранения предметов, на которые идет игра. Если играть вы планируете по крупному, то объём сундука должен быть как можно большим. Для этой цели подойдет алмазный сундук, ну или на худой конец – серебряный.

    • Нравится 2
×
×
  • Создать...