Найти в Дзене

Создание электронных часов на Бейсике с помощью псевдографики

После того, как мы познакомились с основами Бейсика, можно приступать к практике, пытаясь создавать полезные (или не очень) интересные программки на каждый день. Сделать можно многое - при желании и наличии фантазии. Бейсик позволяет многое, если, конечно, углубиться в него по самые уши. В общем, достаточно лирики, давайте приступим. Пару лет назад ко мне пришла мысль, а что если попробовать сделать что-нибудь полезное, например, часы - чтобы постоянно были перед глазами на рабочем столе. Просто по работе часто нужно знать время, и пялишься в системный трей с его мелким шрифтом. А тут - большие, прямо на рабочем столе. Понятно, что в отдельном окошке, но все же более читабельно. Вот как это выглядит: Для того, чтобы реализовать подобное, нам понадобятся те знания, которые мы получили в уроках, а также нужно будет научиться работать с временем. Кроме того, в мы познакомимся с массивами (эта тема была сознательно опущена в основах, так как по нашему мнению с массивами нужно учиться работ
Оглавление

После того, как мы познакомились с основами Бейсика, можно приступать к практике, пытаясь создавать полезные (или не очень) интересные программки на каждый день. Сделать можно многое - при желании и наличии фантазии. Бейсик позволяет многое, если, конечно, углубиться в него по самые уши.

В общем, достаточно лирики, давайте приступим. Пару лет назад ко мне пришла мысль, а что если попробовать сделать что-нибудь полезное, например, часы - чтобы постоянно были перед глазами на рабочем столе. Просто по работе часто нужно знать время, и пялишься в системный трей с его мелким шрифтом. А тут - большие, прямо на рабочем столе. Понятно, что в отдельном окошке, но все же более читабельно. Вот как это выглядит:

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

Кроме того, в мы познакомимся с массивами (эта тема была сознательно опущена в основах, так как по нашему мнению с массивами нужно учиться работать в современных языках программирования, например, в Python). А еще поработаем немного с текстом. Ну, обо всем по порядку.

Учимся работать с временем

Для начала нам необходимо узнать текущее время. Иначе как мы сможем его выводить на экран? Делается это с помощью функции TIME$. Но просто так вызывать эту функцию нет смысла. Давайте результат ее выполнения положим в какую-нибудь переменную:

t$ = TIME$

Почему мы использовали переменную с $ ? Потому что результат представляет собой не число, а текстовую строку такого вида:

-2

Итак, мы видим, что у нас есть часы, минуты и секунды. То, что секунды в данном случае "00" - это просто совпадение. Вот тому доказательства:

-3

В общем, смысл нашей будущей программы в том, чтобы взять из значения переменной t$ отдельно часы, минуты и секунды и в режиме онлайн раз в одну секунду выводить их на экран.

Для начала попробуйте самостоятельно просто выводить на экран текущее время раз в секунду. Для этого вам нужно воспользоваться циклом WHILE, который будет работать до нажатия любой клавиши (пример использования см. в разработке игры "Виселица"). А в цикле уже запрашивать текущее время и выводить его на экран.

Для того, чтобы время выводилось раз в секунду, воспользуйтесь директивой SLEEP 1 (т.е. "спать 1 секунду"). Ее поместите тоже в цикл. Таким образом длительность одной итерации цикла будет занимать 1 секунду => на экран будет выводиться текущее время 1 раз в 1 сек.:

-4

Если смогли это реализовать, то теперь нам нужно научиться "расщеплять" время на составные части и отрисовать эти части как-нибудь покрасивее да побольше.

Для того, чтобы разделить время на составные части, мы воспользуемся функцией MID$. Надеюсь, вы выполнили все задания по работе с текстом и потому для вас не составит труда понять, что мы сделаем с помощью этого кода:

h1$ = MID$(t$, 1, 1)
h2$ = MID$(t$, 2, 1)
m1$ = MID$(t$, 4, 1)
m2$ = MID$(t$, 5, 1)
s1$ = MID$(t$, 7, 1)
s2$ = MID$(t$, 8, 1)

Вкратце: мы взяли 1 и 2 символ из переменной t$ (которая у нас имеет значение текущего времени в формате "hh:mm:ss") и поместили их, соответственно, в переменные h1$ и h2$. То же самое сделали с минутами и секундами, разделив все цифры отдельно.

У нас получилось 6 переменных, содержащих цифры от 0 до 9 в текстовом виде (потому что мы их получили из текста и не преобразовали в число).

Чтобы анализировать значения полученных переменных и отрисовывать красиво их значения, нам потребуется отдельно ко всем им обращаться по их названию. Это не есть хорошо. Правильнее сохранить эти значения не в отдельные переменные, а в массив. Потому что тогда мы сможем запустить цикл для перебора этих значений. Это упростит код и уменьшит его в объеме. Давайте научимся это делать.

Учимся работать с массивами

На самом деле все просто. Даже если вы еще ни разу с массивами не работали. Массив - это шкаф с ящиками, в которых могут лежать какие-то данные. В современных языках программирования в каждом отдельном ящике могут лежать разного типа данные, но в Бейсике - только одного типа. В нашем случае - текст. Нам нужно 6 ящиков: 2 для цифр часов, 2 для цифр минут, ну и 2 - для секунд. Почему мы не делим время на 3 ящика, а делим по цифрам? Поймете позже.

Итак, для того, чтобы создать массив в Бейсике из 6 элементов, содержащий текстовые значения, необходимо использовать такую запись:

DIM clock$(6)

Название массива clock - это наш выбор, т.к. оно говорит о том, что массив будет связан с часами. Но вы можете использовать любое другое название, если хотите.

Далее стоит знак $ - символ того, что содержимое будет текстом. А число 6 в скобках означает, что элементов в массиве будет всего шесть. Да, в Бейсике нужно явно указывать, сколько элементов будет в массиве.

Теперь, после того, как "шкаф" создан, можно приступать к заполнению его "ящиков". Заполнение происходит тоже очень просто. Для этого мы указываем номер элемента массива и говорим, чему он равен. Давайте это продемонстрируем на примере первого и второго элемента:

clock$(1) = MID$(t$, 1, 1)
clock$(2) = MID$(t$, 2, 1)

Остальные заполните сами.

Обратите внимание, что индекс первого элемента массива в Бейсике равен одному, а в современных языках программирования первый элемент всегда имеет индекс ноль.

После того, как мы поняли, что у элементов массива есть индексы, и это числа, можно переходить к автоматическому перебору этих элементов с помощью цикла. Давайте, к примеру, переберем все элементы и выведем их значение на экран:

FOR i=1 TO 6
PRINT clock$(i)
NEXT i

В результате на экран должно быть выведено 6 строк, на которых будут цифры текущего времени. Попробуйте.

Давайте немного видоизменим формат вывода. Выведем текущее время по центру экрана, причем часы, минуты и секунды пусть будут разного цвета. А разделителем между ними путь будет двоеточие - как и в оригинале. Смотрим код (показываем только вывод, цикл не используем, центровку на экране выполните самостоятельно с помощью LOCATE):

COLOR 4
PRINT clock$(1); clock$(2);
COLOR 7
PRINT ":";
COLOR 14
PRINT clock$(3); clock$(4);
COLOR 7
PRINT ":";
COLOR 10
PRINT clock$(5); clock$(6)

Разделитель мы сделали цветом по умолчанию - светло-серого. Точки с запятой, если помните, нужны для того, чтобы каждый следующий PRINT прилеплялся справа к предыдущему. Вот так это должно получиться:

-5

Теперь пробуйте организовать бесконечный цикл со сменой значений времени раз в секунду. Для того, чтобы время оставалось на своем месте и не смещалось от вновь появляющихся значений, воспользуйтесь командой очистки экрана CLS. Добавьте ее тоже в цикл. То есть, сначала вы очищаете экран от предыдущих значений, потом получаете новое значение текущего времени, потом отрисовываете его, потом ждете 1 секунду. И все по-новой. Пробуйте.

Используем псевдографику

Итак, по сути, мы уже имеем часы. Но текст мелковат. А так - все как надо. Теперь нужно научить программу красиво отрисовывать наши циферки. Но сначала давайте поговорим о том, почему же, все-таки, мы решили разделить время не на три, а на шесть частей.

К примеру, я хочу отрисовать какое-либо число. Ну, давайте что-нибудь возьмем. Пусть будет 23. Для этого я сочиняю код. Предположим, в высоту числа у нас будут занимать 7 строк, в ширину цифра будет 7 символов, плюс 2 символа между цифрами числа. В общем, 7 строк кода в лучшем случае. Сколько потребуется строк кода, чтобы отрисовать числа от "00" до "59"? Давайте посчитаем: 7 х 60 = 420 строк. Минимум.

А теперь давайте посчитаем, сколько потребуется строк кода, чтобы отрисовать цифры от 0 до 9. Получим 10 х 7 = 70. Мы предлагаем отрисовывать по цифрам, просто их располагать на правильных позициях. Тогда количество строк кода уменьшится в шесть (!) раз. Нам не нужно отрисовывать все числа, мы будем отрисовывать цифры чисел. Думаю, вы поняли.

Итак, вот пример отрисовки цифры 3 (вместо "Ы" можете подставить любой символ):

LOCATE 10, p
PRINT "ЫЫЫЫЫ"
LOCATE 11, p
PRINT " Ы"
LOCATE 12, p
PRINT " ЫЫЫЫ"
LOCATE 13, p
PRINT " Ы"
LOCATE 14, p
PRINT "ЫЫЫЫЫ"

Переменная p в LOCATE - это номер правильной позиции в строке - чтобы цифра рисовалась на правильном месте. Эти позиции вы должны сами установить или с помощью вычислений, или опытным путем. Для каждого цифро-места они будут свои.

Результат работы, точнее, скрин результата, мы привели в самом начале статьи. Попробуйте сделать также или лучше. Впечатлениями поделитесь в комментариях. Удачи!