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

Программа для 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

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


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

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

Ну, для начала пройдемся по ошибкам: во-первых, как я понял, тебе требуется софтина, выдающая редстоун-сигнал в том случае, если игрок провел карточкой с паролем "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

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


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

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

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

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


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

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

 

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

 

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

 

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

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

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


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

 

 

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

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

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

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


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

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

 

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

 

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

 

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

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

 

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

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

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


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

Я могу, конечно, написать эту программульку, но лучше и правда нарисовать блок-схему — или иным образом представить алгоритм графически. 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, но это уже штрихи мелкие.

 

 

 

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

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


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

Я могу, конечно, написать эту программульку, но лучше и правда нарисовать блок-схему — или иным образом представить алгоритм графически. 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, но это уже штрихи мелкие.

 

 

 

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

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

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


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

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

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


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