Составление программы меню
Хорошая игровая программа всегда начинается с заставки. Познакомившись с модульным принципом построения программ, попробуем сделать заставку, состоящую из нескольких кадров-модулей. Поскольку во второй главе мы коротко рассмотрели принципы построения таких заставок, то здесь сосредоточим внимание на их основном элементе, который носит название меню.
Меню является связующим звеном между отдельными частями программы, чем-то вроде диспетчерского пункта: отсюда начинается игра, сюда же мы попадаем после ее окончания, а в некоторых играх - и в промежуточных ситуациях.
Что же делает меню? Вот типичный набор его пунктов: НАЧАЛО ИГРЫ ВЫБОР ВИДА УПРАВЛЕНИЯ ПРАВИЛА ИГРЫ
ВЫВОД ТАБЛИЦЫ РЕЗУЛЬТАТОВ ВЫБОР УРОВНЯ ИГРЫ
Что означает каждая из этих строк, думается, нет необходимости пояснять: они встречаются почти в каждой компьютерной игре. Как конкретно осуществляется выбор той или иной строки меню, мы рассмотрим на двух примерах.
Пусть первое меню выглядит так, как показано на рис. 4.6. Его работа может быть организована следующей программой:
Программа 18. МЕНЮ 1.
10 BORDER 0: PAPER 0: INK 1 20 CLS
22 PLOT 55,24: DRAW 0,120 24 DRAW 153,0: DRAW 0,-120 26 DRAW -153,0 28 INK 6
30 PRINT AT 2,13;"M E N U" 40 DIM a$(6,19)
50 LET a$(1)="nnnnSTARTnnGAMEnn"
60 LET a$(2)="nnnnnCONTROLSnnnn"
70 LET a$(3)="nnnnINSTRUCTIONnn"
80 LET a$(4)="nnnnPRINT SCOREnn"
90 LET a$(5)=nnnnnnnLEVELnnnnn"
100 LET a$(6)="nnnQUITnnPROGRAM "
105 INK 5
110 FOR N=1 TO 6
120 PRINT AT N*2+4,7;a$(N)
130 NEXT N
140 INK 4
150 PRINT AT 20,9;"press 6, 7 or 0" 160 LET No=1
170 PRINT AT No*2+4,7; PAPER 1; INK 5;a$(No) 172 BEEP .07,20: PAUSE 30
175 LET Noo=No 180 LET b$=INKEY$
190 IF b$="6" THEN LET No=No+1: GO TO 220
200 IF b$="7" THEN LET No=No-1: GO TO 220
210 IF b$="0" THEN GO TO 300
215 GO TO 180
220 IF No>6 THEN LET No=1
230 IF No<1 THEN LET No=6
240 PRINT AT Noo*2+4,7; PAPER 0; INK 5;a$(Noo)
250 GO TO 170
299 REM --------------------
300 REM IF No=.. THEN GOTO ...
Поясним действия входящих в программу строк.
10 - установка атрибутов экрана;
22...26 - формирование рамки синего цвета, в которой должны быть помешены пункты меню;
30 - вывод над рамкой слова MENU;
40 - задание массива строковых переменных;
50...100 - присваивание элементам массива текстовых значений - пунктов меню;
110...130 - вывод пунктов меню в рамке через пустую строку;
150 - информация о клавишах управления для выбора нужной строки, помещаемая под рамкой;
160 - основная переменная, указывающая номер надписи, на которую устанавливается создаваемый нами курсор;
170 - формирование курсора, представляющего собой горизонтальную полоску синего цвета, наложенную поверх текста надписи;
175 - здесь запоминается «старый» номер строки, когда положение курсора изменяется на один шаг;
180...210 - управление курсором вверх/вниз. Если нажать клавишу О, то из меню мы перейдем непосредственно к тому разделу программы, который выбран курсором;
220...230 - анализ номера строки с тем, чтобы он не вышел за пределы 1...6;
240 - когда курсор переходит на другую строку, на экран выводится старая надпись, но уже без курсора;
250 - передача управления группе строк, организующих переход курсора на другой пункт меню.
Еще одна программа меню, которую мы сейчас рассмотрим, отличается от предыдущей способом представления информации на экране и, соответственно, другим программным решением. Она выводит на экран следующие надписи:
НАЧАЛО ИГРЫ ИНСТРУКЦИИ
ПЕЧАТЬ ТАБЛИЦЫЫ РЕЗУЛЬТАТОВ
КЛАВИАТУРА
ДЖОЙСТИК
УРОВЕНЬ ИГРЫЫ
ОБ АВТОРЕ
КОНЕЦ ПРОГРАММЫЫ
Особенность этого меню состоит в том, что эти надписи как бы нанесены на широкое бумажное кольцо, которое может «вращаться» вокруг своей оси, показывая в окне три любых строки из приведенного списка, расположенных подряд (рис. 4.7).
Процесс вращения управляется клавишами 6 (вниз) и 7 (вверх). Когда выбор пункта меню сделан, нажимается клавиша 0, и управление передается в один из блоков основной программы.
Программа 19. МЕНЮ 2.
10 BORDER 0: PAPER 0: INK 6 20 CLS
30 GO SUB 3000 40 DIM A$(8,19) 45 DIM B$(3,19)
50 LET A$(1)="ППППSTARTППGAME" 55 LET A$(2)="ППППINSTRUCTION" 60 LET A$(3)="ППППPRINT SCORE" 65 LET A$(4)="ПППППKEYBOARD" 70 LET A$(5)="ПППППJOYSTICK" 75 LET A$(6)="ПППППППLEVEL" 80 LET A$(7)="ПППППABOUTППME" 85 LET A$(8)="ПППQUITППPROGRAM" 90 LET N0=1
92 PRINT AT 12,4; INK 2;"AПППППППППППППППППППППB"
93 INK 1
94 PLOT 46,54: DRAW 154,0
95 DRAW 0,43: DRAW -154,0
96 DRAW 0,-43
97 INK 6
100 PRINT AT 1,8;"CS/1;4;CS/5 CS/4;3;2 CS/5 CS/5 CS/5 CS/5"
110 PRINT AT 2,8;"CS/5;2;CS/5 CS/4;2ППCS/4;CS/7;CS/5 CS/5 CS/5"
120 PRINT AT 3,8;"CS/5 CS/5 CS/I;CS/3;CS/7 CS/5;l;CS/5 6;CS/3;2"
122 PRINT AT 20,2; INK 3;"6...DOWN, 7...UP, 0...ENTER"
124 INK 4: PLOT 0,0: DRAW 0,175: DRAW 248,0: DRAW 0,-175: DRAW -248,0
130 LET No=1
140 INK 5
150 LET N1=0
160 FOR N=No-1 TO No+1
165 LET NN=N
170 IF N<1 THEN LET NN=8
180 IF N>8 THEN LET NN=1
190 LET N1=N1+1
200 LET B$(N1)=A$(NN)
210 NEXT N
215 GO SUB 450
220 PRINT AT 10,6;B$(1)
230 PRINT AT 12,6; INK 4;B$(2)
240 PRINT AT 14,6;B$(3)
250 LET C$=INKEY$
260 IF C$="6" THEN GO SUB 300: GO TO 150 270 IF C$="7" THEN GO SUB 350: GO TO 150 280 IF C$="0" THEN GO TO 600
290 GO TO 250
300 REM -------------
305 LET No=No-1
310 IF No<1 THEN LET N0=8
320 GO SUB 400
330 PRINT AT 11,6;B$(1)
334 PRINT AT 13,6;B$(2)
340 GO SUB 500: RETURN
350 REM --------------
355 LET No=No+1
360 IF No>8 THEN LET No=1
365 GO SUB 400
370 PRINT AT 11,6;B$(2)
380 PRINT AT 13,6;B$(3)
385 GO SUB 500
390 RETURN
400 REM --------------
410 PRINT AT 10,6;"ППППППППППППППППППП" 420 PRINT AT 12,6;"ППППППППППППППППППП" 430 PRINT AT 14,6;"ППППППППППППППППППП"
440 RETURN
450 REM -------------
455 PRINT AT 11,6;"ППППППППППППППППППП" 465 PRINT AT 13,6;"ППППППППППППППППППП"
470 RETURN
500 REM ------------
510 FOR M=1 TO 10: NEXT M 520 RETURN
600 REM ---------------------
610 CLS
620 REM IF No=.. THEN GOTO ...
2999 STOP
3000 REM ---- U.D.G.-----
3010 FOR N=0 TO 15
3020 READ S 3030 POKE USR "A"+N,S 3040 NEXT N 3050 RETURN
3060 DATA 0,16,24,252,254,252,24,16 3070 DATA 0,16,48,126,254,126,48,16 Чтобы сделать программу удобной для анализа, в ней выделены шесть подпрограмм-модулей:
300...340 - подпрограмма сдвига всех надписей вниз; 350...390 - подпрограмма сдвига всех надписей вверх; 400...440 - подпрограмма, удаляющая три надписи в окне;
450...470 - подпрограмма, удаляющая две надписи в окне, которые занимают промежуточное положение по отношению к предыдущим трем надписям и служат для создания на экране эффекта перемещения строк сверху вниз и наоборот;
500... 520 - подпрограмма паузы. Необходима для создания эффекта движения надписей вверх или вниз при нажатии нужных клавиш;
3000...3070 - запись в память компьютера изображений стрелок, которые должны располагаться за пределами окна и указывать на надпись, подобно курсору. Таким образом, в этой программе, в отличие от предыдущей, курсор неподвижен, а все надписи могут передвигаться вверх и вниз. А теперь коротко об остальных строках программы. 10, 20 - установка атрибутов экрана;
30 - обращение к подпрограмме 3000...3070, которая создает две направленные навстречу друг другу стрелки, выполняющие роль неподвижного курсора, расположенного посередине окна;
40 - резервирование памяти для 8 строк меню;
45 - резервирование памяти для 3 строк меню, выводимых на экран;
50...85 - запись 8 пунктов меню в массив А$;
92 - вывод на экран стрелок курсора;
93...96 - вывод рамки, куда выводятся три слова из меню;
97... 120 - вывод на экран слова МЕНЮ, причем здесь используются символы псевдографики, которые набираются в режиме курсора [G] нажатием цифровых клавиш отдельно или совместно с Caps Shift. B тексте программ мы будем обозначать такие символы подчеркиванием, например, 3 или CS/1, причем при отсутствии пробелов между ними будем ставить точку с запятой (;);
122 - вывод информации о клавишах управления;
124 - вывод внешней рамки меню;
150...210 - операторы этих строк записывают в массив В$ подряд три строки меню, выбирая их из массива А$;
220...240 - вывод на экран массива В$;
250...290 - анализ нажатой клавиши управления и выполнение действий в соответствии с этой клавишей;
300...3000 - подпрограммы, действие которых описано выше, а построчный разбор предлагается сделать читателю.