Программирование на языке BASIC 1990 г.

Глава 15,16,17 - дополнительные сведения об операторах PRINT и INPUT. Цвета. Графика.


Глава 15
                   Дополнительные сведения об
                    операторах PRINT и INPUT
Краткое содержание: CLS, PRINT - параметры: отсутствие вообще,
                    выражение (числовое или строковое);
                    TAB числовое выражение, AT числовое  выражение,
                    PRINT разделители:",",";","'",
                    INPUT - параметры,
                    LINE строчная переменная,
                    SCREEN$ - свертка
    Выражение,  значение которых используются в операторе  PRINT,
называются PRINT-параметрами, они разделяются запятыми или точкой
с запятой, называемыми PRINT-разделителями.
    В операторе PRINT возможно отсутствие некоторых парамемров, в
этом случае ставятся две запятые подряд.
                       PRINT AT 11,16;"*"
выведет '*' в середине экрана.
                     AT 'строка', 'столбец'
этот  параметр  перемещает позицию вывода в  место,  определяемое
номером строки и столбца, номер строки меняется от 0 (верхняя)  до
21, а номер столбца от 0 (левый) до 31,
    Оператор SKREEN$, его действие противоположно действию опера-
тора PRINT AT, он использует те же параметры, номер строки и
столбца но их значения закрываются в скобки.
Оператор  SCREEN$ сообщает вам какой символ находится на экране в
указанной позиции. Выполнив: PRINT SCREEN$ (11,16)
мы получим '*' выведенную предыдущим оператором.
    В качестве возвращаемого значения могут использоваться  алфа-
витно-цифровые символы, специальные символы, пробелы, линии,
нарисованные с помощью операторов: PLOT, DRAW, CIRCLE, определяе-
мые пользователем символы и графические символы, возвращаемые как
пустая строка.
То же, когда функция OVER используется для получения комбинирова-
нных знаков.
   TAB 'столбец'
Этот  параметр перемещает позиции вывода в указанный столбец в той
же строке, или переходит на новую строку, если столбец был послед-
ним.
    Помните что компьютер уменьшает номер позиции по модулю 32
(т.е. делит на 32 и использует остаток). Так 'TAB 33' равнознач-
но 'TAB 1'. К примеру:
PRINT TAB 30,1;TAB12;"CONTENTS";AT 3,1;"CHAPTER"; TAB 24;" PAGE"
выведет на экран оглавление для первой страницы книги.
Рассмотрим пример иллюстрирующий уменьшение по модулю 32:
                        10 FOR N=0 TO 20
                        20 PRIN TAB 8*N;N
                        30 NEXT N
    Более наглядный пример получается при замене в строке 20  '8'
на '6'. Несколько замечаний:
1)  В рассмотренных примерах в качестве ограничителей использова-
    лось';', можно использовать ',' (или вообще ничего)
    при этом необходимо следить за установкой текущей позиции .
2)  Нельзя использовать для вывода две нижние строки экрана  т.к.
    они используются для получения оператором INPUT данных, последняя
    используемая строка - 21.
3)  Можно использовать параметр ат для установки позиции вывода  в
    то место, где уже имеется выведенная информация, при этом каждый
    новый символ уничтожает старый.
    Еще  одним оператором используемым совместно с PRINT  является
CLS, он производит очистку экрана подобно операторам CLEAR и 9.
    При  заполнении всего экрана происходит его свертка,  в  этом
можно убедится проделав:
              CLS: FOR N=1 TO 22: PRINT N: NEXT N
и  далее выполнить 'PRINT 99' некоторое количество раз,  или  ва-
риант с остановом вывода, для просмотра текста, чтобы убедиться в
этом выполним:
              CLS: FOR N=1 TO 100: PRINT N: NEXT N
Kогда экран заполнится, вывод остановится и в нижней чисти экрана
появится запрос: "SCROLL Y", после просмотра нажмите "Y" (да)
вывод прдолжится, возможен отрицательный ответ 'N' (нет)
(SYMBOL SHIFT и A ) или SPACE (BREAK), в последнем случае компью-
тер остановит программу и выдаст сообщение: 'D BREAK-CONT REP?
    Оператор INPUT используется для ввода различных значений,
например:
              INPUT "NO" OLO ARE YOU?", AGE
компьютер выведет на экран (в нижней части) вопрос,  в ответ на
который вы должны ввести свой возраст.
Фактически INPUT содержит те же параметры, что и PRINT, так "HOOLD
ARE  YOU?" и "AGE" оба являются параметрами INPUT,  однако  суще-
ствуют и некоторые отличия.
    Первое: это дополнительный параметр-переменная значение кото-
рой вы должны присвоить (в нашем примере 'AGE')
    Второе:  вы  можете выводить значение переменной,  как  часть
запроса, заключив ее для этого в скобки.
пример:
           LET MY AGE=INT(RND*100):
           INPUT("I AM, MU AGE;",');"HOW OLD ARE YOU?, YOUR AGE
Значение  'MY AGE' выдает компьютер,  значение 'YOUR AGE' вводите
вы  сами,  по  мере выдачи операторов  INPUT  происходит  свертка
экрана, рассмотрим пример использования 'AT' в INPUT операторе:
           10  INPUT "THIS IS LINE 1",  A$;AT 0,0;" THIS LINE  IS
               0", A$; AT 2,0;" THIS IS LINE 2", A$;AT 1,0;
               "THIS IS STILL LINE 1"A$
когда  "THIS  IS  LINE 2" будет выведено,  нижние  строки  станут
сдвигаться вверх, освобождая место для нумерации .
    Выполним:
      10 FOR N=0 TO 19: PRINT AT N,0;N;NEXT N
      20 INPUT AT 0,0;A$;AT 1,0;A$;AT 2,0;A$;AT 3,0;A$;AT 4,0;A$
 Когда информация начнет смещаться в область действия операторов
PRINT произойдет свертка экрана. Еще одним параметром  оператора
INPUT является LINE,  он предназначен для ввода строчных пере-
менных, рассмотрим пример:
                INPUT LINE A$
Если ввести какую либо строчную переменную без строковых кавычек,
то  ее  значение будет присвоено а$,  заметим,  что мы  не  можем
использовать параметр LINE для числовых переменных.
    Управляющие  символы CHR$22 и CHR$23 выполняют функции подоб-
ные параметрам TAB и AT.
Их  преимущество  состоит  в том  что  можно  использовать  имена
переменных, а для TAB и AT это невозможно, эти управляющие симво-
лы  обрабатываются  как числа.  Аналогом AT является  управляющий
символ CHR$22, первое значение определяет строку, второе столбец:
                 PRINT CHR$22+CHR$1+CHR$C
то же что и      PRINT AT 1,с;
как значения параметров рассматриваются только CHR$1 и CHR$C
(CHR$22 не учитывается).
    Аналогом  TAB является управляющий  символ  CHR$23,  значения
задаваемых им параметров находятся в пределах от 0 до 65535
                 PRINT CHR$23+CHR$A+CHR$B
то же, что и     PRINT TAB A+256*B
    Вы можете использовать POKE для остановки компьютера,
запрашивающего свертку, выполнив:
                POKE 23692,255
компьютер  станет сворачивать экран без запроса 255  раз, прежде-
чем запросит свертку, так например запустите:
                       10 FOR N=0 TO 10000
                       20 PRINT N: POKE 23692,255
                       30 NEXT N
и следите сколько сверток сделал компьютер.
Стартуем следующую программу проверяющую знание таблицы умножения
                      10 LET A$= " "
                      20 LET A=INT(RND*12)+1;LET B=INT(RND*12)+1
                      30 INPUT(A$)' ' WHAT IS";(A);"*";(B);"?";C
                     100 IF C=A*B THEN LET A$="RIGHT": GO TO 20
                     110 LET A$="WRONG, TRU AGAIN,": GO TO 30
Можно  несколько  изменить программу,  так чтобы не  зная  ответа
можно  было  узнать его,  к примеру компьютер спрашивает  сколько
будет  2*3,  не зная ответа вы вводите 2*3 и получаете  его,  для
этого замените в 30 строке 'C' на 'C$',  в 100 строке на 'VAL C$'
и дополнительно введите строку:
                       40 IF C$< > STR$ VAL C$ THEN LET N$= "TYPE
                          IT PROPERLU, AZNUMBER,": GO TO
для исключения подсказки поменяйте 'C$' в строке 30 на 'LINE C$'
Глава 16
                            Ц В Е Т А
Краткое содержание: INK,PAPER,FLASH,BRIGHT,INVERSE,OVER,BORD
    Выполним следующую программу:
                    10 FOR M=0 TO 1: BRIGHT M
                    20 FOR N=1 TO 10
                    30 FOR C=0 TO 7
                    40 PAPER C:PRINT"";REM 4 COLOURED SPACES
                    50 NEXT C. NEXT N: NEXT M
                    60 FOR C=0 TO 1: BRIGHT M: PAPER 7
                    70 FOR C=0 TO 3
                    80 INK C:PRINTC;"    ";
                    90 NEXT C:PAPER 0
                   100 FOR C=4 TO 7
                   110 INK C: PRINT C"    ";
                   120 NEXT C:NEXT M
                   130 PAPER 7: INK 0: BRIGHT 0
Она продемонстрирует вам возможности вывода компьютером ZX  SPEC
TRUM  на цветной телевизор восьми цветов (включая черный и белый)
и двух уровней яркости,  если телевизор черно-белый,  вы  увидите
различные градAции серого цвета.
    Ниже дана кодировка цветов:
                            0-черный
                            1-синий
                            2-красный
                            3-фиолетовый
                            4-зеленый
                            5-голубой
                            6-желтый
                            7-белый
для  черно-белого телевизора этот ряд представляет собой последо-
вательность перехода серых полутонов от черного до белого.
    Для использования цветов уясним строение графического экрана.
Он состоит из 768 позиций (24 строки по 32 знакоместа), каждыя из
которых представляет из себя матрицу 5 на 8 пикселей, вспомним
                          0-белая точка
                          1-черная точка
позиция  символа (знакоместо) также рассматривается с этих  пози-
ций:  INK-цвет тона,  PAPER-цвет фона. т.о. знакоместо состоит из
INK  и PAPER (рисунок на бумаге),  можно также говорить о  INK  и
PAPER  обычной и повышенной яркости,  а также мерцающих и  немер-
цающих знакоместах. Все это имеет кодировку:
    1) для знакоместа ( 8 на 8 пикселей) форму символа определяют
чистые и закрашенные точки( 0 и 1 ), цвета фона и тона определяют-
ся PAPER и INK;
    2) цвета фона и тона кодируются от 0 до 7 каждый;
    3) яркость:  0 - обычная,   1 - повышенная;
    4) мерцание: 0 - постоянно, 1 - мерцание.
Заметим,  что  для  одного  знакоместа в 64 пикселя мы  не  можем
установить более одного цвета для фона и одного цвета для тона.
это  же относится и к яркости,  и к  мерцанию,  цвет,  яркость  и
мерцание  задаются для знакоместа (а не для отдельного пикселя) и
являются его атрибутами, для изменения этих атрибутов предназнач-
ены операторы COLOR, BRIGHT, FLASH.
Выполним:
          PAPER 5
на экране будет голубой фон (т.к. 5 - код голубого цвета).
    Формат операторов:
          PAPER  число от 0 до 7
          INK    число от 0 до 7
          BRIGHT число 0 или 1 (0-выкл. 1-вкл.)
          FLASH  число 0 или 1 (0-выкл. 1-вкл.)
Отметим  что использование чисел больших,  чем  указывалось  выше
допустимо, но дает другой эффект.
К примеру '8' может использоваться во всех четырех операторах как
средство,  позволяющее  определить  значение ранее  устанобленных
атрибутов.  Так  PAPER 8 не изменит цвета фона (т.к. такого цвета
нет),  а поможет выяснить значение предыдущего  PAPER.  операторы
INK 8, BRIGHT 8, FLASH 8 выдадут значения этих атрибутов.
"9"  может  использоваться только для INK и PAPER,  как  средство
"контраста", цвета INK и PAPER которые вы используете должны быть
контрастны друг другу, так к белому цвету подходят темные тона:
черный,  синий,  красный,  фиолетовый;  к черному цвету  подходят
светлые тона: зеленый, голубой, желтый, белый.
           INK 9: FOR C=0 TO 7: PAPER C: PRINT C: NEXT C
Mожно запустить программу выдающую на экран дисплея цветные поло-
сы:
   INK 9:PAPER 6:PRINT AT 0,0;:FOR N=1 TO 1000:PRINT N;:NEXT N
Цвет фона будет контрастен цвету тона в каждой выводимой позиции.
Цветной телевизор построен на способности человеческого глаза
воспринимать только три первичных цвета: синий, красный, зеленый.
Другие  цвета образуются из их сочетаний,  к примеру,  фиолетовый
цвет образуется, как комбинация синего с красным (код фиолетового
цвета '3', он является суммой кодов синего '1' и красного '2').
Увидеть все восемь цветов на одном участке экрана невозможно  т.к.
это будет темное пятно,  но там, где цвета частично накладываются
друг  на  друга  мы увидим цветовую  гамму,  в  качестве  примера
выполним  программу ( отметим,  что INK получена с использованием
SHIFT и 8 в G-режиме):
          10 BORDER 0:PAPER 0: INK 7: CLS
          20 FOR A=1 TO 6
          30 PRINT TAB 6; INK 1;" ()()...()()":REM 18 INK SQUARES
          40 NEXT A
          50 LET DATALINE=200
          60 GO SUB 1000
          70 LET DATALINE=210
          80 GO SUB 1000
          90 STOP
          200 DATA 2,3,7,5,4
          210 DATA 2,2,6,4,4
         1000 FOR A=1 TO 6
         1010 RESTORE DATALINE
         1020 FOR B=1 TO5
         1030 READ C: PRINT INK C; "()...()";: REM 6 INK SQUARES
         1040 NEXT B: PRINT :NEXT A
         1050 RETURN
Существует  функция ATTP,  позволяющая определить какие  атрибуты
были заданы для позиций экрана.  Это сложная функция, и она будет
рассмотрена в конце главы.
Операторы:  INVERSE  и CVER не управляют атрибутами,  но  тем  не
менее определяют способ вывода на экран, в этих операторах исполь-
зуется значения параметров '0' и '1', если вы дадите:
          INVERSE 1,
то  выводимый  символ  изменит свою обычную форму (  вывод  будет
осуществляться в неготивном изображении).
В  обычном виде мы пишем черным по белому,  в инверсном белым  по
чернму.
    Оператор : OVER 1
устанавливает  режим расширенного вывода,  в обычном  режиме  при
выводе символа на знакоместо, так стирается все выведенное ранее
при расширенном выводе можно накладывать символы друг на друга.
Это позволяет выводить составные символы,  например стилизованные
тексты.
     Программа для вывода готического шрифта:
                10 OVER 1
                20 FOR N=1 TO 32
                30 PRINT "O"; CHR$8;"""";
                40 NEXT N
определим, что управляющий символ CHR$8 возвращает на одну позицию.
    Возможен еще один способ использования INK и PAPER, их можно
вводить  как параметры PRINT,  точно так же можно использовать  и
другие операторы рассмотренные в этой главе,  отметив в этом  что
их действие распространяется только до конца PRINT. В примере:
            PRINT PAPER 8; "X";: PRINT"Y"
только 'X' будет выведен на желтый фон.
INK и другие операторы не действуют в нижней части экрана,  пред
назначенной для ввода команд и INPUT-данных, для изменения цветов
в этой части экрана стужит оператор: BORDER  'цвет'.
Кодировка цветов прежняя, возможны мерцания и повышенная яркость.
для   этого   используйте  соответствующие  параметры   в   INPUT
(наподобие PRINT), эти параметры действуют до конца оператора или
до тех пор пока запрашиваемые данные не будут введены.
Выполним:
         INPUT FLASH 1; INK 1; "WNAT IS YOUR NUMBER ?";N
    Возможно  изменение цветов и с помощью управляющих  символов,
подобных управляющим символам для AT и TAB в главе 15.
                    CHR$16 соответствует INK
                    CHR$17   ----//----  PAPER
                    CHR$18   ----//----  FLASH
                    CHR$19   ----//----  BRIGHT
                    CHR$20   ----//----  INVERSE
                    CHR$21   ----//----  OVER
@l@@P                              - 54 -
Ъ-------------------В-------------------В----------------------ї
?    (K),(L),(G)    ?        (G)        ?          (E)         ?
Г-----В------В------Е---------В---------Е-------В-------В------?
? нет ?SYMBOL? CAPS ?   нет   ?  любой  ?  нет  ?  CAPS ? SYMB ?
Г-----Е------Е------Е---------Е---------Е-------Е-------Е------?
?     ?      ?      ?    **** ?****     ?  фон  ?  тон  ? DEF  ?
?  1  ?   1  ? EDIT ?    **** ?****     ?голубой?голубой?      ?
?     ?      ?      ?         ?******** ?       ?       ?      ?
?     ?      ?      ?         ?******** ?       ?       ?      ?
Г-----Е------Е------Е---------Е---------Е-------Е-------Е------?
?     ?      ? CAPS ? ****    ?    **** ?       ?       ?      ?
?  2  ?   @  ? LOCK ? ****    ?    **** ?  фон  ?  тон  ?  FN  ?
?     ?      ?      ?         ?******** ?красный?красный?      ?
?     ?      ?      ?         ?******** ?       ?       ?      ?
Г-----Е------Е------Е---------Е---------Е-------Е-------Е------?
?     ?      ? TRUE ?******** ?         ?  фон  ?  тон  ?      ?
?  3  ?   *  ?VIDEO ?******** ?         ?фиолето?фиолето?  LIN ?
?     ?      ?      ?         ?******** ?  вый  ?  вый  ?      ?
?     ?      ?      ?         ?******** ?       ?       ?      ?
Г-----Е------Е------Е---------Е---------Е-------Е-------Е------?
?     ?      ?INVENS?         ?******** ?       ?       ?      ?
?  4  ?   $  ? VIDEO?         ?******** ?  фон  ?  тон  ?      ?
?     ?      ?      ?    **** ?****     ?зеленый?зеленый?  OPE ?
?     ?      ?      ?    **** ?****     ?       ?       ?      ?
Г-----Е------Е------Е---------Е---------Е-------Е-------Е------?
?     ?      ?курсор?    **** ?****     ?       ?       ?      ?
?  5  ?   %  ?влево ?    **** ?****     ?  фон  ?  тон  ? CLOS ?
?     ?      ?      ?    **** ?****     ? синий ? синий ?      ?
?     ?      ?      ?    **** ?****     ?       ?       ?      ?
Г-----Е------Е------Е---------Е---------Е-------Е-------Е------?
?     ?      ?курсор?****     ?    **** ?       ?       ?      ?
?  6  ?   &  ? вниз ?****     ?    **** ?  фон  ?  тон  ?  MOV ?
?     ?      ?      ?     ****?****     ?желтый ?желт   ?      ?
?     ?      ?      ?     ****?****     ?       ?       ?      ?
Г-----Е------Е------Е---------Е---------Е-------Е-------Е------?
?     ?      ?курсор?******** ?         ?       ?       ?      ?
?  7  ?   ,  ? вверх?******** ?         ?  фон  ?  тон  ? ERAS ?
?     ?      ?      ?     ****?****     ? белый ? белый ?      ?
?     ?      ?      ?     ****?****     ?       ?       ?      ?
Г-----Е------Е------Е---------Е---------Е-------Е-------Е------?
?     ?      ?курсор?         ?******** ?       ?       ?      ?
?  8  ?   (  ?вправо?         ?******** ?нормал.?нормал.?POINT ?
?     ?      ?      ?         ?******** ?яркость?мерцан.?      ?
?     ?      ?      ?         ?******** ?       ?       ?      ?
Г-----Е------Е------Е---------Е---------Е-------Е-------Е------?
?     ?      ?графич?графическ?графическ? повыш.?   с   ? CAT  ?
?  9  ?   )  ? режим?  выход  ?  выход  ?яркость?мерцан.?      ?
?     ?      ?      ?         ?         ?       ?       ?      ?
Г-----Е------Е------Е---------Е---------Е-------Е-------Е------?
?     ?      ?      ?         ?         ?  фон  ?закраш.?      ?
? 10  ?   -  ?DELETE?  DELETE ?  DELETE ? черный?черный ?FORMAT?
?     ?      ?      ?         ?         ?       ?       ?      ?
А-----Б------Б------Б---------Б---------Б-------Б-------Б------Щ
так                 PRINT CHR$16+CHR$9;
то же, что и        PRINT INK 9;
Можно пользоваться либо управляющими символами, либо операторами.
Их можно ставить как после номера строки, так и в конце строки.
Для удобства можно пользоваться в расширенном режиме (E) цифрами.
Цифры от 0 до 7 устанавливают цвет INK, если CAPS SHIFT нажата, и
цвет  PAPER,  если не нажата,  если нажать цифру в  E-режиме,  то
будут  выведены  CHR$17 и CHR$ код цвета,  если в это время  была
нажата CAPS SHIFT, TO будут выведены: CHR$16 и CHR$ Kод цвета.
Если вы захотите уничтожить вводимое, нажмите DELETE два раза,
после  первого раза на экране высветится знак вопроса,  или  что-
нибудь еще, не пугайтесь и нажмите DELETE еще раз, управление
курсором тоже не работает обычным способом до тех пор пока курсор
не выйдет к предыдущему управляющему символу.
     Действие в расширенном режиме (E);
                  8 дает CHR$19 и CHR$0 - нормальная яркость
                  9 дает CHR$19 и CHR$1 - повышенная яркость
     CAPS SHIFT с 8 дает CHR$18 и CHR$0 - не мерцающее
     CAPS SHIFT с 9 дает CHR$18 и CHR$1 - мерцающее
    В (L)- режиме:
     CAPS SHIFT с 3 дает CHR$20 и CHR$0 - обычный вывод
     CAPS SHIFT с 4 дает CHR$20 и CHR$1 - инверсный (негативный) вывод
    Функция ATTR имеет следующий формат:
            ATTR ('строка',' столбец')
Значения  двух параметров функции подобно значению  параметров  в
AT, в результате выполнения будут выведены значения атрибутов для
соответствующей  позиции экрана,  выводимый результат это  число,
представляющее сумму четырех чисел:
     1) 128-если знакоместо мерцающее, 0-если обычное
     2)  64-если повышенная яркость,   0-если обычная
     3)   8* код цвета фона
     4)      код цвета тона
Пример:  знакоместо мерцающее, обычной яркости, желтый фон, синий
         тон     128+0+(8*6)+1=177
    Проверим это выполнив:
PRINT AT 0,0;FLASH 1;PAPER 6; INK 1; " "; ATTR(0аторы: INK, PAPE
    1)   PRINT "B"; CHR$8;OVER 1;"/";
Здесь "/" перечеркивает "B", этим способом можно вывожить слова
комбинированных знаков на ZX SPEKTRUM: два фона или два тона дают
фон,  один  из  них дает тон,  это интересное свойство,  если  вы
повторите вывод одного символа дважды, то он не будет отображен.
    Так если дать:
            PRINT CHR$8;OVER 1;"/"
дополнительно к описанному выше утверждению , то мы  в результате
увидим  'B' не перечеркнутое '/', так ли это?
    2) Выполним:  PAPER 0; INK 0
Действуют ли эти операторы в нижней части экрана?
Что мы увидим если добавить:    BORDER 0?
    3) Выполним программу:
               10 POKE 22527+RND*704,RND*127
               20 GO TO 10
Результатом программы явится смена цветов знакомест, распределен-
ных по экрану случайным образом, возможно вы увидите смену цветов
на диагональных  ступенях, это является следствием  того  что  мы
пользуеся квазислучайным распределением, которое лишь приближенно
воспроизводит случайное распределение.
    Введем в ручную,  или с помощью оператора LOAD программу  для
шахматных фигур из главы 14,  и введем программу разбивки  экрана
под шахматную доску:
              5 REM DRAW BLANKBOARD
             10 LET BB=1; LET BW=2; REM RED AND BLUE FOR BOARD
             15 PAPER BW:INK BB: CLS
             20 PLOT 79, 128: REM BORDER
             30 DRAW 65,0 DRAW 0,-65
             40 DRAW-65,0: DRAW 0,65
             50 PAPER BB
             60 REM BOARD
             70 FOR N=0 TO 3: FOR M=0 TO 3
             80 PRINT AT 6+2*N,11+2*M; " "
             90 PRINT AT 7+2*N,10+2*M; " "
            100 NEXT M: NEXT N
            110 PAPER 8
            120 LET PW=6:LET PB=5:REM COLOURS OF WHITE AND BLA
                PIECES
            200 DIM B$(8,8):REM POSITIONS OF PIECES
            205 REM SET AP INITIAL POSITION
            210 LET B$(1)="RNBQKBNR":REM LITTLE LINE 240
            220 LET B$(2)="PPPPPPPP":REM LITTLE LINE 230
            230 LET B$(7)="PPPPPPPP":REM BIG LINE 220
            240 LET B$(8)"RNBQKBNR":REMBIG LINE 210
            300 REM DISPLAU BOARD
            310 FOR N=1 TO 8:FOR M=1 TO 8
            320 LET BC CODE " " THEN GO TO 350:REM SPACE
            330 IF BC>CODE "Z" THEN INK PB:LET BC-32:REM LO
                CASE FOR BLACK
            340 LET BC=BC+79:REM CONVERT TO GRAPHICS
            350 PRINT AT 5+N,9+M;CHR$BC
            360 NEXT  M:NEXT N
            400 PAPER 7: INK 0
Глава 17
                          Г Р А Ф И К А
Краткое содержание:  PLOT, DRAW, CIRCLE, POINT
    Эта  глава  описывает возможности компьютера ZX  SPEKTRUM  по
отображению графической информации,  экран компьютера содержит 22
строки по 32 символа в каждой, что составляет 22х32=704 символь-
ные позиции.  Как вы уже поняли из 16 главы,  каждая  символьная
позиция представляется квадратом 8х8 точек, называемых пикселями.
    Пиксель  задается  двумя числами,  его  координатами,  первое
задает координату X, т.е. удаление (в пикселях) до левой границы
экрана,  второе задает координату Y,  удаление от нижней  границы
экрана, координаты записываются  в скобках, так (0,0), (255,0),
(0,175)  и (255,175) задают соответственно нижний  левый,  нижний
правый, верхний правый и верхний левый углы экрана.
    Оператор  PLOT X,U вызывает высвечивание закрашивающим цветом
(INK) пикселя с указанными координатами.
    Например программа:
                           10 PLOT INT(RND*256),INT(RND*176)
                           20 INPUT A$
                           30 GOTO 10
будет высвечивать некоторый случайный пиксель при каждом  нажатии
ENTER.
    Eсть и более интересные программы, например следующая програ-
мма  вычерчивает график функции SIN X,  для X в интервале от 0 до
2*PI :
                            10 FOR N=0 TO 255
                            20 PLOT N,86+80*SIN(N/128*PI)
                            30 NEXT N
или программа:
                            10 FOR N=0 TO 255
                            20 PLOT N,80*SQR(N/64)
                            30 NEXT N
которая чертит график SQRX (часть параболы) в интервале от 0 до 4.
    Помните  что координаты пикселя отличаются от адресации строк
и позиций в подкоманде AT. Пользуйтесь диаграммой из главы 15.
    Помощь при построении изображений вам могут оказать операторы
DRAW и CIRCLE.
    Оператор DRAW чертит линию, заданную в форме
                DRAW X,Y
Началом  линии является пиксель,  на котором завершился  один  из
предыдущих операторов PLOT,  DRAW или CIRCLE (этот пиксель назы-
вается текущей PLOT- позицией,  операторы RUN,  CLEAR, CLS, и NEW
устанавливают  ее  в  левый нижний угол  экрана),  таким  образом
оператор DRAW задает длину и направление вычерчивания  линии,  но
не ее начальную точку.
    Поэкспериментируйте с такими командами:
                 PLOT  0,100:DRAW 80,-35
                 PLOT 90,150:DRAW 80,-35
    Чертить  можно также в цвете,  но при этом надо иметь  ввиду,
что  цвет устанавливается для целой символьной позиции и не может
быть задан для отдельного пикселя, следующая программа демонстри-
рует это:
           10 BORDER 0:PAPER 0:INK 7:CLS: REM BLACK OUT SCRKKN
           20 LET X1=0: LET Y1=0: REM START OF LINE
           30 LET C=1:REM FOR INK COLOUR, STARTING BLUE
           40 LET X2=INT(RND*256):LET Y2=INT(RND*176):REM RANDOM
              FINISH OF LINE
           50 DRAW INK C: X2-X1,Y2-Y1
           60 LET X1=X2:LET Y1=Y2:REM NEXT LINE STARTS WHERE LINE
              ONE FINISHED
           70 LET C=C+1: IF C=8 THEN LET C=1: REM NEW COLOUR
           80 GOTO 40
    Вы  можете использовать в операторах PLOT и DRAW  управляющие
символы PAPER, INK, FLASH, BRIGHT, INVERSE и OVER так же, как и в
операторах PRINT и INPUT,  управляюшие символы записываются между
ключевым словом и координатами и оканчиваются запятой или  точкой
с запятой (смотри строку 50).
    При помощи DRAW можно также вычертить отрезок дуги, используя
для этого дополнительное число (в радианах) этой дуги:
                  DRAW X,Y,A
    Если  'A'  положительно то дуга вычерчивается влево,  а  если
отрицательно,  то  вправо,  при 'A' равном  2*PI  вычерчивается
полная окружность, например:
              10 PLOT 100,100: DRAW 50,50,PI
вычертит  полуокружность с начальной точкой (100,100) и  конечной
точкой (150,150), вычерчивание начнется в направлении юго-восток,
а закончится в направлении северо-запад.
     Оператор CIRCLE вычерчивает полный круг задаваемый координа-
тами его центра и радиусом:
            CIRCLE X,Y, радиус
    Как  и  в  операторах PLOT и DRAW вы можете  указать  в  этом
операторе различные цвета.
    Функция POINT возвращает характеристики цвета заданного  пик-
селя, например строка программы
             CLS:PRINT POINT(0,0):PLOT (0,0): PRINT POINT(0,0)
выведет: PAPER 7:INK0
    Допускается  также  задавать управляющие символы INWERSE и  в
операторе PLOT, по умолчанию предполагаются равными 0 (отключено),
но вы можете задать и 1, при этом:
PLOT INWERSE 1 - устанавливает для заданного пикселя цвет фона;
PLOT OVER 1    - изменяет цвет пикселя на  противоположный,  если
                 был цвет тона, то становится цвет фона и наоборот.
PLOT INWERSE 1;
OVER 1;        - сохраняет цвет пикселя без изменений,  но
                 меняет текущую PLOT позицию.
    Другой пример использования OVER с записью черным по белому
               PLOT 0,0: DRAW OVER 1;255,175
вычерчивает линию по диагонали.
    Теперь попробуйте:
               PLOT 0,0;DRAW INWERSE 1;256,175
и перечертите ее командой
               DRAW OVER 1;-250,-175
это  не изменит картинку,  так как при черчении как вперед так  и
назад используются одни и те же пиксели.
    Иимеется  способ получения необычных цветов в одном квадрате с
использованием определяемых пользователем символов, выполните эту
программу:     1000 FOR N=0 TO 6 STEP 2
               1010 POKE USR "A"+N, BIN 01010101:
                    POKE SR "A"+N+1,BIN 10101010
               1020 NEXT N
Она задает определяемый пользователем символ для шахматной  доски
который  закрепляется за клавишей 'A',  для символа  используется
красный закрашивающий цвет и желтый цвет фона,  но на экране этот
символ будет казаться оранжевым.
    Еще один пример,  программа,  которая строит график некоторой
функции,  на  первый  ее запрос вы отвечаете числом 'N'  задающим
область значения аргумента (т.е. график будет строится для значе-
ний аргумента в диапазоне от -N до +N),  второй ответ это выраже-
ние в виде символьной строки задающей функцию, использующую 'X' в
качестве аргумента:
              10 PLOT 0,87:DRAW 255,0
              20 PLOT 127,0:DRAW 0,175
              30 INPUT S,B$
              40 FOR F=2 TO 255
              50 LET X=(F-128)*S/128:LET Y=VAL E$
              60 IF ABS Y>87 THEN LET T=0: GOTO 100
              70 IF NOT T THEN PLOT F,Y+88:LET T=1:GOTO 100
              80 DRAW 1,Y-OLDY
             100 LET OLDY=INT(Y+5)
             110 NEXT F
Выполните введя 10 для числа 'N' т '10*TAN X' для функции,  будет
вычерчен график функции TG X при X изменяющемся от -10 до +10



СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Вступление - третий номер не заставил себя долго ждать.
Письмо №274 ДСП
Рабочий стол - Как работать с программами: ZX-Turbo Disassembler.
История Demomakig'a - прошлое и будещее.
Знаете ли вы... - Гасить ВГ-шку нулем в порт #FF нельзя. Перед записью через #3D13 на конкретную дорожку, если моторчик включен, а головка на ней торчит. Как ускорить процедуру чтения и загрузки через #3D13, если необходимо загрузить/записать несколько небольших блоков подряд.

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