Назад к списку статей

Программы на BASIC.



         Рассмотрим несколько простых примеров на Basic-е. Хотя  размер и небольшой, каждая  является законченной программой. Я старался, чтобы каждая из них выполняла что то полезное, или обладала элементом развлекательности.
        Мне приходилось видеть множество программ, но если экземпляр был интересным, то он обычно был очень большой и сложный для понимания. Если программа была маленькой то обычно она демонстрировала какой то вычислительный алгоритм или метод расчета и была очень скучной. Приведенные примеры, на мой взгляд, лишены указанных недостатков. Любая из них может быть заведена в среду программирования за 10 - 15 минут. Попробуйте что то изменить, внесите в процесс программирования элемент творчества. В этом случае вы более осознанно оцените возможности программы и ее функциональность.
        Все программы опробованы в среде программирования QBasic, хотя в других бейсиках тоже должны работать. Я сознательно не использовал в них механизм процедур, так как в этом случае их универсальность теряется.
        Итак, начнем.

            ЛОХОТРОН.

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

CLS
RANDOMIZE (TIMER)
LOCATE 10, 20: PRINT "УГАДАЙ ГДЕ ШАРИК?"
A = 99 * RND(1)
IF A <= 33 THEN B = 1 ELSE IF A > 66 THEN B = 3 ELSE B = 2
LOCATE 11, 20: PRINT " _ _ _ "
LOCATE 12, 20: PRINT "/ \ / \ / \"
LOCATE 13, 20: PRINT " 1 2 3"
INPUT "ВВЕДИ НОМЕР СТАКАНА ", C
IF C = B THEN PRINT "УГАДАЛ! МОЛОДЕЦ!" ELSE PRINT "НЕ УГАДАЛ! НЕПОВЕЗЛО!"
LOCATE 11, 20: PRINT " "
LOCATE 12, 20: PRINT "\_/ \_/ \_/ "
LOCATE 12, 17 + 4 * B: PRINT "O"

  Для целостности программы ее разбор описан ниже.
    CLS чистит экран.
    Затем генератор случайных чисел перенастраивается числом секунд прошедших с полуночи, а это значит, что генератор гарантированно будет вырабатывать случайные числа.
    Выводим заголовок программы, а заодно и подсказку, что требуется от того, кто программу запустил.
    Получаем случайное число A в диапазоне от 0 до 99. И в зависимости от того число попало в диапазон до 33, между 33 и 66 или больше 66 выбираем номер стакана в который попал шарик.
    Дальше выводим исходную позицию: 3 стаканчика вверх дном для этого три строчки с оператором LOCATE и PRINT.
    Затем просим ввести номер стакана, в котором, как предполагает угадывающий находится шарик.
    Сравнив номер введенного стакана с тем в котором спрятан шарик, поздравляем или огорчаем испытателя судьбы.
    И, наконец, выводим стаканчики в нормальном положении дном вниз с шариком в одном из них.

                КАПЕЛЬ.

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

        Комментарии из программы можно исключить, если набирать ее вручную.

REM ПРОГРАММА КАПЕЛЬ
CLS: N = 10 : REM Количество букв-капель которые мы пока не поймали
PRINT "Включи русскую раскладку. Будут падать буквы вводи их."
PRINT "Если готов нажми клавишу"
REM Пустой цикл ожидания нажатия любой клавиши
DO: LOOP WHILE INKEY$ = ""
REM Цикл общего количества букв, которые нужно будет поймать, нажав клавишу.
FOR K = 1 TO 10
CLS : RANDOMIZE (TIMER) : REM Очистка и настройка генератора случайных чисел.
RUS:
REM Получение случайного числа, которое будет преобразовано в букву.
A = INT(300 * RND)
REM Если буква вне диапазона русских заглавных то загадать число еще раз.
IF A < 128 OR A > 159 THEN GOTO RUS
REM Получение символа из числа
C$ = CHR$(A)
REM Выбор вертикали по которой будет падать буква
V = RND * 75
REM Цикл падения буквы
FOR I = 1 TO 24
REM поместить ее на верхнюю строчку для I=1 а потом все ниже и ниже
LOCATE I, V: PRINT C$
FOR J = 1 TO 15000: REM Цикл отлова нажатой клавиши.
REM ФАКТИЧЕСКИ НАСТРОЙКА СКОРОСТИ ПАДЕНИЯ БУКВЫ
Q$ = INKEY$: REM Поместить в переменную Q символ нажатой клавиши
REM Если введенный символ совпал, очистить экран
REM Уменьшить кол-во пропущенных букв. Перейти к получению следующей буквы.
IF UCASE$(Q$) = C$ THEN CLS : N = N - 1: GOTO SLED
REM Цикл отлова вводимых с клавиатуры букв.
NEXT J
REM Стереть букву на этой строке для подготовки ее рисования на следующей.
LOCATE I, V: PRINT " "
REM Цикл перемещения буквы вниз
NEXT I
REM Метка, куда переходит программа в случае если буква введена правильно.
SLED:
REM Цикл выбора следующей буквы, а всего их 10.
NEXT K
REM Показать сколько капель пропущено.
LOCATE 5, 10: PRINT "Пропущено капель: "; N

СТРЕЛОЧНЫЕ ЧАСЫ.

       А вот еще одно творение. Существует множество программ, которые рисуют на экране цифровые часы. Я и сам их писал, и даже несколько модификаций: на Паскале и VB. Но вот мне попались в какой то книжке стрелочные часы. Завел я этот исходник, получились какие то малюсенькие часики. Попытался я ее модифицировать, но после двух попыток, как сказал один известный комбинатор плюнул на это дело слюной. Сел и минут за 20 написал свои.
        Посмотрите на код: он открыт до безобразия. Можете, используя его вычислительный алгоритм, сделать какие угодно часы на каком угодно языке программирования.

REM Включение графического режима
SCREEN 7
REM Проинициализируем начальные точки стрелок, хотя в BASIC это необязательно XS=0:YS=0:XM=0:YM=0:XCH=0:YCH=0
REM Читаем системное время
VREM$ = TIME$
REM Определяем, который сейчас час
Chas = VAL(MID$(VREM$, 1, 2))
REM А если больше 12, то высчитываем насколько больше
IF Chas > 12 THEN Chas = Chas - 12
REM Теперь смотрим, сколько минут прошло с начала часа
Min = VAL(MID$(VREM$, 4, 2))
REM Теперь секунд и превращаем строчку времени в цифры: часы, минуты, секунды
sek = VAL(MID$(VREM$, 7, 2))
REM Нанесение меток часов - 12 штук
FOR I = 0 TO 360 STEP 30
REM Вычисление координат X и Y меток, переводя при этом градусы в радианы
X = 95 * SIN(I / 180 * 3.14)
Y = 95 * COS(I / 180 * 3.14)
REM Учитывая, что исходная точка в левом верхнем углу, да к тому же
REM экран монитора не квадратный, рисуем эти точки
PSET (150 + X, 100 - Y)
NEXT
REM Показ часов, цикл до нажатия клавиши
DO
REM Берем количество секунд, прошедших после полуночи, и добавляем секунду
T = TIMER + 1
REM Ждем пока эта секунда пройдет
Z: IF T > TIMER GOTO Z
REM Ура прошла, добавляем к тем, что уже было еще одну
sek = sek + 1
REM Смотрим если их больше 60, прибавляем минуту, а секунды превращаем в 1
IF sek > 60 THEN sek = 1: Min = Min + 1
REM Теперь уже проверяем количество минут, и делаем то же с часом
IF Min > 60 THEN Chas = Chas + 1
REM Ну и, наконец, с часами, если их больше 12
IF Chas > 12 THEN Chas = 0: sek = 1: Min = 0
REM Выключаем цвет COLOR 0
REM И рисуем черные стрелки по текущим координатам,
REM чтобы затереть их старое положение
LINE (150, 100)-(150 + XS, 100 - YS)
LINE (150, 100)-(150 + XM, 100 - YM)
LINE (150, 100)-(150 + XCH, 100 - YCH)
REM Вычисляем новые положения концов стрелок для секундной, минутной и часовой
XS = 90 * SIN(sek * 6 / 180 * 3.14)
YS = 90 * COS(sek * 6 / 180 * 3.14)
XM = 80 * SIN(Min * 6 / 180 * 3.14)
YM = 80 * COS(Min * 6 / 180 * 3.14)
XCH = 60 * SIN((Chas * 30 + (Min \ 2)) / 180 * 3.14)
YCH = 60 * COS((Chas * 30 + (Min \ 2)) / 180 * 3.14)
REM Включаем цвет, свой для каждой стрелки
COLOR 1
REM Рисуем стрелки из центра в точки, согласно вычисленным координатам
LINE (150, 100)-(150 + XS, 100 - YS)
COLOR 5
LINE (150, 100)-(150 + XM, 100 - YM)
COLOR 7
LINE (150, 100)-(150 + XCH, 100 - YCH)
REM Если никакая клавиша не нажата, цикл показа часов повторяется.
LOOP WHILE INKEY$ = ""

        МИНЕР

Еще пример. Нет таких компьютерщиков, которые бы не играли в минера. Есть такая игра: тыкаешь мышью в квадратики, предварительно подумав, конечно, а программа показывает не попал ли на мину и сколько рядом. Моя программа это просто показ, как устроен и для чего может использоваться двумерный массив: матрица. На этом фоне вы пытаетесь определить, куда компьютер запрятал мину на поле 4x4. В этой программе непаханное поле для ее улучшения и модернизации.
        Хотите ставьте несколько мин, запускайте поиск пока не найдете, выводите подсказку на каком от указанной клетки мина и так далее.
        Хотя здесь и так все ясно, не буду изменять правилу, а оно таково: я все разъясняю очень подробно, кому неинтересно, есть сотни других сайтов о программировании. На этом все для начинающих.
Как часто на уроках информатики, составляя программу для решения задачи вместе с учениками, я слышу подсказки тех, кто уже уловил ее смысл. Но, почему то, на следующем уроке при выполнении самостоятельного  задания по аналогичной тематике вдруг возникают ЗАТРУДНЕНИЯ. А это говорит о том, что даже если тебе в программе все ясно, то это еще не означает, что ты сам сможешь сделать что-то похожее.

REM Очистим экран и перенастроим генератор случайных чисел
CLS : RANDOMIZE TIMER
REM Рассказ о том, что здесь происходит
PRINT "КОМПЬЮТЕР СПРЯТАЛ МИНУ НА ПОЛЕ 4X4"
REM Определим переменную - массив
DIM M(4, 4)
REM Определение координат мины
X = INT(RND * 3 + 1)
Y = INT(RND * 3 + 1)
REM Прячем ее на поле, извините, помещаем в массив
M(X, Y) = 1
REM Просим попытаться угадать, где она спрятана, запросив координаты X и Y
INPUT "УКАЖИ КООРДИНАТЫ X,Y"; X, Y
REM Проверяем, найдена мина или нет
IF M(X, Y) = 1 THEN PRINT "УГАДАЛ": GOTO T
REM Это просто такой способ перехода, можно было бы написать и через ELSE
PRINT "НЕ УГАДАЛ"
REM Метка, куда переходят если угадали
T: REM А мину то все равно нужно показать,
REM что бы никто не думал, что его обманули. Вывод матрицы на экран.
FOR I = 1 TO 4
FOR J = 1 TO 4
PRINT M(I, J); " ";
NEXT J
PRINT
NEXT I

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