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

Лидеры


Популярный контент

Показан контент с высокой репутацией 16.06.2016 во всех областях

  1. 10 баллов
    На днях я рассказывал об интересном языке для OpenComputers (и не только). MoonScript Но одно дело - прочитать об языке где-то. А совсем другое - попробовать язык самому. Именно этим я и предлагаю заняться. Для разогрева, начнем с чего-нибудь несложного. Например "Угадай число". Думаю все знают эту игру. Компьютер загадывает число, мы пытаемся угадать. На каждую нашу попытку, компьютер злорадно сообщает - "больше!", "меньше!" или "у вас закончились попытки!" и "вы проиграли!". Немного модифицируем исходную идею, и перенесем ее на 2d поле. Просто, чтобы не было скучно. ТЗ Что нам потребуется? 1) Отрисовать сетку Тут мы просто возьмем текущий размер дисплея, и разметим его на клеточки. 2) Загадать число 3) Слушать команды пользователя Юзер будет тыкать на клеточки. Нам надо будет слушать эвент touch. 4) Обновлять игровое поле в ответ Собственно после тыка, будем открывать клетку. Если это не та клетка - рисовать на ней стрелочку. Если та - рисовать победный баннер. Если закончились ходы - рисовать что-нибудь обидное. За дело Первым делом надо подключить все, что мы будем использовать. В Lua обычно мы при помощи команды require пишем все в локальные переменные. В MoonScript все переменные по дефолту локальны. Поэтому использовать ключевое слово local нет необходимости. Для подключения же, используется ключевое слово import: import getResolution setForeground setBackground set fill from require('component').gpuimport pull from require 'event'import ceil, random from mathimport rep from string Мы вытащили из нужных библиотек нужные функции. Ничего лишнего. Теперь объявим переменные, которые будут использоваться в коде. - Размеры экранаwidth, height = getResolution()width /= 2 -- потому что по горизонтали наши клетки займут 2 символаheight -= 1 -- потому что внизу будет статус-- Цветаwhite = 0xFFFFFFblack = 0x000000gray = 0x222222green = 0x00BB33yellow = 0xFFC04Cred = 0xFF0000pink = 0xFF0074violet = 0xD600FFblue = 0x4E5AFFcyan = 0x4ED7FFteal = 0x00CC99-- Заготовка для сетки - один ряд клетокgrid_line = rep("▒▒ ", ceil(width / 2))-- Наша цельtarget = { x: 0, y: 0 }-- Количество попытокmaxAttemts = ceil(width * height / 150) -- 150 - магический коэффициент сложности, больше - сложнее, меньше - легчеattempts = maxAttemts Тут тоже присутствует несколько новых фич MoonScript. Во-первых - это сдвоенные операции. Конструкции a /= b или a -= b означают тоже самое, что a = a / b и a = a - b. Во-вторых это новый синтаксис создания таблиц. Названия полей и их значения отделены двоеточиями. (Такое обозначение будет знакомо тем, кто владеет JavaScript). Для реализации геймплея и отрисовки всякой всячины, потребуется определить несколько функций. Тут мы столкнемся еще с несколькими новшествами, по сравнению с Луа. Первое, в MoonScript нету ключевого слова end. Блоки кода обозначаются отступом разной величины. Так что вам придется тщательно следить за тем, на каком уровне вы пишете команды. (Это чертовски полезно, и вырабатывает красивый стиль написания кода =), а не эти кошмарные простыни, где нельзя разобрать начал и хвостов.) Второе, функции объявляются конструкцией вида (a, b, c) -> .... Тут слева - набор аргументов, потом стрелочка - разделитель и блок кода, который собственно является телом функции. -- Очищаем экранclear = () -> setForeground white setBackground black fill 1, 1, width * 2, height + 1, ' '-- Рисуем сеткуgrid = -> setForeground gray setBackground black for y = 1, height set (if y % 2 == 0 then 1 else 3), y, grid_line Пустой набор аргументов можно опустить, как в функции grid. Кроме того, как несложно заметить, MoonScript позволяет вызывать функции, не используя скобочки. Продолжим. -- Открываем одну клеткуsign = (x, y) -> if x == target.x and y == target.y then black, white, "[]" elseif x == target.x and y < target.y then white, green, "▼▼" -- по неведомой мне причине, стрелки вниз в новом шрифте ОС 1.6 нету =) elseif x == target.x and y > target.y then white, violet, "↑↑" elseif x < target.x and y < target.y then white, teal, "↘↘" elseif x < target.x and y == target.y then white, cyan, "→→" elseif x < target.x and y > target.y then white, blue, "↗↗" elseif x > target.x and y < target.y then white, yellow, "↙↙" elseif x > target.x and y == target.y then white, red, "←←" elseif x > target.x and y > target.y then white, pink, "↖↖"cell = (x, y) -> fore, back, text = sign x, y setForeground fore setBackground back set x * 2 - 1, y, text Здесь функция sign сконструирована так, чтобы отдавать три переменных разом. Следует заметить, что в MoonScript можно не пользоваться оператором return. Функция автоматически вернет значение последнего оператора в теле. Кроме функций, значения умеют возвращать и условия. Поэтому в данном случае, функция возвращает значение условия, а условие возвращает три значения из той ветки, которая выполнится. Функция cell просто берет эти значения и отрисовывает в нужном месте клетку. Далее. -- Рисуем статусstatus = (state) -> setForeground white setBackground black fill 1, height + 1, width * 2, height + 1, ' ' set 2, height + 1, "[Угадай, где клад!]" switch state when 'win' setForeground green set 24, height + 1, "Вы победили!" when 'lose' setForeground red set 24, height + 1, "Вы проиграли!" else set 24, height + 1, "Попыток осталось: #{attempts}" set width * 2 - 10, height + 1, "[R] [Q]" Здесь тоже используются две новые конструкции. Первая - это switch. Наверняка многие уже знакомы с ним. По сути, это просто удобный вариант длинных условий, со множеством elseif. Свитч получает значение, а потом сравнивает с ним все ветки when. Какая совпадет - та и выполнится. Вторая - это интерполяция строк. В строку в двойных кавычках можно встраивать значения перменных (или даже кусочки кода), используя диез и фигурные скобки, как в функции выше. Последние приготовления: -- Генерируем цельsetTarget = -> target = { x: random(1, width), y: random(1, height) }-- Инициализируем игруnewGame = -> attempts = maxAttemts setTarget! clear! grid! status! Функция newGame использует специальный синтаксис для вызова функции, которой не нужны аргументы. Вместо того, чтобы писать setTarget(), MoonScript советует использовать восклицательный знак. setTarget!. Это довольно весело смотрится в коде. =) Ну чтож, все готово. Давайте соберем все написанное, и запилим немного игровой логики! -- Поехали!newGame!while true -- Ждем события event, _, x, y = pull! -- Обрабатываем его switch event when 'touch' -- Если был клик -- Открываем клетку, если остались попытки if attempts > 0 x = ceil(x / 2) cell x, y attempts -= 1 -- Обновляем инфу if x == target.x and y == target.y attempts = 0 status('win') elseif attempts == 0 status('lose') else status! when 'key_down' switch x when 113 -- Q: выход из игры break when 114 -- R: перезапуск newGame!clear! Вуаля! Оно работает. И даже можно поиграть. И даже победить =) Круто, правда? Не надо делать такое выражение лица, я знаю что на самом деле, вы со мной согласны. =) А вы, да-да, вы! - на задних рядах, хватит кидаться тапками! Полный код игрушки доступен тут: http://pastebin.com/M0sxk1QH Enjoy!
  2. 1 балл
    Rust Не так давно появился язык программирования Rust. В этой записи я расскажу вам, чем так примечателен Rust (раст) и почему всем стоит на него переходить. На главной странице раста написано, что он – системный язык программирования, который работает быстро, предотвращает вылеты и гарантирует безопасность. Не стоит прямо сейчас закрывать страницу из-за непонятных слов. Сейчас во всем разберемся. Rust – системный ЯП Это значит что на нем можно писать программы любой сложности и их можно будет запустить везде, от тостера до компьютера Васи Пупкина, без необходимости скачивать интерпретаторы/виртуальные машины (как в случае с Java и Lua). Например, Си – системный, а Java – нет. :P Попробуйте написать на Java ядро ОС. У вас ничего не выйдет, так как что бы запустить Java нужна виртуальная машина (да-да, то самое "скачать жаву" это и есть "скачать виртуальную машину Java =) ) Совсем другое дело обстоит с Си. Например, следующий код можно запустить абсолютно на любом компьютере. int main() { int a = 1; a++; return 0;} Эквивалентный код на расте тоже будет работать везде. Вот он: fn main() { let mut a = 1; a += 1;} Эта фича позволит нам писать на расте программы любой сложности, от hello-world'ов, до операционных систем. Пойдем дальше. Rust – быстрый ЯП Раст – быстрый ЯП, и с этим не поспоришь. Он компилируется в машинный код что позволяет ему так быстро работать. Работает не хуже Си. Rust – безопасный ЯП Безопасность раста проявляется во всем. От I/O до потоков, от указателей до типов данных. В этом можно убедиться самому. Например следующий код на Си int main(){ int x = 10; int *px = &x; px = 0; *px = 3;} Вполне скомпилируется, но работать не будет. Программа с подобным кодом упадет. Дебаг таких программ всегда сложен. Аналогичный код на расте: fn main() { let ref mut p = 10; p = 0; *p = 3;} Компилироваться он не будет, следовательно программист заметит (скорее всего) ошибку и исправит ее. Убедитесь сами. Это не единственный пример такого поведения компилятора раста. Он всегда сообщит вам о небезопасности кода, чего не скажешь о других компиляторах. Из фич этого языка я бы выделил: "Бесплатные" абстракции. Когда в Java абстракции достигаются путем уменьшения качества выходного кода, в расте все бесплатно, как и в C++. Гарантированная безопасность. Когда в других языках гарантия безопасности обеспечивается программистом, в расте компилятор сам позаботится о безопасности кода. Он делает это всегда, но мы вполне можем попросить его не проверять код. Для этого используются unsafe блоки кода (поговорим еще о них). Многопоточность без гонок (англ. data-race). Все кто писал многопоточный код на языках вроде C++ или Java знают как не просто достигнуть безопасности таких потоков. В расте же такой код делается очень просто, сам убеждался не раз. Трэйты. Разработчики раста решили отказаться от стандартной концепции классов и интерфейсов. Но на расте вполне можно писать в объектном стиле (поговорим еще об этом). Все решать вам. Фич куда больше, это только малая часть. О самой работе с растом будет написано в следующей серии. =) Да Здравствует Rust!
  3. 1 балл
    Обновление OpenComputers до третьей беты 1.6. Сегодня в гостях у нас следующие изменения: Добавлено В русский мануал добавлена информация про saveConfiguration (PR #1855 от cyber01). Функция computer.getProgramLocations, которая используется для программы install из OpenOS. [*]Пофикшено Неожиданный баг с сохранением мира в версиях MC выше 1.8. [*]OpenOS Команда cat теперь будет читать stdin, если не указан файл. cp: поддержка путей вида /. и более мелкие фиксы. df теперь поддерживает относительные пути. Функция next либы /lib/guid.lua теперь возвращает GUID в корректном формате. head теперь закрывает stdin. install был сильно переработан и теперь с помощью этой программы можно устанавливать файлы с loot-дискет (и не только), мануал в man install. less теперь поддерживает скроллинг, в кои-то веки! Ну и алиас в /etc/profile был, конечно, убран. В mv добавлено несколько проверок: команда будет выдавать теперь ошибку, если путь назначения в режиме только для чтения или путь имени для копирования — точка монтирования. У rm была пофикшена проблема, при которой ссылки на директории не могли быть удалены. Шелл поддерживает экранировку пробелов и может отдавать сигнал SIGPIPE. А ещё позволяет использовать getWorkingDirectory до установки переменной окружения PWD. На момент писания этого текста в install был уже обнаружен один баг, который даже пофикшен, остаётся ждать принятия PR. Github
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...