Передовица » Макулатура » Другая периодика » Вычислительная техника и её применение 7/89

Вычислительная техника и её применение 7/89

КОСМИЧЕСКИЙ ПОЕДИНОК

А.Г ШМЕЛЕВ

«Космический поединок» - простая и краткая игровая программа реального времени для ПЭВМ «Агат», написанная на языке БЕЙСИК. Как и в прежних публикациях (см. выпуск 12 за 1988), разделим наши комментарии на две части: по технологии программирования и по психологическому эффекту игры.

Как этюд по программированию на БЕЙСИКе программа «Космический поединок» (КОПО) полезна для изучающих программирование тем, что иллюстрирует процесс организации обмена данными между человеком и ЭВМ в скоростном режиме - так называемом режиме «реального времени». В отличие от «вневременных» диалоговых программ, в которых компьютер останавливает процесс вычислений (формирование текстов и графиков на экране дисплея) для приёма информации с клавиатуры от пользователя, диалоговые программы «реального времени» не прекращают процесс вычисления. До тех пор, пока пользователь не посылает определённого сигнала с клавиатуры, на экране дисплея разворачивается какой-то процесс (в данном случае происходит имитация движения двух точек - красной и синей, условно обозначающих, согласно сюжету игры, два вооружённых лазерными пушками космических «модуля», противоборствующих друг другу).

Ввод команд пользователя в программе КОПО происходит в строке 52 - опрашивается ячейка с 16-ричным адресом C000. В «Агате» это ячейка для ввода информации с клавиатуры, в которой к моменту опроса должен храниться код, соответствующий коду клавиши, нажатой в текущий момент пользователем. Синей точкой на экране управляет игрок, сидящий за клавиатурой слева. Нажимая клавишу «я», этот игрок посылает программе сигнал, который приводит к тому, что синяя точка изменяет направление своего движения по экрану - поворачивается на 45° против часовой стрелки по направлению своего движения. Если игрок нажимает клавишу «ч», то синяя точка поворачивается на 45° по часовой стрелке. Чтобы произвести «выстрел» из лазерной пушки, «синий» игрок должен нажать клавишу «ы» - она расположена на клавиатуре как раз над клавишами «я» и «ч». При этом игрок должен стараться «прицелиться» в своего противника - так чтобы в момент выстрела точка, которой управляет противник, лежала как раз на траектории движения (прямо по курсу) его модуля. Игрок, управляющий красной точкой, производит аналогичные действия со своим модулем (со своей точкой на экране) с помощь клавиш «?», «ъ» и «.». При этом клавиша «.» расположена на клавиатуре «Агата» как раз над клавишами «?» и «ъ» и отвечает за выстрел из «красного» космического модуля.

Некоторых читателей такое утомительное многословное описание правил игры может отпугнуть от программы КОПО. Действительно, это абсолютно неблагодарное занятие - словами описывать игры реального времени. Гораздо проще человеку ухватить суть игры практически - понажимав клавиши и посмотрев, что происходит с объектами на экране. Но для этого читателю придётся ввести в «Агат» приведённый ниже листинг программы КОПО.


10 REM КОПО - КОСМИЧЕСКИЙ ПОЕДИНОК.
11 REM ШМЕЛЕВ А.Г.
18 DIM XD(7), YD(7)
20 REM 31.05.87
21 DIM C(255)
22 GR = 1: L1 = 0: L2 = 4
23 Z2 = 4: X2 = 62: Y2 = 22
24 Z1 = 1: X1 = 4: Y1 = 32
25 C(16) = 8: C(18) = 9: C(29) = 10: C(31) = 11: C(13) = 5: C(89) = 6: C(46)=7
26 FOR I = 49 TO 57: C(I) = 7: NEXT
27 C(0) = 1: C(3) = 2: C(8) = 3: C(21) = 4: C(25) = 5: C(26) = 6: C(81) = 1: C(94) = 2: C(47) = 3: C(95) = 4
28 FOR L = 0 TO 7: READ XD(L), YD(L): NEXT L: GOSUB 898
29 DATA 1, 0, 1, -1, 0, -1, -1, -1, -1, 0, -1, 1, 0, 1, 1, 1
30 POKE $C010,0
31 COLOR = 8: PLOT X1, Y1 TO X1, Y1
32 COLOR = Z1
33 IF X1 + XD(L1) < 4 OR X1 + XD(L1) > 62 THEN 36
34 X1 = X1 + XD(L1)
36 IF Y1 + YD(L1) < 4 OR Y1 + YD(L1) > 62 THEN 39
37 Y1 = Y1 + YD(L1)
39 S1 = S1 + 1: IF SCRN(X1, Y1) = Z2 THEN S2 = S2 - 1 40 PLOT X1, Y1 TO X1, Y1
41 COLOR = 8: PLOT X2, Y2 TO X2, Y2
42 COLOR = Z2
43 IF X2 + XD(L2) < 4 OR X2 + XD(L2) > 62 THEN 46
44 X2 = X2 + XD(L2)
46 IF Y2 + YD(L2) < 4 OR Y2 + YD(L2) > 62 THEN 49
47 Y2 = Y2 + YD(L2)
49 S2 = S2 + 1: IF SCRN(X2, Y2) = Z1 THEN S1 = S1 - 1
50 PLOT X2, Y2 TO X2, Y2
52 A = PEEK($C000) - 128
54 IF A < 0 THEN 30
55 K = C(A)
58 ON K GOTO 72, 82, 92, 102, 950, 700, 800
72 L1 = L1 +1
74 IF L1 = 8 THEN L1 = 0
76 GOTO 30
82 L1 = L1 - 1
84 IF L1 =- 1 THEN L1 = 7
86 GOTO 30
92 L2 = L2 + 1
94 IF L2 = 8 THEN L2 = 0
96 GOTO 30
102 L2 = L2 - 1
104 IF L2 = - 1 THEN L2 = 7
106 GOTO 30
219 GET A$
220 PRINT ASC(A$)
230 GOTO 219
700 COLOR = 1: PLOT X1, Y1 TO X1, Y1
710 COLOR = 7: XX = X1: YY = Y1
715 АА$ = "КРАСНЫЙ"
720 FOR I = 1 ТО 64
730 XX = XX + XD(L1): YY = YY + YD(L1)
740 IF XX <> X2 OR YY <> Y2 THEN 760
750 PLOT X1,Y1 TO XX, YY: XXX = X1: YYY = Y1: GOTO 900
760 IF XX <= 4 OR XX >= 62 OR YY <= 4 OR YY >= 62 THEN 780
770 NEXT I
780 PLOT X1, Y1 TO XX, YY
782 FOR J = 1 TO 20: NEXT 785 COLOR = 8
790 PLOT X1, Y1 TO XX, YY
795 GOTO 30
800 COLOR = 4: PLOT X2, Y2 TO X2, Y2
810 COLOR = 7: XX = X2: YY = Y2
815 AA$ = "СИНИЙ"
820 FOR I = 1 TO 64
830 XX = XX + XD(L2): YY = YY + YD (L2)
840 IF XX <> X1 OR YY <> Y1 THEN 860
850 PLOT X2, Y2 TO XX YY: XXX = X2: YYY = Y2: GOTO 900
860 IF XX <= 4 OR XX >= 62 OR YY <= 4 OR YY >= 62 THEN 880
870 NEXT I
880 PLOT X2, Y2 TO XX, YY
882 FOR J = 1 TO 20: NEXT
885 COLOR = 8
890 PLOT X2, Y2 TO XX, YY
895 GOTO 30
898 COLOR = 2: PLOT 3, 3 TO 3, 63: PLOT 3, 63 TO 63, 63: PLOT 63, 63 TO 63, 3: PLOT 63, 3 TO 3, 3: RETURN
900 COLOR = 8: PLOT XXX, YYY TO XX, YY
910 FOR Y = YY TO 63
912 COLOR = 5
920 PLOT XX, Y TO XX, Y: PRINT CHR$(7)
922 COLOR = 8: PLOT XX, Y - 1 TO XX, Y - 1
925 FOR J = 1 TO 10: NEXT
930 NEXT Y
950 TEXT = 2
960 PRINT "ПОБЕДИЛ"; AA$;". ПОЗДРАВЛЯЕМ!"
999 END

Обратим внимание на ряд технологических приёмов, использованных в КОПО. (Не будем здесь останавливаться на комментировании таких специфических для БЕЙСИКа на «Агате» средств управления графикой, как например, функция SCRN(X, Y) - опроса цвета точки в текущем графическом окне с координатами X, У.) Чтобы игра реального времени была интересной, программа должна работать в оптимальном для человека темпе - не слишком быстро и не слишком медленно. БЕЙСИК - медленный язык-интерпретатор. Написать на БЕЙСИКе сколь-нибудь занятную игру реального времени очень трудно: часто возникают задержки, неприятные для пользователя. И в программе КОПО не удалось полностью избавиться от неоправданных задержек. Например, в тот момент, когда один из игроков производит выстрел, возникает временная потеря «чувствительности» компьютера ко всяким управляющим воздействиям со стороны обоих игроков - на период расчёта траектории выстрела и определения факта попадания. Но в целом в КОПО удалось добиться вполне приемлемых скоростей, что обычно для случая шести управляющих клавиш удаётся только для специальных скоростных программ, написанных в специализированном языке машинных кодов операций процессора - АССЕМБЛЕР.

За счёт чего же удалось придать КОПО необходимую скорость? Переход к участкам программы, где выполняется изменение в траектории движения той или иной точки или выстрел, осуществляется не с помощью команд условных переходов (они работают долго - особенно если их шесть не зависимых друг от друга операторов), а с помощью одной операторной строки номер 58 - ON K GOTO... Для этого в строке 55 переменой K присваивается целочисленное значение из ячейки массива C, в которой хранится номер управляющего воздействия, а индекс ячейки A (индекс, а не само значение!) - это и есть код, извлекаемый из ячейки ввода C000.

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

Во-первых, можно не сомневаться в развлекательном эффекте - дети с удовольствием прибегают к игре КОПО, так как большинство гораздо более красочных компьютерных игр не дают им возможность играть и соревноваться друг с другом, а предлагают только индивидуальную игру с компьютером (против компьютера). Но и кроме развлекательного эффекта, КОПО имеет известный нетривиальный психологический смысл. Многим пользователям поначалу покажется неудобным тот способ управления движущимся объектом, который предложен в КОПО - смысл направления движения объекта от нажатия клавиши меняется в зависимости от того текущего направления, в котором уже двигался объект в данный момент: если объект двигался горизонтально вправо и игрок, например, нажал клавишу «ч», то направление движения изменится по часовой стрелке на 45° - объект начнёт двигаться в направлении правого нижнего угла квадратного игрового поля (экрана). Как приспособиться к такому необычному способу управления объектом на экране? Для этого вам требуется освоить особый мыслительный навык - занимать так называемую воображаемую позицию подвижного наблюдателя. Надо мысленно представить себя водителем-пилотом, управляющим движением модуля по экрану, и понять, что, нажав клавишу, помещённую справа, мы приводим к перемещению управляемого объекта всегда вправо, (по отношению к направлению движения), а нажатие клавиши, находящейся под пальцами слева, приводит к повороту налево. Освоив этот способ умственного действия (а он требует преодоления известного эгоцентризма - стремления смотреть на мир всегда только со своей колокольни), вы, как игрок, сразу станете гораздо удачливее.

Успеха Вам! Ибо удовольствие от КОПО зависит в немалой степени от отсутствия типографских ошибок в наборе листинга программы КОПО и в надёжности ваших собственных действий по вводу программы в «Агат» (который сам, как известно, к сожалению, не отличается большой надёжностью). Тем полнее удовольствие, когда предварительно предстоит немножко помучиться.

* * *

Использование материалов проекта agatcomp без получения предварительного письменного разрешения agatcomp запрещено.


Почта для обратной связи: mail@agatcomp.ru


Живое общение по теме Агата: Telegram группа Agatcomp.


Накопленные знания и проекты: тематический ФОРУМ.


© 2004-2024 agatcomp.su / agatcomp.ru

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *