ComputerCraft/Кодовый замок

Модификация ComputerCraft добавляет в игру такие полезные предметы, как компьютер, «черепашки», экраны и много прочего. На компьютерах стоит операционная система CraftOS. Программы для устройств пишутся на простом, но довольно мощном языке программирования Lua. С ним быстро освоятся люди, знающие Паскаль, Basic или другие похожие языки.

## Кодовый замок

Давайте разберемся, как пишется программа для кодового замка. Кому не интересно, вы можете просто скопировать код и вставить его в файл «startup». Для начала нам надо скрафтить сам компьютер:

Ингредиенты | Процесс |
---|---|

Камень + Красная пыль + Стеклянная панель |


Также можно использовать продвинутый компьютер. Далее мы ставим компьютер около двери и включаем его правой кнопкой мыши. Чтобы программа замка была программой по умолчанию, мы будем записывать её в файл «startup». Для этого в консоли пишем команду

`edit startup`


Открывается окно редактора кода. Вот код нашей программы:

os.pullEvent = os.pullEventRaw while true do term.clear() term.setCursorPos(1, 1) print("Enter password!") write("password: ") pwd = read("*") if pwd == "1452" then print("Open.") rs.setOutput("left", true) sleep(3) rs.setOutput("left", false) if "kill" then print("Close. Clear...") rs.setOutput("right", true) sleep(2) rs.setOutput("right", false) else print("Access denied.") sleep(2) end end end

Строка | Описание | Комментарий |
---|---|---|

os.pullEvent = os.pullEventRaw | Это не даёт возможность обойти защиту, прервав выполнение программы с помощью удерживания клавиш Ctrl+T.
|
При подобных действиях иногда стоит сохранять старую функцию, например, так:
os.pullEvent = os.pullEventRaw |

`while true do`
|
Бесконечный цикл. | С бесконечными циклами следует обращаться осторожно, выход из них — только по break. |

`term.clear()`
|
Очистка экрана | Эти две функции в более сложных программах имеет смысл объединять в одну. |

`term.setCursorPos(1, 1)`
|
Установка курсора в верхний левый угол экрана. | |

`print("Enter your password, please!")`
|
Сначала на экране появится данный текст. | — |

`write("Password: ")`
|
После слова Password будут вводиться вводимые символы. | Не обязательно. |

pwd = read("*") | Делает ввод строки и записывает её в pwd, при этом заменяя все введённые символы звёздочками. | — |

if pwd == "password" then | Если введена строка «password», то… | Пароль может быть любым. |

`print("Live granted.")`
|
«Проход разрешён.» | — |

`rs.setOutput("left", true)`
|
… подаётся положительный сигнал красного камня влево… | rs.имяФункции — сокращённая запись redstone.имяФункции. В данном примере дверь находится слева от консоли. |

`sleep(3)`
|
… через 3 секунды… | 3 — задержка в секундах. |

`rs.setOutput("left", false)`
|
… сигнал прекращает подаваться. | — |

if pwd == "kill" then | Если введена строка «kill», то… | — |

`print("Death granted.")`
|
«Убить находящегося.» | — |

`rs.setOutput("right", true)`
|
… подаётся положительный сигнал красного камня вправо… | rs.имяФункции — сокращённая запись redstone.имяФункции. В данном примере дверь находится слева от консоли. |

`sleep(2)`
|
… через 2 секунды… | — |

`rs.setOutput("right", false)`
|
… сигнал прекращает подаваться. | — |

`else`
|
Если введено что-то ещё… | — |

`print("Access denied.")`
|
«Доступ отменён.» | — |

`sleep(2)`
|
Задержка текста на два тикета (на две секунды) | Можно поставить на (1), но желательно на (2) и больше. |

`end`
|
Конец ветвления. | Для определения количества end проще использовать форматирование «лесенкой». |

`end`
|
Конец цикла. | Если количество end будет больше, чем нужно, будет выдана ошибка «<eof> expected». Если меньше, то другая. |


## Завершение создания

Для сохранения нажимаем клавишу Ctrl и выбираем пункт Save. После этого перезагружаем компьютер удерживанием сочетания клавиш Ctrl+R в течение 1 секунды. Смотрим результат. По желанию возможно добавить пароль «Администратора» для редактирования паролей и/или программы.