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

Zer0Galaxy

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

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

  • Посещение

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

    189

Все публикации пользователя Zer0Galaxy

  1. Не совсем так. Таблица маршрутизации все же есть. Заполняется она динамически при первом прохождении пакета методом волны. Но вот если количество роутеров в сети больше двух (есть вариант ветвления волны) то волна эта никогда не затухнет.
  2. Проанализировал код. Подправил описание в соответствии со своим пониманием. Коментарии - в скобках курсивом. Роутер - это компьютер и специальное программное обеспечение предназначенные для организации маршрутизации пакетов в сети 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("") который выполняется при каждом получении пакета. А ведь вывод на экран это одна из наиболее медленных операций)
  3. Можно. И такая функция уже есть. Нужно только реализовать интерфейс для компьютера. Вот только карту для считывания нужно строить из разрушаемого материала ибо при сканировании снимается верхний слой. Другого способа пока не вижу.
  4. Давай для начала поймем как можно объединять и разделять строки. Строки объединяются просто, при помощи оператора .. (две точки). Он называется конкатенация и просто сливает две строки в одну. Пример: message=login..passwordНо разделить, таким образом объединенные, строки однозначно будет невозможно. Самый простой способ объединения строк, да и любых данных, это поместить их в таблицу, а потом сериализовать, т.е. преобразовать в строку. Пример: message=textutils.serialize({login,password,name}) На принимающей стороне эту строку можно будет преобразовать снова в таблицу при помощи функции textutils.unserialize(message)
  5. Честно говоря, не совсем понятно, что приведенный код делает. 1) Почему ты считаешь, что одновременно регистрировать несколько пользователей не получится? 2) Функция RednetProtect вернет true если id равно 1 и false в противном случае. До второго ифа она не дойдет. Я так понимаю, она должна проверять id на равенство 1, 2 или 3. Цепочка ифов для этого не лучший вариант. Лучше заведи таблицу. Например так: validID={[1]=true, [2]=true, [3]=true} function RednetProtect(id) return validID[id] end3) Зачем 'register', login, password, name передавать разными пакетами. Гораздо быстрее втиснуть в один и передать одним разом.4) А где собственно регистрация? 5) Зачем функция login?
  6. Ну вот, закончил программирование системы построения карты. Система состоит из шести черепах-строителей (по три на каждую половину карты) и компьютера прораба. Создание карты начинается с прорисовки эскиза в пайнте. Причем нижний и верхний слои карты прорисовываются и сохраняются в разных файлах, например map1 и map2. Затем на компьютере прораба выполняется команда buildmap map1 map2, по которой эскизы карты рассылаются черепахам-строителям. И черепахи начинают строить. Постройка вот такой карты занимает порядка 2,5 минут. Выложил бы видео имей я доступ к ютубу. Теперь по поводу бэдрока в качестве материала карты. Похоже, это единственно возможный вариант, хоть он мне и не нравится. Во-первых, выглядит не привлекательно. Во-вторых, исключает возможность автоматического демонтажа карты. Вот если бы найти блок, который бы разрушался черепахой-шахтером, но не разрушался черепахой-лесорубом. Тогда бойцов можно было бы вооружать топорами не боясь, что они поломают карту.
  7. http://ridav.oxnull.net/forum/index.php?threads/клиент-сервер-новостей-и-сообщений.19/Остались нерешенные вопросы: - связь на дальние расстояния - защита от перехвата сообщений - руссификация
  8. Руководство по настройке сервера сообщений и пример работы с клиентом На первый компьютер (который будет сервером) записываем файл 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
  9. Если не использовать блоки и предметы, которые разрушаются (например, стекло) то при демонтаже они возвращаются в инвентарь черепахи и в пополнении не нуждаются. Поэтому подзаправлять черепаху нужно только углем, а значит хватит одного сундука. Все таки одна черепаха строит половинку карты довольно долго. Зрители устанут ждать. Сейчас рассматриваю вариант одновременной работы трех черепах. В принципе это будет легко изменить настройками.
  10. Алекс, я начал программировать систему для постройки карты по заданному массиву. Хочу уточнить такие вопросы: 1. Половинки карт всегда симметричны? 2. Если да, то симметрия зеркальная или осевая? 3. Из какого количества типов блоков должна состоять карта? Пока предполагается три типа строительных блоков плюс один специальный (сундук, лампа и т.д.) На данный момент предполагается, что карта будет прорисовываться в пайнте. Кто нибудь придумает алгоритм генерации карты случайным образом? Neo?
  11. Функция serialize довольно ресурсоемкая (см. модуль textutils. Рекурсии там и прочее). Если вызывать ее разово, это конечно, ни на чем не сказывается. Но, если десятки роутеров будут только тем и заниматься, что сериалазить, это может здорово подгрузить сервер. Функция unserialize это дыра для хакера поскольку пытается выполнить входящий пакет как строку Lua. Т.е. при желании можно заставить твой роутер выполнить любой код какой только вздумается.
  12. О вероятностях. Вероятность выпадения семерки на отдельно взятом барабане - 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
  13. Мой тебе совет, уходи от serialize-unserialize
  14. Когда то решал задачку отправки электронных писем. Могу выложить если интересно Как планируешь связывать клиента с сервером если расстояние между ними больше 64?
  15. Черепаха заполняет территорию только одной команды. Предполагается, что с другой стороны должна работать аналогичная черепаха. Над чем еще следует подумать: - работа одновременно нескольких черепах на одной территории для сокращения времени работы; - координация работающих черепах с компьютера.
  16. А вот и программка 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 - сканирует игровое пространство и возвращает его в виде таблицы
  17. Да, действительно. Часть озвученных вопросов находится в компетенции администрации проекта (это организация боя и контроль соблюдения правил), а часть - в компетенции команды программистов. Но поскольку мы еще не разделились на тех и других, вопросы тоже не делим, а решаем сообща. Я вот создал черепаху-строителя, которая заполняет игровую арену различными препятствиями. Арена у меня выглядит вот так: и представляет собой пространство 15х30 высотой два блока. По бокам арена ограждена каменными блоками, сверху защащена кварцевым стеклом. Конструкция из красного и серого кирпича (см. рисунок) построена черепахой-строителем. Начальное положение черепахи - левый ближний к нам угол за пределами арены во втором слое. В сундуке под черепахой хранится уголь или другое топливо, которым автоматически заправляется черепаха. Для постройки карты доступны четыре вида блоков: три любых строительных блока (кроме камня) и сундуки. Их следует разместить в инвентаре черепах таким образом: слоты 1-4 блок первого вида (в примере - красный кирпич), 5-8 - блок второго вида (серый кирпич), 9-12 - блок третьего вида (песок), слоты 13-14 - сундуки. Слоты 15-16 зарезервированы для нужд черепахи.
  18. Как же работает эта машина? Счастливой цифрой является, разумеется, семерка. В трубу справа от кнопки вносим ставку. Это должны быть железные слитки в количестве от 1 до 5. Таблица чисел вверху экрана белым цветом показывает сделанную ставку и возможный выигрыш в случае выпадения одной, двух или трех семерок. Когда ставка принята, нажимаем кнопку. И вот теперь всё зависит от фортуны. Что же выпадет на баранах? Если нам повезло и среди выпавших цифр есть хотя бы одна семерка, получаем выигрыш из левой трубы. Для завершения нам осталось создать файл startup с текстом shell.run(“monitor right casino”), перегрузить компьютер и сделать корпус из GoldBlockCover. На этом можно было бы и закончить, но для тех, кто дружит с математикой, я хотел бы добавить еще вот что. В строке номер 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. Считайте ваши денежки и удачной вам игры!
  19. Заходим в терминал компьютера и выполняем команду pastebin get ihL5CTxd casino Возможно, полученную программу придется чуть подкорректировать. Сначала определим координаты сундука относительно сенсора. Для этого выполним ocs/programs/sensorview Выбираем элемент с именем DiamondChest. Если вы используете сундук другого типа, то и имя его должно быть соответствующим. Запоминаем координаты сундука относительно сенсора. В случае на картинке это -1,-1,1. Выходим из sensorview и открываем на редактирование файл casino. Находим в пятой строчке переменную ChestPos и присваиваем ей значение ‘-1,-1,1’ Сохраняем файл casino и запускаем его вот таким образом monitor right casino. Если всё сделано правильно, на мониторе мы должны увидеть вот такую картину.
  20. Теперь сделаем трубу, по которой слитки будут извлекаться из сундука, для выдачи игроку его выигрыша. Это должен быть, разумеется, отрезок деревянной трубы. Установим и настроим при помощи ключа отрезок железной трубы. Оставшуюся часть трубы сделаем из золота. Другой конец трубы выведем под левым нижним углом монитора как показано на рисунке. Для извлечения предметов из сундука установим на деревянную трубу пульсирующий гейт. Настроим пульсирующий гейт на управление редстоун-сигналом и выберем ему функцию – «EnergyPulser». Нам осталось установить над компьютером сенсор. Сенсор нужен для того, чтобы компьютер мог контролировать количество предметов в сундуке. В сенсор нужно зарядить Inventory Sensor Card. На этом аппаратная часть закончена. Приступаем к программированию.
  21. Под правым нижним углом монитора установим обсидиановую трубу. В нее игрок будет вносить свою ставку. Соединим обсидиановую трубу с сундуком золотой трубой. В самом конце поставим алмазную трубу, чтобы в сундук попадали только те предметы, на которые должна идти игра. Теперь самое время определить, на что именно мы будем играть. Предположим, это будут железные слитки. Внимательно смотрим, какой конец алмазной трубы подсоединен к сундуку. Ага – серый. Заходим в настройки алмазной трубы и устанавливаем в серую ячейку железный слиток. В сундук тоже нужно положить 20-30 стаков железных слитков.
  22. Доброго времени суток. Хочу рассказать вам, как можно в игре MineCraft построить игровой автомат на подобии всем известного «Однорукого бандита». Для тех кто подзабыл напомню принцип действия этого автомата http://ru.wikipedia.org/wiki/Слот-машина. Игрок делает ставку после чего запускает машину. Машина имеет три вращающихся барабана с нанесенными на них различными символами. Барабаны останавливаются в случайном положении и в зависимости от выпавших символов игрок либо проигрывает, либо получает свою ставку умноженную в несколько (иногда в сотни) раз. Для постройки у вас должны быть установлены следующие моды: ComputerCraft(как же без него) с аддоном OpenCCSensors, BuildCraft и ProjectRed. Построим вот такую конструкцию из золотого блока и шести золотых мониторов. На золотой блок установим кнопку. С обратной стороны монитора установим компьютер (подойдет как золотой так и обычный) и соединим его с золотым блоком при помощи красного провода как показано на рисунке. Чуть в сторонке от компьютера, по диагонали установите сундук. Этот сундук будет использоваться для хранения предметов, на которые идет игра. Если играть вы планируете по крупному, то объём сундука должен быть как можно большим. Для этой цели подойдет алмазный сундук, ну или на худой конец – серебряный.
  23. На счет построения карты. Вариант с поршнями, конечно самый быстро перестраиваемый. Но возникают сложности с многоуровневой картой. Максимум, что можно построить - двухуровневая карта. Причем верхний уровень карты строится при помощи поршней опускаемых с потолка. Т. е. карта будет закрыта сверху непрозрачными блоками (поршнями), что нехорошо. Да и возникнут сложности с подведением сигнала к каждому поршню. Мне более реальной кажется карта, строящаяся при помощи черепах-строителей. Представьте, движется шеренга черепах. Задом. И каждая черепаха в нужном месте ставит блок под, над или перед собой. Таким образом за один проход строится трехуровневая карта. Сами карты можно хранить в виде таблиц в компьютере-арбитре и строить по реднет-команде. Как их генерировать? Думаю, случайным образом сгенерированная карта будет совершенно непроходимой, если не найти какой нибудь хитрый алгоритм. Можно для начала строить карты вручную. А те же черепахи-строители будут считывать построенную карту в память.
  24. Поднято много вопросов и вопросов достаточно сложных. Сразу всё не решить. Можно каждую из задач по отдельности выносить на конкурс, что бы участники форума предлагали свои решения. Лучшее решение реализовывать. Например, генерация карты. Я уже вижу несколько способов. Когда основные решения будут проработаны, тогда собирать из них действующую арену роботов.
  25. Имею браузер для отображения гипертекста. Попробуем Интернет забацать, когда сервер таки заработает.
×
×
  • Создать...