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