Перейти к публикации
Форум - ComputerCraft
  • 0
FelixBanan

OpenSecurity Программа для MagReader'a. Криво работает

Вопрос

local com = require'component'
local pull = require'event'.pull
local rs = com.redstone
local sides = require("sides")
local pass = "govno"

 
while true do
local eventType, _, _, key_code = pull()
if eventType == "key_down" and key_code == 28 then
break
ass = 0
type,_,_,data,_,_ = pull()
if type == "magData" then
ass = 1
else
ass = 0
if h == 1 then
if data == pass then
rs.setOutput(1,15)
rs.setOutput(1,0)
os.sleep(2)
else
rs.setOutput(0,15)
os.sleep(1)
rs.setOutput(0,0)
end
end
end
end
end

Криво работает. Редстоун начинает пульсировать не с первого раза как проведу карточкой. Не понимаю из за чего это

Изменено пользователем felixpimp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

Ну, для начала пройдемся по ошибкам: во-первых, как я понял, тебе требуется софтина, выдающая редстоун-сигнал в том случае, если игрок провел карточкой с паролем "govno", а также с возможностью закрытия по нажатию клавиши Enter. Если так, то вовсе необязательно вызывать event.pull() множество раз друг за другом в надежде на чудо, достаточно единожды ждать какого-либо события, а затем уже анализировать его данные. Лично мне удобнее всего заносить данные события в таблицу (массив), а затем уже выбирать из нее нужные значения:

local eventData = { event.pull() }
if eventData[1] == "touch" then
  ...
elseif eventData[1] == "key_down" then
  ...
end

Во-вторых, в случае валидности пароля на карте, ты используешь следующее:

rs.setOutput(1, 15)
rs.setOutput(1, 0)
os.sleep(2)

Вполне логично, что редстоун-сигнал выдастся буквально на пару игровых тиков (чего недостаточно для открытия, скажем, двери), а затем немедленно потухнет, после чего компьютер будет "спать" 2 секунды. Кроме того, ты уже подключил в коде библиотеку sides, предоставляющую user-friendly таблицу с индексами сторон, поэтому логичнее будет реализовать эту запись следующим образом:

rs.setOutput(sides.up, 15)
os.sleep(2)
rs.setOutput(sides.up, 0)

И в-третьих, как сказали товарищи выше, твой код нечитабелен от слова "совсем". Неужели так сложно нажать клавишу табуляции (или пробела) пару-тройку раз и не создавать "магических переменных" перед публикацией на форум?

Ну ладн, не буду выеживаться особо, держи рабочую версию софтины. Но вообще чет как-то мда(

local component = require("component")
local event = require("event")
local sides = require("sides")
local redstone = component.redstone

local password = "govno"

while true do
  local eventData = { event.pull() }
  if eventData[1] == "magData" then
    if eventData[4] == password then
      redstone.setOutput(sides.up, 15)
      os.sleep(2)
    end
    redstone.setOutput(sides.up, 0)
  elseif eventData[1] == "key_down" and eventData[4] == 28 then
    break
  end
end
  • Like 6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

форматирование где?

local com = require'component'
local pull = require'event'.pull
local rs = com.redstone
local sides = require("sides")
local pass = "govno"


while true do
  local eventType, _, _, key_code = pull()
  if eventType == "key_down" and key_code == 28 then
    break
    ass = 0
    type,_,_,data,_,_ = pull()
    if type == "magData" then
      ass = 1
    else
      ass = 0
      if h == 1 then
        if data == pass then
          rs.setOutput(1,15)
          rs.setOutput(1,0)
          os.sleep(2)
        else
          rs.setOutput(0,15)
          os.sleep(1)
          rs.setOutput(0,0)
        end
      end
    end
  end
end

Где инициализируеться h?

Изменено пользователем NEO

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Переменная со... странным именем не используется — зачем она в коде? В каком магическом ритуале она участвует?

 

Отступов нет — ну хоть не в однострочник код записан, спасибо.

 

У тебя жесточайше криво построена логика программы. Посмотри-то на алгоритм свой (блок-схему нарисуй, если непонятно). На строке 9 ты принимаешь любой ивент — однако дальше код пойдёт, только если ты нажал на клавишу с кодом 28 (иначе первый if завершится, и снова выполнение вернётся к началу цикла). Однако в ифе break. Он, вообще-то, прерывает цикл и выкидывает выполнение на инструкцию сразу после него. Код внутри цикла после break выполняться не будет.

 

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

Изменено пользователем Fingercomp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

 

 

форматирование где?

Где инициализируется h?

ошибочка. h это ass

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Переменная со... странным именем не используется — зачем она в коде? В каком магическом ритуале она участвует?

 

Отступов нет — ну хоть не в однострочник код записан, спасибо.

 

У тебя жесточайше криво построена логика программы. Посмотри-то на алгоритм свой (блок-схему нарисуй, если непонятно). На строке 9 ты принимаешь любой ивент — однако дальше код пойдёт, только если ты нажал на клавишу с кодом 28 (иначе первый if завершится, и снова выполнение вернётся к началу цикла). Однако в ифе break. Он, вообще-то, прерывает цикл и выкидывает выполнение на инструкцию сразу после него. Код внутри цикла после break выполняться не будет.

 

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

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

 

вот я и прошу чтобы помогли с кодом

Изменено пользователем eu_tomat

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Я могу, конечно, написать эту программульку, но лучше и правда нарисовать блок-схему — или иным образом представить алгоритм графически. Lua — язык императивный, поэтому код будет примерно соответствовать нарисованному. Если никак не получится — смотри спойлер.

 

 

 

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

 

local com = require("component")
local event = require("event")
local rs = com.redstone
local sides = require("sides")
local pass = "sample password"

while true do
  local evt, _, _, arg = event.pull()
  if evt == "key_down" and arg == 28 then
    break
  elseif evt == "magData" then
    if arg == pass then
      rs.setOutput(sides.top, 15)
      os.sleep(2)
      rs.setOutput(sides.top, 0)
    else
      rs.setOutput(sides.bottom, 15)
      os.sleep(1)
      rs.setOutput(sides.bottom, 0)
    end
  end
end

 

Я бы ещё вместо event.pull использовал event.pullMultiple, но это уже штрихи мелкие.

 

 

 

А, и да. В одно сообщение влезали несколько цитат (год назад точно, как минимум), так что мультипостить необязательно. И их ещё можно изменить. Но это мелочи и к топику отношения не имеет.

  • Like 4

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Я могу, конечно, написать эту программульку, но лучше и правда нарисовать блок-схему — или иным образом представить алгоритм графически. Lua — язык императивный, поэтому код будет примерно соответствовать нарисованному. Если никак не получится — смотри спойлер.

 

 

 

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

local com = require("component")
local event = require("event")
local rs = com.redstone
local sides = require("sides")
local pass = "sample password"

while true do
  local evt, _, _, arg = event.pull()
  if evt == "key_down" and arg == 28 then
    break
  elseif evt == "magData" then
    if arg == pass then
      rs.setOutput(sides.top, 15)
      os.sleep(2)
      rs.setOutput(sides.top, 0)
    else
      rs.setOutput(sides.bottom, 15)
      os.sleep(1)
      rs.setOutput(sides.bottom, 0)
    end
  end
end

Я бы ещё вместо event.pull использовал event.pullMultiple, но это уже штрихи мелкие.

 

 

 

А, и да. В одно сообщение влезали несколько цитат (год назад точно, как минимум), так что мультипостить необязательно. И их ещё можно изменить. Но это мелочи и к топику отношения не имеет.

Спасибо вроде-бы вкурил в чем проблемы были. Буду теперь пытаться нормально код писать, а то самому не понятно

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
Буду теперь пытаться нормально код писать...

главное его в форматер  запихивай перед тем, как запихивать в пост. Ищешь в меню нашего сайта Сервисы->Луа->Форматер, копипастишь туда свой код и нажимаешь кнопку "бьютифай", потом его копипастишь в пост. Вот такой вот, на первый взгляд, и не очень простой, но архиважный магический ритуал, который крайне, подчеркиваю, крайне необходимо выполнить, если код любишь писать без отступов. Этим действием ты спасешь многих людей от всяких расстройств психических и неописуемых бед. :)

  • Like 4

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×