Как написать игру для ZX Spectrum 1994 г.

Заставка - простейшие заставки.


2. ЗАСТАВКА

Заставок разного рода можно придумать великое множество. Все зависит от вашего опыта и фантазии, а также от того, черно-белый или цветной монитор (телевизор) имеется в вашем распоряжении. Можно выделить заставки, состоящие из одного кадра и заставки с двумя и более кадрами. В последнем случае возможна как автоматическая их смена по мере выполнения программы, так и смена после нажатия какой-либо клавиши.

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

Если ваш монитор позволяет получить достаточно резкое изображение, то вы можете заметить, что оно строится из отдельных точек, больше похожих на маленькие квадратики. Эти точки программисты называют пикселями. Символы, которые вы вводите с клавиатуры, вписываются в стандартные по размерам и положению площадки - знакоместа, причем размер каждого знакоместа - 8x8 пикселей. При разбивке рабочего экрана на знакоместа получается 24 строки и 32 столбца. Но в основном при написании программ на Бейсике используются только 22 верхние строки, называемые основным экраном. Оставшиеся две нижние строки имеют особое назначение: они используются для набора и редактирования строк программы, а иногда в них появляются различные сообщения. Эти две строки носят название служебное окно.

Вернемся теперь к нашим баранам и рассмотрим вначале простейшие заставки. Простейшие заставки

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

Пусть предполагаемая заставка имеет вид, показанный на рис. 2.2.

Для воплощения этой картинки на экране нужно записать координаты (номера строк Y и номера столбцов X) первых букв слов или предложений. Например, слово SANKT-PETERSBURG должно быть напечатано на заставке в первой строке, начиная с восьмой позиции по горизонтали, а слово CONTROLS - в 12-й строке, начиная с 5-й позиции по горизонтали. Проделав эту работу до конца, можно выбрать цвет каждой надписи, цвет фона экрана и цвет бордюра (будем считать, что вы работаете с цветным монитором).

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

1. Окрасить бордюр в синий цвет, установить синий фон экрана и желтый цвет надписей на нем.

2. Напечатать в 1-й строке экрана, начиная с 8-й позиции: SANKT-PETERSBURG.

3. Напечатать 24 пробела в 5-й строке экрана, начиная с позиции 4, закрасив их голубым цветом.

4. Напечатать в строке 6 с 4-й позиции красными буквами на голубом фоне:

E L E P H A N T

и один пробел черным цветом для создания эффекта тени.

5. В строке 7, начиная с позиции 4, напечатать 24 пробела голубым цветом и один - черным.

6. Вывести нижнюю границу тени: 24 пробела черным цветом в 8й строке, начиная с 5-й позиции.

7. Напечатать в строке 12 с позиции 5:

CONTROLS: UP......Q

8. В строке 14 с 18-й позиции напечатать:

DOWN....A

9. В строке 16 с 18-й позиции -

LEFT....0

10. В строке 18 с 18-й позиции -

RIGHT...P

11. В строке 20 с 18-й позиции -

FIRE....M

12. Напечатать в служебном окне (в самой нижней строке экрана) фиолетовым цветом фразу

PRESS ANY KEY TO CONTINUE

(нажмите любую клавишу для продолжения),

отступив от левого края экрана три знакоместа.

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

14. Очистить экран.

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

Наша программа начинается предложением «окрасить бордюр в синий цвет» Бордюр по-английски - BORDER, а цвет, как вы узнаете позже, гораздо удобнее задавать числом, нежели определять словом. Приведем таблицу кодировки цветов, принятую в ZX Spectrum:

0 - черный, 4 - зеленый,

1 - синий, 5 - голубой,

2 - красный, 6 - желтый,

3 - фиолетовый, 7 - белый.

Таким образом, синий бордюр можно получить, введя в программу оператор

BORDER 1

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

Цвет фона (или «бумаги») определяется цветом «выключенных» пикселей, а «включенные» пиксели задают цвет тона - «чернил». Предложение «установить синий фон экрана» переводится на Бейсик как

PAPER 1

а «установить желтый цвет надписей» - как

INK 6

Однако нужно помнить, что эти операторы, в отличие от BORDER, не вызывают немедленного изменения цвета экрана, они лишь задают цвета или иначе -атрибуты) для дальнейших действий. Изменение цвета станет заметно, например, после очистки экрана. Команда «очистить экран» на английский язык переводится как CLEAR SCREEN, а Бейсик понимает это предложение в сокращенном виде: CLS.

Итак, введем первую строку нашей программы, закончив ввод нажатием клавиши Enter. Строка будет выглядеть так:

10 BORDER 1: PAPER 1: INK 6: CLS

Обратите внимание на то, что в каждой строке Бейсика может быть несколько операторов, но в этом случае они должны отделяться они друг от друга двоеточием. Выбор номеров строк не имеет принципиального значения, но лучше начинать с 10-й строки и дальше использовать номера 20, 30, 40 и г. д. Это позволит при необходимости вставить в середину программы недостающие строки, не перенумеровывая остальных.

Теперь вслед за первой строкой программы нам нужно написать несколько строк, которые выводят на экран много разных надписей. Описывая план действий, мы использовали слово «напечатать» - по-английски PRINT. Так же выглядит и оператор, выводящий на экран всевозможные буквы, цифры, знаки препинания и прочие символы. Текст, который требуется напечатать, заключается в кавычки и следует за оператором PRINT. Например: PRINT "For example"

Если специально не указывать, в какое место экрана выводить текст, оператор PRINT начинает печатать его с так называемой текущей позиции печати, которая определяется предыдущими операторами. Так, после очистки экрана оператором CLS текущей становится позиция с координатами (0, 0), которым соответствует верхний левый угол экрана (нулевая строка, нулевой столбец).

Для того, чтобы напечатать текст в нужном месте, служит директива AT с номером строки и столбца, добавляемая к оператору PRINT. А между AT и текстом обязательно нужно ставить точку с запятой. Например, строка программы PRINT AT 10,8;"For example" напишет фразу For example в десятой строке, отступив от левого края экрана 8 знакомест. После выполнения этого оператора текущая позиция переместится на начало следующей строки экрана.

Исходя из сказанного, нетрудно догадаться, что вторая строка нашей программы должна иметь вид:

20 PRINT AT 1,8;"SANKT-PETERSBURG" Как вы заметили, оператор PRINT выводит надписи, не изменяя цвета экрана. Точнее, он печатает символы текущим цветом, а именно тем цветом, который был указан операторами PAPER и INK в начале программы. Как уже говорилось, эти операторы не изменяют цвет всего экрана, а влияют на выполнение последующих операторов, изменяющих вид экрана. Они оказывают действие, в частности, и на оператор PRINT. Учитывая это, следующую строку программы можно было бы реализовать следующим образом:

PAPER 5: PRINT AT 5,4;"ПППППППППППППППППППППППП" Но в этом случае нам пришлось бы часто изменять цвет фона для печати. Гораздо проще воспользоваться возможностью временного изменения цвета и не заботиться о необходимости его восстановления:

30 PRINT AT 5,4; PAPER 5;"ППППППППППППППППППППППП" Тогда голубым цветом будут напечатаны только те символы, которые следуют за данным оператором PRINT, а текущие атрибуты при этом не меняются. Еще нагляднее в этом плане следующая строка. Вместо 40 PAPER 5: INK 2: PRINT AT 6,4; "ППППЕ L E P H A N TППППП":PAPER 0: PRINT AT 6,28; " ": INK 6 можно написать

40 PRINT AT 6,4; PAPER 5; INK 2; "ППППE L E P H A N ТППППП"; PAPER 0;" " Аналогично пишутся и две следующие строки программы: 50 PRINT AT 7,4; PAPER 5;"ПППППППППППППППППППППППП"; PAPER 0;" "

60 PRINT AT 8,5; PAPER 0;"ПППППППППППППППППППППППП"

Дальнейшие строки печатают текст текущими цветами (синий фон, желтый тон), и ничего нового в них не встречается:

70 PRINT AT 12,5;"CONTRO LS:ППППUP......Q"

80 PRINT AT 14,18;"DOWN....A" 90 PRINT AT 16.18;"LEFT....O" 100 PRINT AT 18,18;"RIGHT...P" 110 PRINT AT 20,18;"FIRE....M"

Часто бывает так, что в поле основного экрана не хватает одной-единственной строки, и требуется что-то напечатать в строках служебного окна. Директива AT допускает использование номеров строк, не превышающих 21, иначе компьютер обидится и обругает вас нехорошими словами, например, Out of screen

или

Integer out of range

Выйти из положения можно, если после слова PRINT поставить #0 и далее -требуемый текст. Например: PRINT #0; "For example"

В такую строку можно вставлять операторы INK и PAPER.

Что же касается текущих атрибутов в служебном окне, то они зависят от цвета бордюра, а операторы INK и PAPER (взятые отдельно, без PRINT) не оказывают на них никакого влияния. Цвет фона в служебном окне тот же, что и цвет бордюра, а цвет тона - контрастный к цвету фона, то есть при черном, синем, красном или фиолетовом бордюре устанавливается белый тон, а при остальных цветах - черный.

Таким образом, строка

120 PRINT #0; INK 3;"ПППPRESS ANY KEY TO CONTINUE"

выведет в нижнюю строку экрана фиолетовым цветом фразу, заключенную в кавычках.

Чтобы зафиксировать на экране изображение заставки, нужно остановить выполнение программы после строки 120. Добиться этого можно несколькими способами, но самый простой основан на особенности оператора

PAUSE (пауза)

останавливающем выполнение программы на определенное время, исчисляемое в 50-х долях секунды. Например, оператор

PAUSE 50

даст задержку ровно в одну секунду. Особенность этого оператора заключается в том, что его действие может прекращаться при нажатии на любую клавишу, кроме Caps Shift и Symbol Shift. Если же в операторе PAUSE задать значение 0, то получится бесконечная пауза и программа будет ожидать нажатия любой клавиши, после чего перейдет к выполнению оператора, следующего за PAUSE.

Исходя из этого, следующая строка нашей программы может иметь вид: 130 PAUSE 0

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

140 CLS

Упомянем здесь еще об одном операторе - REM. Он позволяет программисту вносить в текст программы различные пометки - комментарии (например, поясняющие назначение отдельных частей программы). Все, что записано после REM и до конца строки, не влияет на выполнение программы, а только помогает программисту в последующей работе над ней.

Итак, нашей заставке соответствует программа:

Программа 1. ЗАСТАВКА 1.

10 BORDER 1: PAPER 1: INK 6: CLS

20 PRINT AT 1,8;"Sankt-Petersburg"

30 PRINT AT 5,4; PAPER 5;"ПППППППППППППППППППППППП"

40 PRINT AT 6,4; PAPER 5; INK 2;

"ППППE L E P H A N ^ПП^'; PAPER 0;" "

50 PRINT AT 7,4; PAPER 5; "ПППППППППППППППППППППППП";

PAPER 0;" "

60 PRINT AT 8,5; PAPER 0;"ППППППППППППППППППППППП"

70 PRINT AT 12,5; "CONTROLS:ППППUP.....Q"

80 PRINT AT 14,18;"DOWN....A"

90 PRINT AT 16,18;"LEFT....O"

100 PRINT AT 18,18;"RIGHT...P"

110 PRINT AT 20,18;"FIRE....M"

120 PRINT #0; INK 3;"ПППPRESS ANY KEY TO CONTINUE"

130 PAUSE 0

140 CLS

Запускается программа оператором RUN, который вводится непосредственно с клавиатуры, после чего нажимается клавиша Enter.

И вот работа над заставкой закончена. Вы смотрите на экран, не веря своим глазам: набор строк вдруг превратился в яркое красочное изображение. Если же в эту программу удастся внести что-то свое, ценность ее еще больше возрастет, и вам наверняка захочется записать ее на ленту. Наберите следующую строку: SAVE "ELEPHANT"

На экране появится надпись Start tape then press any key

напоминающая о том, что нужно включить магнитофон на запись и нажать любую клавишу.

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

LOAD ""

или

LOAD "ELEPHANT"

Если загрузка пройдет нормально, компьютер скажет

0:ОК

но программа не запустится: нужно выполнить еще оператор RUN.

Впрочем, программу можно записать на ленту и таким способом, что после загрузки она автоматически запустится (этот способ называется «запись с автостартом»). Для этого нужно выполнять оператор SAVE с ключевым словом LINE:

SAVE "ELEPHANT" LINE 10

Тогда после загрузки программа автоматически запустится со строки 10 и выведет на экран заставку.

Прежде чем перейти к следующей заставке, давайте отвлечемся от практики и немного поштудируем теорию.

К наиболее важным средствам программирования относятся так называемые циклы. Циклы могут быть организованы по-разному, но чаще всего для этого пользуются конструкциями типа FOR...NEXT. Попробуйте, например, набрать и выполнить такую программку: 10 FOR N=1 TO 5 STEP 1 20 PRINT "ZX Spectrum" 30 NEXT N

Компьютер напечатает на экране слово «ZX Spectrum» пять раз.

Циклы применяются в игровых программах очень часто, например, для перемещения объектов, плавного изменения различных характеристик (скажем, цвета), создания звуковых эффектов и т. д. Переменная, следующая за оператором FOR (в приведенном примере - переменная N), называется управляющей, а запись N=1 ТО 5 STEP 1 указывает, в каких пределах эта переменная будет изменяться (запись 1 ТО 5 означает, что переменная изменяется от 1 до 5 включительно) и с каким приращением, или иначе - шагом (STEP 1). Правда, в данном случае шаг можно было бы и не указывать, так как по умолчанию он принимается равным единице. Далее выполняются все операторы до оператора NEXT, который изменяет управляющую переменную на величину шага, и если она не превысила конечного значения (в нашем случае - 5), программа вновь переходит к выполнению оператора, следующего за FOR.

В приведенном примере переменная N указывает лишь на количество повторений, но ее можно использовать и внутри цикла: 10 FOR N=0 TO 21 20 PRINT AT N,0;"Line: ";N 30 NEXT N

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

Переменные вообще широко используются в программировании для описания любых изменяющихся величин (например, для определения координат перемещающихся по экрану объектов или подсчета очков, заработанных игроком), поэтому необходимо научиться правильно обращаться с ними. Прежде всего, переменную нужно определить, то есть присвоить ей какое-то значение. Словами это можно выразить так: «Пусть переменная А равна двум». В переводе на язык Бейсик это будет выглядеть как LET A=2

Изменить значение переменной можно с помощью того же оператора LET: LET A = A+7

Это означает, что к переменной А (которая равна 2) прибавляется число 7, а полученный результат (число 9) присваивается той же переменной А. Убедиться в этом можно, выполнив оператор

PRINT A

На экране появится число 9.

В Бейсике используются не только числовые, но и символьные переменные, с помощью которых можно обрабатывать любые последовательности символов -строки. Внешне символьная переменная отличается от числовой значком $, стоящим после ее имени, например, А$. Значение символьным переменным присваивается также с помощью оператора LET: LET A$="String"

В этом примере переменной А$ присваивается значение «String». Это можно проверить, выполнив

PRINT A$

На экране появится надпись String

В Бейсике вы можете пользоваться не только отдельными переменными, но и целыми списками изменяемых величин. Такие списки называются массивами.

Предположим, в вашей игрушке участвуют десять персонажей. Для описания координат всех десяти объектов вам понадобилось бы завести двадцать переменных (по две переменные на объект): Х1, Y1, Х2, Y2, ...Х10, Y10. Понятно, что это не слишком удобно. Гораздо проще завести два списка по десять элементов в каждом: Х(10) и Y(10), а затем выбирать требуемое значение, задавая только индекс (порядковый номер объекта). Но предварительно нужно объявить массив, иначе говоря, указать компьютеру размеры списка. Делает это оператор DIM:

DIM X(10): DIM Y(10)

Далее при помощи все того же оператора LET элементам массива присваиваются необходимые значения. Однако если писать LET X(1)=10: LET Y(1)=18 LET X(2)=8: LET Y(2)=20 LET X(10)=3: LET Y(10)=3 то удобства, о которых только что говорилось, будут весьма сомнительны. Избежать длинной цепочки присваиваний позволяют операторы DATA и READ.

Сначала в операторе DATA через запятую перечисляются значения для присваивания (данные), а затем они считываются из памяти оператором READ. В этом случае можно использовать цикл: 10 DIM X(10): DIM Y(10) 20 FOR N=1 ТО 10 30 READ X: READ Y 40 LET X(N)=X: LET Y(N)=Y 50 NEXT N

60 DATA 10,18,8,20,11,7,5,12,3,0,2,9,7,1,6,15,9,5,3,3 В строке 30 считывается пара значений X и Y из списка, приведенного в строке 60 после оператора DATA, а затем в строке 40 эти значения присваиваются N-м элементам массивов Х(10) и Y(10).

Можно поступить еще проще, заменив строки 30 и 40 на одну строку:

30 READ X(N): READ Y(N) или даже

30 READ X(N),Y(N)

Нужно заметить, что строки с оператором DATA могут располагаться в любом месте программы. Этот оператор не выполняется (как и оператор REM) и служит лишь для хранения данных.

После заполнения массива его элементы можно использовать в программе. Для примера выведем все значения массива на экран в два столбца, добавив к предыдущей программе строки: 100 FOR N=1 TO 10

110 PRINT "X(";N;") = ";X(N),"Y(";N;") = ";Y(N) 120 NEXT N

Обратите внимание на запятую в строке 110. Если в операторе PRINT встречается запятая, то текущая позиция печати перемещается на сере-

дину экрана или в начало следующей строки, в зависимости от того, в первой или во второй половине экрана был выведен последний символ.

Говоря о массивах, можно еще добавить, во-первых, что они, так же как и переменные, могут быть не только числовыми, но и символьными, а во-вторых, -что они могут иметь несколько измерений. Примером двухмерного массива может служить поле экрана, если мы зададим символьный массив DIM S$(22,32), который описывает 22 строки по 32 символа в каждой.

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

Предположим, что на экран необходимо вывести изображение, которое вы видите на рис. 2.3. Главное отличие этой заставки от предыдущей заключается в том, что информация о назначении клавиш последовательно появляется в специальной рамке. Время, отводимое на вывод сообщения о каждой клавише, ограничено, и мы видим постоянно сменяющие друг друга надписи: Q - UP А - DOWN О - LEFT P - RIGHT M - FIRE E - END

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

Начнем с того, что окрасим экран в черный цвет (фон) и выберем для надписей зеленые «чернила» (тон), как мы это делали в предыдущей программе: 10 BORDER 0: PAPER 0: INK 4: CLS Затем обведем основной экран двойной рамкой, как показано на рисунке. Для изображения линий в Бейсике служит оператор DRAW (по-английски «чертить»). Попробуйте, например, выполнить оператор DRAW 50,100

От нижнего левого угла экрана протянется линия, причем ее длина по горизонтали составит 50 пикселей, а по вертикали - 100. Теперь очистите экран командой CLS или просто нажав Enter и выполните строчку: DRAW 50,100: DRAW 50, 100 На экране появится рисунок, похожий на букву Л. Следовательно, оператор DRAW вычерчивает линию от последней поставленной точки. Поэтому прежде, чем рисовать первую линию на экране, нужно поставить точку, от которой протянется отрезок прямой. Точки ставит оператор PLOT, после которого через запятую указываются координаты экрана: сначала по горизонтали, затем по вертикали. Последующие линии можно рисовать, как показано в предыдущем примере, от конца уже проведенной.

Итак, началом координат для операторов PLOT и DRAW служит нижний левый угол основного экрана (две нижние строки служебного окна при графических построениях не используются). Точки и линии не привязываются к знакоместам и могут рисоваться в любом месте, поэтому измерение здесь ведется в пикселях. В строке

20 PLOT 0,0: DRAW 0,175: DRAW 255,0: DRAW 0,-175: DRAW -255,0 сначала ставится начальная точка в левый нижний угол основного экрана (PLOT 0,0), затем от этой точки проводится вертикальная линия вверх до верхней границы экрана (DRAW 0,175), потом от конца предыдущей линии чертится горизонтальный отрезок до правой границы экрана (DRAW 255,0), а операторы DRAW 0,-175 и DRAW -255,0 замыкают рамку. Аналогично рисуется и внутренняя рамка. 30 PLOT 2,2: DRAW 0,171: DRAW 251,0: DRAW 0,-171: DRAW -251,0 После этого внутри рамки делаем надписи в соответствии с рисунком: 40 PRINT AT 4,9; INK 2;"S О К O - В А N" 50 INK 6: PRINT AT 9,5;"SANKT-PETERSBURGППП1993" 60 PRINT AT 11,7;"AUTHOR: Ivanov Ivan"

70 PRINT AT 20,3; INK 5; "PRESS ANY ^ППТО CONTINUE" Далее устанавливаем синие «чернила» и вычерчиваем маленькую рамку, в которой будут появляться надписи о назначении клавиш:

80 INK 1

90 PLOT 40,45: DRAW 0,14: DRAW 175,0: DRAW 0,-14: DRAW -175,0 Теперь начинается самое интересное. Зададим двухмерный символьный массив, состоящий из шести строк (по количеству выводимых надписей) по девять символов в каждой (максимальная длина надписей), и в цикле заполним его из списка DATA:

100 DIM P$(6,9) 110 FOR N=1 TO 6 120 READ P$(N) 130 NEXT N 110 DATA " Q - UP","A - DOWN",^ - LEFT","P - RIGHT", "M - FIRE"," E - END" Затем начнем последовательно выводить в маленькой рамке надписи из созданного массива. Нам нужно сделать шесть надписей, поэтому организуем цикл, повторяющийся шесть раз, в котором управляющая переменная изменяется от 1 до 6, чтобы можно было последовательно обращаться к строкам массива с первой по шестую:

150 FOR N=1 TO 6 250 NEXT N

Что же у нас будет твориться внутри этого цикла? Можно поступить по-разному, но мы сделаем так: каждую надпись будем выводить новым цветом, и не сразу, а по одной букве. Причем и цвет, и очередную букву выберем случайным образом. Для получения случайного числа в Бейсике используется специальная функция RND. Она генерирует случайные числа в диапазоне от нуля до единицы (но всегда меньше 1). Попробуйте в качестве опыта выполнить такую строку: FOR N=1 ТО 20: PRINT RND: NEXT N На экране появится столбик чисел, изменяющихся без видимой закономерности. Если вы еще раз выполните приведенную строку, числа окажутся совершенно другими. Чтобы получить случайное число из заданного диапазона, воспользуемся следующей формулой: R = min + RND*(max-min)

где min - нижняя, a max - верхняя граница диапазона. Например, случайное число от 5 до 12 можно получить с помощью строки:

LET R=5+RND*7

Однако функция RND далеко не всегда дает целые числа, а в нашей задаче числа должны быть именно целыми. Округлить полученное число до ближайшего меньшего целого поможет другая функция Бейсика - INT. В случае положительных чисел INT отбрасывает дробную часть числа, оставляя целую.

Теперь применим все вышесказанное к нашей заставке. Будем печатать надписи цветом от красного (код 2) до белого (код 7). Случайное число от 2 до 7 получится в результате вычисления такого выражения: 2+RND*(7-2)

Но нам еще нужно это число округлить. Если отбросить целую часть, то числа 7 мы никогда не получим, так как результат всегда будет хоть чуть-чуть, но меньше семи. Поэтому нужно написать так:

INT (2+RND*(8-2)) А применительно к цвету «чернил»:

160 INK INT (2+RND*6)

Эта строка, кроме всего прочего, демонстрирует преимущества числового, а не «словесного» задания цвета.

Покончив с цветом, перейдем теперь к надписям. Чтобы они появлялись постепенно, по одной букве, напишем еще один цикл и «вложим» его в уже описанный. Так как строки массива состоят из девяти символов, повторим цикл

девять раз:

170 FOR M=1 ТО 9 210 NEXT И Внутри этого цикла сначала определим порядковый номер очередной выводимой буквы и запомним его в переменной А: 180 LET A=INT (1+RND*9) Вся надпись у нас должна располагаться в строке 15 экрана, начиная с 12-й позиции. Следовательно, буква с номером А должна быть напечатана в позиции 11+А:

200 PRINT AT 15,11+А; P$(N,A) Запись P$(N,A) указывает на букву с номером А из строки N (управляющая переменная внешнего цикла) массива Р$(6,9).

Поскольку число А случайное, то не обязательно все буквы строки P$(N) будут напечатаны. Чтобы в конце концов фраза оказалась полной, после завершения внутреннего цикла на экран выводятся все символы строки: 220 PRINT AT 15,12; P$(N) Теперь нужно остановить на время выполнение программы, чтобы успеть прочитать появившийся текст. Строка 230 PAUSE 100

даст задержку в две секунды (100:50 = 2). После этого сотрем надпись, напечатав поверх нее 9 пробелов:

240 PRINT AT 15,12;"ППППППППП" После окончания цикла его нужно повторять снова и снова до тех пор, пока не будет нажата какая-нибудь клавиша. Перейти на начало цикла очень просто. Для этого допишем строку: 260 GO TO 150

которая переводится на русский язык как «перейти к строке 150», то есть к строке, с которой начинается цикл печати надписей в маленькой рамке.

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

190 IF INKEY$<>"" THEN GO TO 300 которая означает: «если символ нажатой клавиши не равен пустой строке (то есть нажата любая клавиша), то перейти к строке 300». Более подробно оператор IF...THEN, называемый условным, а также функцию INKEY$ мы рассмотрим позже, а пока ограничимся сказанным. Если же вам уже и так все понятно - тем лучше, значит вас как программиста ждет блестящее будущее. Теперь приведем «собранный» текст полученной программы:

Программа 2. ЗАСТАВКА 2.

10 BORDER 0: PAPER 0: INK 4: CLS

20 PLOT 0,0: DRAW 0,175: DRAW 255,0: DRAW 0,-175: DRAW -255,0

30 PLOT 2,2: DRAW 0,171: DRAW 251,0: DRAW 0,-171: DRAW -251,0

40 PRINT AT 4,9; INK 2;"S O K O - B A N"

50 INK 6: PRINT AT 9,5;"SANKT-PETERSBURGППП1993"

60 PRINT AT 11,7;"AUTHOR: Ivanov Ivan"

70 PRINT AT 20,3; INK 5; "PRESS ANY ^ППТО CONTINUE"

80 INK 1

90 PLOT 40,45: DRAW 0,14: DRAW 175,0: DRAW 0,-14: DRAW -175,0

100 DIM P$(6,9)

110 FOR N=1 TO 6

120 READ P$(N)

130 NEXT N

140 DATA " Q - UP","A - DOWN","O - LEFT","P - RIGHT", "M - FIRE"," E - END"

150 FOR N=1 TO 6

160 LET C=INT (2+RND*6)

170 FOR M=1 TO 9

180 LET A=INT (1+RND*8)

190 IF INKEY$<>"" THEN GO TO 300

200 PRINT AT 15,11+A; INK C;P$(N,A)

210 NEXT M

220 PRINT AT 15,12; INK C;P$(N)

230 PAUSE 100

240 PRINT AT 15,12;"ППППППППП"

250 NEXT N

260 GO TO 150

300 CLS




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Письмо №302 - Вологодская обл, Сокольский р-н, г Сокол
CODING - Intro в 256 байт?
Извращенцам - Красная Шапочка (народный фольклор).
Вступление - Привет, тебе читатель!
Лит.Страничка - Красный Винни (глава 2,3).

В этот день...   21 ноября