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

Alex

Администраторы
  • Публикации

    3 168
  • Зарегистрирован

  • Посещение

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

  1. Alex

    [CC] Банк

    http://puu.sh/8WkH9/497e6b9a52.png - это у кого-то было жестокое похмелье
  2. Старожилы помнят, что до аварии на VDS у нас на сервере был банк. Он был построен и почти готов к работе после закрытия некоторых уязвимостей в ПО. Вот скрины, кто не застал банк на сервере: http://puu.sh/8Va8i/a009ad102f.jpg http://puu.sh/8VafM/db105507c9.jpg http://puu.sh/8Vajm/4f582964c4.jpg http://puu.sh/8VaS8/826f82a11c.jpg https://www.youtube.com/watch?v=XpdvatZMwCk&list=PLrGgY-Jtfx4y41YN_ltrFijEy-y9k3IQt&index=14 Хочется его построить заново. Дизайн не знаю пока, похожий будет или другой. Но важнее другое. После постройки опять встанет вопрос в прайсах на предметы. Крайне нуждаюсь в помощи при расчете цен на предметы. Основные ресурсы для купли продажи- это ископаемые, дроп мобский, инструменты, дорогие и редкие камни, машины с безумным крафтом, солнечные панельки, броня всякая. Хватит на первое время 30-50 айтемов. Важно рассчитать соотношения цен. То есть, например - кусочек угля стоит 100 mcr. C него получаем 4000 EU в печке в ИК. Нужно рассчитать цену на электроэнергию, и другие ресурсы. Если например, для крафта алмаза нужно 128 кусочков угля - то алмаз будет стоить +- 12 800 mcr. Сколько будет стоить железо и золото, нужно исходить из частоты нахождения его в земле и востребованности. В цену можно добавлять затраты электроэнергии и нервов . Можно также завысить(не занизить) цены на какие-то дорогие редкие камни(это же банк ). Посчитать цену на микросхемы. Также приложу файлик, нашел его на каком-то форуме, в нем тоже интересный подход на ценообразование в зависимости от количества и соотношения ресов в чанке. Разницу на куплю-продажу (%) добавлю и сам немножко в пользу банка. То есть смысл задать цены на первичные ресурсы майна (которые есть в природе), и исходя из цен на них+затраты+нервы+востребованность*кол-во в рецепте и прочее посчитать цены на ходовые айтемы (сколько стоит квант, допустим). Цель - шахтер или пчеловод игрок, он может продать избыток одних ресурсов и купить другие, которые не может скрафтить. Также деньги на счете будут в будущем капитализироваться. Есть также мысль о кредитовании, но только в частном порядке на аккаунт в банке, который знает админ и под большой процент(будет выгодно игрокам, которые умеют быстро развиваться в майне) Всем, кто окажет ощутимую помощь в данном вопросе, выдам виллу трехэтажную из кварца с золотой каемочкой, с джакузи и фонтанами в любом месте карты и др. награды.
  3. Semoro, буду Вам очень благодарен. Важно именно базовое ядро, а дальнейшее развитие и модернизацию программы оставим для участников соревнований!
  4. Пропал интерес и угас огонь в глазах.А мне интересно почитать, как Зеро подходит к вопросу. Тут есть и топология сети, уровни, шлюзы по умолчанию и прочее. Темы закрывают модераторы, кстати.
  5. Покопавшись в методах трассировки считаю, что для наших целей оптимальным будет реализовать волновой алгоритм (http://ru.wikipedia.org/wiki/Алгоритм_Ли) Так как черепашке после спавна карта не известна совсем, она в начале всю таблицу (ДРП) заполняет значениями, соответствующими непроходимым участкам (то есть стена). В процессе разведки карта уточняется, то есть стена заменяется на пустоту там, где действительно пустота. Карта обрабатывается всеми черепахами и является единым объектом. То есть, что разведала одна черепаха, должно стать известно всем остальным. Карт две (т.к. у нас два слоя). Трассировать можно только путь между двумя пустыми координатами карты в пределах одного ДРП. Трассировка на ранних стадиях разведки не целесообразна. Остается вопрос, который я пока не до конца понимаю, как оптимально реализовать. Это простая разведка с постепенным смещением по карте, изменение слоя карты. Как черепахе задавать оптимально приращение dx dy, в сторону ли врага, в сторону ли большого неисследованного массива карты или еще как-то. Если она, допустим, решила сменить область исследования, она трассирует путь в известной зоне, перебазируется туда, а там опять планомерно приступает к разведке. Примерно так, как мы копаем руду в пещере - копаем как-то рандомно по блоку, потом нас что-то дернуло, пробежали в соседнюю пещеру и копаем там. Вот этот момент, как мы бежим в другую пещеру - это реализация перемещения по кратчайшему пути, так как мы его знаем. Но что нас побуждает копать тут или там, это вопрос. И его надо решить. Ну и естественно, что задача разведки будет актуальной для черепах до тех пор, пока в нижнем, или верхнем слое есть неизвестные элементы, а бой еще не закончен(захвачены все флаги или весь противник уничтожен) Кстати о потерях мы и враг будет узнавать от арбитра по признаку прекращения периодического пинга от бойца. Почему через арбитра решил (а как мы узнаем, что враг съел врага) То есть одним из условий игр - пинг сервера бойцами обеих команд.
  6. Отвечу в такой же дерзкой манере: Мне совершенно не интересно, что Вы ты знаешь о маршрутизации, мое замечание касалось лишь программы. Открою тайну, любой школьник с мозгами при нашем доступе к информации может ознакомиться с основными понятиями , положениями и принципами в течении получаса по любым вопросам науки и техники, ну а человек с высшим техническим образованием и подавно. Нюансы, конечно, можно изучать годами. Если ты не собираешься модернизировать программу и свято веришь, что она справляется со всеми задачами маршрутизации, спорить не стану. Не надо так болезненно реагировать на критику, и указывать, где и что писать людям. Форум для того и существует, чтобы что-то обсудить и выслушать любую критику. Р.S. Сам как думаешь, когда случайный человек скачает твою программу, сможет ли он настроить передачу данных между различными сегментами сети ?
  7. Ну это не сильно похоже на таблицы маршрутов.
  8. Так именно и будет! Сам смысл, для чего предназначен роутер, здесь пока не реализован. Без таблиц, статических или динамических, не обойтись. А про них нет никакого упоминания.
  9. Карта - бомба. Только, как я понял, она читает карту из рисунка. Можно ли считывать живую карту из камня. Все таки совместить два слоя удобнее вживую, какие-то туннели и бойницы сделать, на однослойном рисунке как это совместить из двух слоев, не хочется фантазировать в уме, как они наложатся друг на друга. Текстурка бэдрока - не ахти, согласен, но иначе игроки будут хитрить. В новых майнкрафтах я даже не знаю, где текстурки хранятся, чтобы заменить.
  10. Я тоже смотрю, что почему-то все начинают в КК писать сразу программы, связанные с роутерами, серверами клиентами и базами данных, а это не самые легкие задачи. При всех тех дырах сетей и прочее. Зачем сразу пытаться написать аналог Одноклассников и ВК. Можно пока поработать с файлами, таблицами, циклами, подать простую команду по сети черепашке, повернуться например. Немножко код научиться разбивать на смысловые блоки и записывать их в функции, как передавать аргументы. Тогда намного легче будет ориентироваться в своем и чужом коде. Ну и АПИ конечно почитать надо.
  11. Может как-то переделать функцию, чтобы она не пыталась выполнить строку, как функцию. И длину #s сразу проверять, чтобы не слали строки в приемник бесконечные (надо знать максимальную длину своих строк). И переписать весь сериалайз/ансериалайз в какой-то отдельный пользовательский общедоступный функционал. Это опасная функция!:mad: function unserialize( s ) local func = loadstring( "return "..s, "unserialize" ) if func then setfenv( func, {} ) local ok, result = pcall( func ) if ok then return result end end return nil end function Reception() local id,message = rednet.receive() if RednetProtect(id) then local temp_array= textutils.unserialize(message) if temp_array[1] == 'register' then AccountCreate(temp_array) end end end function AccountCreate(temp_array) login = temp_array[2] pass= temp_array[3] name= temp_array[4] ......... end Отправляете по сети так: Логин = qwerty Пароль = 1111 Имя = Вася SendCommand(id_server, {"register", login, password, name} ) Вот функция отправки: function SendCommand(ID, data_pre_send) data_send = textutils.serialize(data_pre_send) rednet.send(ID, data_send) end
  12. смотреть с 17 минуты, можно включить русские субтитры с переводом.Дэн200 (это один из разработчиков мода) рассказывает о некотором подобии сетей интернет, протоколах и подобии маршрутизации. Механизм, конечно совсем другой, но так, для кругозора посмотреть можно. Вот новый АПИ rednet ,для версии 1.63: CHANNEL_BROADCAST = 65535 CHANNEL_REPEAT = 65533 local tReceivedMessages = {} local tReceivedMessageTimeouts = {} local tHostnames = {} function open( sModem ) if type( sModem ) ~= "string" then error( "expected string", 2 ) end if peripheral.getType( sModem ) ~= "modem" then error( "No such modem: "..sModem, 2 ) end peripheral.call( sModem, "open", os.getComputerID() ) peripheral.call( sModem, "open", CHANNEL_BROADCAST ) end function close( sModem ) if sModem then -- Close a specific modem if type( sModem ) ~= "string" then error( "expected string", 2 ) end if peripheral.getType( sModem ) ~= "modem" then error( "No such modem: "..sModem, 2 ) end peripheral.call( sModem, "close", os.getComputerID() ) peripheral.call( sModem, "close", CHANNEL_BROADCAST ) else -- Close all modems for n,sModem in ipairs( peripheral.getNames() ) do if isOpen( sModem ) then close( sModem ) end end end end function isOpen( sModem ) if sModem then -- Check if a specific modem is open if type( sModem ) ~= "string" then error( "expected string", 2 ) end if peripheral.getType( sModem ) == "modem" then return peripheral.call( sModem, "isOpen", os.getComputerID() ) and peripheral.call( sModem, "isOpen", CHANNEL_BROADCAST ) end else -- Check if any modem is open for n,sModem in ipairs( peripheral.getNames() ) do if isOpen( sModem ) then return true end end end return false end function send( nRecipient, message, sProtocol ) -- Generate a (probably) unique message ID -- We could do other things to guarantee uniqueness, but we really don't need to -- Store it to ensure we don't get our own messages back local nMessageID = math.random( 1, 2147483647 ) tReceivedMessages[ nMessageID ] = true tReceivedMessageTimeouts[ os.startTimer( 30 ) ] = nMessageID -- Create the message local nReplyChannel = os.getComputerID() local tMessage = { nMessageID = nMessageID, nRecipient = nRecipient, message = message, sProtocol = sProtocol, } if nRecipient == os.getComputerID() then -- Loopback to ourselves os.queueEvent( "rednet_message", nReplyChannel, message, sProtocol ) else -- Send on all open modems, to the target and to repeaters local sent = false for n,sModem in ipairs( peripheral.getNames() ) do if isOpen( sModem ) then peripheral.call( sModem, "transmit", nRecipient, nReplyChannel, tMessage ); peripheral.call( sModem, "transmit", CHANNEL_REPEAT, nReplyChannel, tMessage ); sent = true end end end end function broadcast( message, sProtocol ) send( CHANNEL_BROADCAST, message, sProtocol ) end function receive( sProtocolFilter, nTimeout ) -- The parameters used to be ( nTimeout ), detect this case for backwards compatibility if type(sProtocolFilter) == "number" and nTimeout == nil then sProtocolFilter, nTimeout = nil, sProtocolFilter end -- Start the timer local timer = nil local sFilter = nil if nTimeout then timer = os.startTimer( nTimeout ) sFilter = nil else sFilter = "rednet_message" end -- Wait for events while true do local sEvent, p1, p2, p3 = os.pullEvent( sFilter ) if sEvent == "rednet_message" then -- Return the first matching rednet_message local nSenderID, message, sProtocol = p1, p2, p3 if sProtocolFilter == nil or sProtocol == sProtocolFilter then return nSenderID, message, sProtocol end elseif sEvent == "timer" then -- Return nil if we timeout if p1 == timer then return nil end end end end function host( sProtocol, sHostname ) if type( sProtocol ) ~= "string" or type( sHostname ) ~= "string" then error( "expected string, string", 2 ) end if sHostname == "localhost" then error( "Reserved hostname", 2 ) end if tHostnames[ sProtocol ] ~= sHostname then if lookup( sProtocol, sHostname ) ~= nil then error( "Hostname in use", 2 ) end tHostnames[ sProtocol ] = sHostname end end function unhost( sProtocol ) if type( sProtocol ) ~= "string" then error( "expected string", 2 ) end tHostnames[ sProtocol ] = nil end function lookup( sProtocol, sHostname ) if type( sProtocol ) ~= "string" then error( "expected string", 2 ) end -- Build list of host IDs local tResults = nil if sHostname == nil then tResults = {} end -- Check localhost first if tHostnames[ sProtocol ] then if sHostname == nil then table.insert( tResults, os.getComputerID() ) elseif sHostname == "localhost" or sHostname == tHostnames[ sProtocol ] then return os.getComputerID() end end if not isOpen() then if tResults then return unpack( tResults ) end return nil end -- Broadcast a lookup packet broadcast( { sType = "lookup", sProtocol = sProtocol, sHostname = sHostname, }, "dns" ) -- Start a timer local timer = os.startTimer( 2 ) -- Wait for events while true do local event, p1, p2, p3 = os.pullEvent() if event == "rednet_message" then -- Got a rednet message, check if it's the response to our request local nSenderID, tMessage, sMessageProtocol = p1, p2, p3 if sMessageProtocol == "dns" and tMessage.sType == "lookup response" then if tMessage.sProtocol == sProtocol then if sHostname == nil then table.insert( tResults, nSenderID ) elseif tMessage.sHostname == sHostname then return nSenderID end end end else -- Got a timer event, check it's the end of our timeout if p1 == timer then break end end end if tResults then return unpack( tResults ) end return nil end local bRunning = false function run() if bRunning then error( "rednet is already running", 2 ) end bRunning = true while bRunning do local sEvent, p1, p2, p3, p4 = os.pullEventRaw() if sEvent == "modem_message" then -- Got a modem message, process it and add it to the rednet event queue local sModem, nChannel, nReplyChannel, tMessage = p1, p2, p3, p4 if isOpen( sModem ) and ( nChannel == os.getComputerID() or nChannel == CHANNEL_BROADCAST ) then if type( tMessage ) == "table" and tMessage.nMessageID then if not tReceivedMessages[ tMessage.nMessageID ] then tReceivedMessages[ tMessage.nMessageID ] = true tReceivedMessageTimeouts[ os.startTimer( 30 ) ] = nMessageID os.queueEvent( "rednet_message", nReplyChannel, tMessage.message, tMessage.sProtocol ) end end end elseif sEvent == "rednet_message" then -- Got a rednet message (queued from above), respond to dns lookup local nSenderID, tMessage, sProtocol = p1, p2, p3 if sProtocol == "dns" and tMessage.sType == "lookup" then local sHostname = tHostnames[ tMessage.sProtocol ] if sHostname ~= nil and (tMessage.sHostname == nil or tMessage.sHostname == sHostname) then rednet.send( nSenderID, { sType = "lookup response", sHostname = sHostname, sProtocol = tMessage.sProtocol, }, "dns" ) end end elseif sEvent == "timer" then -- Got a timer event, use it to clear the event queue local nTimer = p1 local nMessage = tReceivedMessageTimeouts[ nTimer ] if nMessage then tReceivedMessageTimeouts[ nTimer ] = nil tReceivedMessages[ nMessage ] = nil end end end end Кстати сети так и остались уязвимы, что печально. А может и нет.Ходишь с планшетом, играешь на нем в тетрис или просто он в кармане валяется, и он в фоновом режиме пишет весь радиоэфир
  13. Надо найти время будет, и сесть и разобраться с новым API рэднэта. Защита, хост, имя протокола. Версия КК 1.6.+ , надо будет потестить.
  14. print("Enter Side :") side= read() rednet.open(side)Так лучше не делать. Представьте, что Вы вставили мышку в USB разъем, а вам Windows говорит, введите стандарт USB, скорость передачи данных, введите имя драйвера для мыши... Я бы комп вместе с таким Windows в окно сразу запустил. Используйте стандартную функцию, где пользователю не надо думать, с какой именно стороны присобачить модем: function RednetOpen() local sModemSide = nil for n,sSide in ipairs( rs.getSides() ) do if peripheral.getType( sSide ) == "modem" then sModemSide = sSide rednet.open(sModemSide) break end end if sModemSide == nil then print( "Program stopped.") print( "No modem attached." ) error() end end Добавьте, пожалуйста описание, что конкретно должна делать программа. Если это маршрутизатор, то где разделение сетей на уровни, как он общается с другим маршрутизатором, как ищет в таблицах путь к нему (причем оптимально короткий). И программку разбейте, пожалуйста, на какие-то кусочки. Чтобы отдельно функция что-то принимала, другая функция занималась буфером, третья что-то отправляла.
  15. Отличная программка и очень полезная. Просьба, хотелось бы после входа в аккаунт смену меню, то есть при активной сессии должны убираться лишние кнопки. Немножко где-то баг при удалении сообщений, одно всегда остается, а стирается после добавления новых. Хотелось бы дату смс видеть, и циклично месседжи крутить, то есть с последнего на первую перескакивает запись. И кнопку "удалить все месседжи"! Понравилось, как на сервере можно посмотреть пользователей (активных, всех). Нельзя ли по какой-то кнопке добавлять новости, что-бы не лезть в папки. С модемом повозился, функция его видит, но просит открыть (стоял с самого начала WiFi) надо бы еще проверку всунуть на тип модема, видимо. Можно будет на спавне поставить и штук 3-5 терминалов, игроки смогут друг-другу мессаги оставлять и прочее, новости писать можно игрокам, ходя для админов есть плагин automessage в чат. Вот функция получения времени на сайте http://www.timeapi.org. Вместо /now можно указать часовой пояс /pdt/7+hours+before или /pdt/3+hours+after и прочее. Там куча аргументов. Ну а уже строку 2014-05-05T17:33:48+01:00 функцией string.sub() повыкусывать себе дату, время в любом формате можно. function getWorldTime() if not http then print("Pastebin requires http API!!!") print("Set enable API_http in ComputerCraft.cfg") return false end local response = http.get("http://www.timeapi.org/utc/now") --change args if response then local time_mess = response.readAll() response.close() return time_mess else return false end end print(getWorldTime()) На спавн надо будет однозначно поставить, супер почтовичок, единственное, что интерфейсик бы допилить чуть-чуть.
  16. Так, как черепашка начинает строить с нижнего левого угла, карты будут симметричны диаметрально, что очень хорошо. Сама половинка может быть любой формы, не обязательно симметричной. Но вот вопрос, если черепашка исследовала свою половинку поля, она автоматом может пересчитать и карту врага. А нужно ли нам это, надо подумать, хотя страшного в этом ничего вроде нет. Но не хочется сидения на своей карте, программу будут менять так, чтобы сначала исследовать свою карту, пересчитать вражескую, а потом только атаковать всеми силами. Надо подумать. Может разные карты строить для команд, не будет ли тактического преимущества у кого-то из-за этого. Но это легко меняется при обширной базе карт, из 30-40 карт можно выбрать просто похожие. Материал карт - бэдрок однозначно, завалы - случайно из песка, гравия или еще чего-то, не важно, но предпочтительнее сыпучий материал. Флаги и сундуки с углем и прочее ставят админы (арбитры и организаторы чемпионатов). Строитель должен построить только лабиринт, немного отступив от спавна до центральной линии арены (мои скрины выше)
  17. Черепахи бедрок бить то не могут. Мы строим изначально карту из камня обычного, черепашка ее один раз считывает, а в дальнейшем строит из бэдрока, а рэндомно, если видит пустоту при постройке, пусть с какой-то малой вероятностью кидает песок между лабиринтом или еще что-то, типа завалы какие-то. Их черепашки-бойцы с легкостью расчистят в процессе разведки карты и боя. При необходимости постройки новой карты, схема которой у нас есть, админ просто сносит бэдрок на арене в ручном режиме. Мы кидаем бэдрок и прочее в сундуки на базе, выбираем карту, открываем окно(блок бэдрока) для строителя на арене, это можно сделать только амину в креативе, черепаха по команде по змейке строит карту и приезжает обратно на исходную точку. Окно закрываем. Все. По поводу спавна. На скрине видны разные цвета шерсти (1,2,3,4,5 цвета по порядку от белого, это стандартный порядок цветов в майнкрафт). Анализируя цвет (в инвентаре у черепахи есть на начало боя эти блоки шерсти) черепаха не только узнает свое место на арене, но и свою задачу. Например мы в программу можем заложить уже "роль" бойца при спавне. Например, белый и оранжевый - дэферы, остальные цвета - атакеры. Разработчики, программисты и игроки - это одни и те же люди изначально. Когда мы создадим программу, которая более менее управляет черепахой и позволяет достигнуть победы в бою(найти и украсть флаг врага или убить всех вражеских черепах) тогда уже каждый игрок в отдельности может по своему желанию модернизировать программу и попробовать сразиться с другим игроком. И только тогда уже будут нужны админы, судьи, объявления на форуме о турнирах и прочее. По моему, тут все прозаично. А пока в разработке программы принять участие может каждый. Нет сейчас никакой администрации проекта И еще раз повторю. Когда начнется бой, человек не будет вмешиваться в действие роботов. То, что вы в них заложите, это все что у них будет, они смогут рассчитывать только на себя. чтобы победить. Как в футболе, указали тактику (2-2-4-2), и вперед. Так и здесь. В том и вся изюминка - написать хоть какое то подобие ИИ. Нужен генератор задач, анализатор приоритетов, анализатор ситуации и прочее. У черепашки в процессе боя будет накапливаться информация о карте, количестве своих и вражеских потерь, времени до конца боя, количестве захваченных флагов, остатке топлива. При обработке всех этих переменных и будут выбираться роли и действия, тактика и приоритеты. Можете это конечно ничего и не учитывать, а кататься по змейке, пока не наткнетесь на флаг, как в Ваших танчиках на Денди, но будет ли Вам интересно наблюдать за такими действиями программы, вот вопрос
  18. Отлично, очень оперативно, с программой решили! По поводу первого, думаю не критично, справится одна черепаха на половину поля.А вот с координацией согласен. Нужен простенький графический интерфейс что-то типа: показать список карт построить карту - [выбор карты] - [приступить] считать карту - [введите имя] - [приступить] .... Все сделать в главном судейском компьютере. Там же будет и команды на отправку условий боя, старт боя и прочая дребедень.То есть картограф должен получить команду, построить или считать карту и отправить массив в память координационного компа. Строители могут там жить вечно, сундучки, как Вы их там правильно показали, только иногда пополнять углем и бэдроком. Там их, правда, несколько, 2-3, поставить нужно, с разными предметами, допустим снизу, сверху и слева. После постройки/считывания, черепашка возвращается по правой линии назад на исходно положение. рис.1 Общий вид, вражеская половина карты не достроена. рис.2 Спавн рис. 3 рис. 4 Варианты лабиринтов. Карта "Кровавая резня" Здесь мы заведомо пихаем черепах в узкое место, в "кровавую баню" и т.п. Вариантов масса.
  19. Спасибо за исчерпывающий ответ, по "теорверу" в универе 5-ка была, но почти 15 лет прошло, забывается все.
  20. Выкладывать обязательно, только оформить аккуратно, пояснить нюансы, или трудно воспринимаемые участки кода, какие-то скрины прикрепить, ссылки на источники, на видеообзор, Википедию, может какая-то литература использовалась, каких авторов. Рабочие и красиво оформленные работы будут увековечены в разделах проекты или в зале славы на радость их авторам и читателям форума!
  21. Ой, Дмитрий! Чувствую, где-то подвох, не пойму пока где. Играл, и разорился до ниткиУ меня такое чувство,что М на 3 разделить что ли. А то получается, прибыльность 123%. Отбросим ничтожный вариант выпадения один из тысячи - где платят 200 кусочков(то есть на тысячу ставок по 1 кусочку железа в среднем выигрываем 200) Та же история и с двумя семерками. На сотне семерка встречается 20 раз (19 раз по одной и раз в числе 77 две). Верю, что от 000 до 999 - 243 числа с одной семеркой, не помню уже формул комбинаторики, киньте формулу, пожалуйста. Ну так вот - за вероятность 0,243 выигрыш всего один к одному, как на красное-черное, где вероятность 0,5!:p Что-то не сходиться. Как по мне, строку бонуса увеличить надо ~ до 4, 37, 1000! С каверами автоматик вообще конфетка, эстетично очень смотрится. Настроить бы у нас на сервере таких в казино, а рулетку по центру поставить! P.S. Тема была перемещена в этот раздел, как готовый и оформленый проект. (Администрация форума)
  22. Ну вот же, решение под носом было! Одна голова хорошо, а две лучше. Я уже мозг сломал с этими поршнями. Конечно не вариант, что они сверху торчат. С черепашками эпичнее и гибче получиться. Только три уровня - перебор, будет затруднен обзор нижнего уровня, я думаю, ну и размеры арены фактически увеличиваются сильно. Плюс для черепашки на среднем уровне придется детектить и компарить все направления, что снизит динамику боя и возможно под черепахой пролетит целый рой других черепах, пока она детектит блоки вокруг себя, крутиться вправо и влево, а на 1 и 3 уровне ее сенсорам один уровень будет вообще не доступен. Но я очень хочу многоуровневость. Если нет пути к координате на одном уровне - поменяй уровень и проверь снова (можно делать замкнутую фигуру, типа цилиндра например, только с одним входом на определенном слое - это штаб) Вопрос, сориентируется ли команда и поставит на вход защитника. Кто первый найдет на карте ключевые точки - тот и победит. Я думаю два уровня -конечный вариант. Но так как волновой алгоритм работает в двумерном дискретном рабочем поле, придется делать как бы две карты для каждого слоя и их потом увязывать. Я думаю, технически это реализуемо. Нужно только, чтобы черепаха всегда проверяла два варианта прохода в двух слоях-таблицах. По поводу шеренги - зрелищно, но технически сложнее реализовать. Огромный поток данных на один компьютер, и как это все разбивать на столбцы, карты разной ширины и длины ведь будут, много возни с установкой 15-20 черепах и загрузкой в них ПО. Можно сделать проще для нас пока. Так как слоя два, а карты симметрично-зеркальные относительно центральной линии и размер карт будет приблизительно 15 на 30 плюс-минус, то есть 15 на 15 одна половина поля, хватит 2-х черепах, которые строят зеркально-диаметрально две половинки карты. То есть у нас будет массив карты с единицами и нулями. По моим скромным подсчетам время постройки ~ 7.5 минут. Рандомно можно кидать песочек в пустые места карты. Пока программисты возятся возле своих черепах, зрителю есть чем развлечься. Ну а с массивом для одной черепахи вообще проблем не будет (ни с постройкой ни с считыванием) Нужно только для одной из черепах вводить аргумент, который скажет - отзеркалить нужно диаметрально, пожалуйста Камня хватит, 450 штук надо, если забить полностью карту. Мы можем взять 960 (15 стаков ) камня-бэдрока и 64(стак) песка. Ну и на спавне кусочек карты чистый, небольшая площадка там будет я думаю 5х5 например.Так что все норм, запас есть огромный. В общем, программу для картографа уже можно писать. При считывании он должен знать размер и попросить имя файла для карты. Считывать и разрушать будет обычный камень. При построении уже размер виден из таблицы. Строиться карты должны от середины с расхождением друг от друга из бэдрока, чтобы не заботиться о том, что кто-то на кого-то залез и прочее. Стены арены и места для зрителей построены один раз и не меняются. Убирать бэдрок придется только админам вручную (просто почистить куб средствами worldedit'а)
  23. И так, поехали. Типы арен, я думаю, следует представить в таблице, где указан размер, кол-во бойцов, тип сражения, время боя и пр. type_arena = {width, length , amount_fighters ...} Массив черепашка должна получать от компьютера-судьи перед командой "Бой начался!" Так она будет знать, в какой режим боя она попала, сколько у нее товарищей (amount_fighters-1) , размеры и тип арены. Так как она стоит на спавне(для каждого типа арены есть спавн для каждого бойца, обозначенный снизу определенным типом блока) в стандартном положении, анализируя, например, цвет шерсти под собой и зная размеры арены, GPS координаты и определив направление, черепаха может сформировать в своем маленьком мозге таблицу карты, заполонить ее(таблицу) непроходимыми блоками по умолчанию. Ведь она пока не знает, что там, стена, пустота, сундук или еще что-то. В процессе разведки местности и постепенного продвижения к врагу участки карты в таблице заменяются на 0 - пустота, 1- стена, 2 - свой флаг, 30-пустой сундук, 31-сундук с углем, и прочее. Найдя сундук с углем, она проверяет(насколько позволяет ей размер своего инвентаря) количество угля в нем, берет себе сколько-то и орет своим мол, ребята, по таким-то координатам найден уголь, разбирай, пока враг не забрал. Допустим, черепашка, которая несется с флагом врага к себе на базу, такую инфу игнорирует, но записывает ее в стек, как вероятное действие после выполнения текущего более важного. То есть должна быть таблица последующих отложенных действий. Поступающую инфу в таблицу нужно вставлять в определенное место в зависимости от его важности и "веса", а выполнять с первого. Если стек действий пустой - исследуй карту, например. Также нужно подумать, как написать функцию генератор-действий, которая в фоне с какой-то вероятностью и периодичностью генерирует действия и принуждает черепашку начать что-то делать, или прекратить текущее не приоритетное действие и начать другое(как мысли у человека) Кстати, после определения своего места на арене и координат арены блоки-идентификаторы точки спавна можно выкинуть, и освободить тем самым инвентарь. А это до 5 мест в инвентаре! С картой нужно определиться скорее, так как от этого будет строиться дальнейшая логика битвы и всей программы. Очень буду рад любым мыслям и соображениям.
  24. Конкурсы скорее всего замедлят проект,так как они связаны с какими-то временными рамками. Поощрения и награды возможно выдавать в процессе непрерывной безостановочной работы над проектом. Вопросы, требующие решения, записал в шапке топика, список будет уточняться в процессе.
  25. Если хотите реально вникнуть в проект, неужели нет 20 мин глянуть видео внизу. Там все разжевал, и показал, не надо "многа букав читать", ребенку своему и то не так подробно объясняю. Я думал, народ читать не любит, а тут и видео уже смотреть влом. В видео четко рассказано как генерируется арена, кто ее генерирует, и знают ли про нее черепахи и игроки заранее.
×
×
  • Создать...