ZX-Ревю 1991 №2 1990 г.

Маленькие хитрости - пути использования способностей "Спектрума" выполнять логические вычисления.


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

Рассмотрим, например, такой фрагмент какой-либо программы. 100 IF INKEY$="8" THEN LET x=x+1 110 IF INKEY$="5" THEN LET x=x-l

Такая логика часто встречается, когда Вы хотите, например, чтобы при нажатии клавиши "8" объект двигался по экрану вправо, а при нажатии клавиши "5" - влево. Занимает такой фрагмент 48 байтов и далеко не оптимален.

Рассмотрим другой пример: 100 LET X=X+(INKEY$="8")-(INKEY$="5").

Это совершенно то же самое, но занимает всего 29 байтов и, самое главное, намного быстрее работает.

Вся хитрость в том, что те выражения, которые записаны внутри скобок, являются логическими. Если результат логического отношения - "ИСТИНА", то логическое выражение имеет значение 1, а если "ЛОЖЬ" - 0.

Поскольку функция INKEY$ не может считывать две клавиши одновременно, то либо была нажата клавиша "8", либо "5", либо ни одна из них. Тогда либо первая скобка равна 1, либо вторая, либо ни одна. Фактически мы в этом примере прибавили к числовой переменной х результат логического выражения. Надо сказать, что не всякий язык программирования позволил бы такую вольность. Паскаль бы, например не позволил, да и БЕЙСИК не всякий, но БЕЙСИК "Спектрума" - позволяет.

Продолжим с нашим примером. При изображении на экране движущегося объекта бывает важно так ограничить его перемещение, чтобы он не вышел за пределы экрана. Обычно это делают так: 120 IF Х>31 THEN LET х=31 130 IF X<0 THEN LET X=0

Вот дополнительный расход 54 байтов, а все можно сделать проще и лучше путем: 100 LET x=x+(INKEY$="8" AND х<31)-(Ш^$="5" AND x>0)

Здесь требуется всего 46 байтов вместо 102!

Существенная проблема с использованием функции INKEY$ состоит в том, что с ее помощью трудно организовывать перемещение по диагонали, поскольку она читает только одну нажатую клавишу. Решить проблему можно с помощью оператора IN, читая клавиатуру, как внешний порт:

10 LET x=x-(IN 49150 + IN 57342 <>510)-(IN 64510 + IN 65022<>510): LET y=y+(IN 65278+IN 32706<>510>-(IN 63486+IN 61438<>510)

Клавиатура делится на 4 части. Верхний ряд служит для перемещения вверх, нижний -вниз, а левая и правая половины средних рядов - влево и вправо.

Одновременным нажатием двух клавиш можно получить движение по диагонали.

Другой пример: 10 LET x=a=b

На первый взгляд в этой записи мало смысла, но это только на первый взгляд. Здесь ясно видны два знака равенства, а вот означают они совершенно разные вещи. Первый -часть оператора присвоения, то есть вместе с LET он присваивает переменной х результат логического выражения a=b. А второй знак равенства - это логическое отношение "РАВНО" и, тем самым, является частью логического выражения a=b, которое может быть либо истинным, либо ложным и, соответственно, иметь в качестве результата либо 0, либо 1. Вся запись заняла 11 байтов, в то время как его традиционный эквивалент имел бы 38 байтов: 10 IF a=b THEN LET x=1 20 IF a<>b THEN LET x=0

А если надо, чтобы при a=b, x равнялся бы десяти, тогда так: 10 LET x=(a=b)*10

В программах такую систему иногда используют для организации подсчета очков. Например, Вам надо, чтобы при правильном ответе (при нажатии заданной клавиши n) к счету добавлялось бы 50 очков: 10 LET s=s+(INKEY$=STR$ n)*50

Не забудьте только, что число n надо сначало преобразовать в стринг через STR$, поскольку иначе возникнет несовпадение типов, ибо INKEY$ - всегда стринг (строковая, иногда еще говорят литеральная, переменная).

Очень часто в программах для создания мультипликационных эффектов используют быстрое чередование двух каких-то символов, например символов из области графики пользователя. Первый, допустим, изображает бабочку со сложенными крыльями, а второй -с расправленными. Удобнее всего для этого пользоваться оператором NOT. 510 LET a=1 520 LET a= NOT a 530 PRINT AT 10,15; CHR$(144+a) 540 IF INKEY$<>"" THEN RETURN 550 GO TO 520

Цикл между строками 520 и 550 будет продолжаться до тех пор, пока Вы не нажмете какую-либо клавишу и не выйдете через строку 540 в вызывающую подпрограмму.

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

Вместо 10 IF x=1 THEN ...

Можно 10 IF x THEN ...

Вместо 20 IF x=0 THEN ...

Можно 20 IF NOT x THEN ...

А вот такую головоломку: 30 IF x<>1 AND x<>0 THEN LET x=1

можно упростить до: 30 LET x= NOT NOT x

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

10 IF r=1 THEN PRINT "x" 20 IF r=2 THEN PRINT "y" 30 IF r=3 THEN PRINT "z" Можно записать как: 10 PRINT ("x" AND r=1)+("y" AND r=2)+("z" AND r=3)

Еще одним полезным способом применения логических операторов может быть имитация структурных переключателей типа ON...GO TO... Такой оператор есть во многих языках программирования, в том числе и в некоторых диалектах БЕЙСИКа. Например, Вам необходимо иметь:

100 IF INKEY$="1" THEN GO TO 1000 110 IF INKEY$="2" THEN GO TO 2000 120 IF INKEY$="3" THEN GO TO 3000

Это можно легко исполнить путем: 100 GO TO VAL INKEY$*1000

Этот прием, однако, не сработает, если строки, на которые должен быть сделан переход, расположены нерегулярно, а также если по ошибке будет нажата не та клавиша. Если вам, например нужны переходы на строки 70, 1100 и 60, то это можно сделать следующей строкой:

100 GO ТО (600 AND INKEY$="1")+ (1010 AND INKEY$="2") + (-40 AND INKEY$="3")+100

Внимательный читатель заметил, что мы число 100 вынесли отдельно. Это сделано для того, чтобы если нажата не та клавиша или не нажата никакая, то вновь выполнялась бы сотая строка.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Сатанизм - Брак и кровавое жертвоприношение. Кровавая жертва: сатанинская или иеговистская? Брак и семья.
Софт - утилита преобразования графических изображений.
Реклама - реклама и обьявления о покупке и продаже Спектрума.
Help - Описание интерфейса ZX-Rulez.
Комментарий к приложению

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