Г.А. Андросов, А.Ю. Герасимов


ДВЕ ИГРЫ НА БЕЙСИКЕ



Игры "Лучи" и "Змейка" отличаются от множества себе подобных большой компактностью и, мы надеемся, будут полезны начинающим программистам на Бейсике. Главной задачей при их написании было максимально сократить количество строк. Эти две программы являются результатом наших соревнований, правда, их пришлось немного изменить, добавив по строчке, иначе отдельные строчки были бы слишком длинны. Программы удобны тем, что если нечем заняться, то их можно набить очень быстро. А теперь о структуре каждой программы.


"ЗМЕЙКА"

Строки с 1-й по 6-ю должны быть понятны. В 7-й строке выдается звуковой сигнал, затем в случайном месте экрана печатается клад, удав становится чуть длиннее, и печатаются набранные очки. В 8-й строке читается код последней нажатой клавиши и в зависимости от него в 9-й строке изменяются координаты головы удава (X,Y). 10-я строка проверяет, не наткнулся ли удав на что-либо, и если нет — стирает хвост и рисует голову на новом месте. В 11-й строке изменяются координаты хвоста (А,В) в зависимости от того, как в этом месте пробежала голова. Изменять скорость удава можно заменяя функцию TAN(PI) любым выражением, равным нулю.


«ЛУЧИ»

В 5-й строке в зависимости от нажатой клавиши изменяются координаты луча 1-го игрока (X,Y). В 6-й строке читается код из регистра порта ввода-вывода, и если он равен нулю, то сохраняется прежнее направление движения луча 2-го игрока, играющего джойстиком. В 7-й строке изменяются координаты луча 2-го игрока (M,N). В 8-й и 9-й строках проверяется, не наткнулись ли игроки на что-нибудь, и если нет — лучи удлиняются в направлении своего движения. Скорость движения можно менять так же, как в "ЗМЕЙКЕ".

Для тех, у кого джойстик распаян не по стандарту "КЛАДа" (2 — влево, 1 — вправо, 4 — вверх, 8 — вниз), в 7-й строке необходимо изменить числа в строках: IF B=...


Листинги:

0 '......ЗМЕЙКА******

1 DIM F(30,20)

2 CLS

3 LINE (7,9)-(248,210),,B

4 DATA 15,11,16,11,8

5 READ X,Y,A,B,F(16,11)

6 С=С+1

7 ? STRING $ (5,7) AT (RND(1)*29+1, RND(1)*19+1)"*"AT(X,Y)CHR$(127) AT(11,22) "ОЧКИ:"; C-l

8 F(X,Y)=PEEK(-78)

9 IF F(X,Y)=25 TH X=X+1 EL IF F(X,Y)=8 TH X=X-1 EL IF F(X,Y)=26 TH Y=Y-1 EL Y=Y+1

10 IF X=0 OR X=31 OR Y=0 OR Y=21 OR POINT (X*8+l, Y*10+l)=l TH END EL IF POINT(X*8+3,Y*10+2)=1 TH 6 EL ?AT(A,B)" "AT(X,Y)CHR$(127)

11 IF TAN(PI) OR F(A,B)=25 TH A=A+1 EL IF F(A,B)=8 TH A=A-1 EL IF F(A,B)=26 TH B=B-1 EL B=B+1

12 GOTO 8

 

0 ' *.....ЛУЧИ ******

1 CLS

2 READ X,Y,M,N,J .

3 DATA 10,120,244,120,2

4 LINE (0,0)-(255,239),,B

5 IF PEEK(-78)=8 TH X=X-1 EL IF PEEK(-78)=27 TH Y=Y+1 EL IF PEEK(-78)=26 TH Y=Y-1 EL X=X+1

6 IF РЕЕКГ-52) AND J<>PEEK(-52) TH J=PEEK(-52) EL B=J

7 IF B=2 TH M=M-1 EL IF B=l TH M=M+1 EL IF B=4 TH N=N-1 EL N=N+1

8 IF POINT(X,Y)=4 TH PSET(X,Y),2 EL D=l

9 IF POINT(M,N)=4 TH PSET(M,N),3 EL D=2

10 IF SIN(PI) OR D=l TH ?"END1" EL IF D TH ?"END2" EL 5


ПРИМЕЧАНИЕ РЕДАКТОРА

Предлагаемые игровые мини-программы проверены на БК-0010.01 и вполне работоспособны. Данные программы являются вариантом реализации хорошо известных на БК игр ("Змейка" — тот же "Питон" из комплекта программ, прилагаемого к БК при продаже, "Лучи" — полный аналог "Гонок" в машинных кодах из того же комплекта). Отличаются же эти игры прежде всего своей феноменальной краткостью, и на некоторые из использованных в них приемов, на мой взгляд, стоит обратить внимание. Вот, например, цепочки операторов IF для распознавания нажатых клавиш. Ведь они не только уменьшают "формальное" число строк в программе, в Бейсике БК-0010.01 это один из немногих аналогов отсутствующей возможности записи нескольких операторов в одной строке. Стоит также отметить использование функций TAN(PI) и SIN(PI) в качестве задержки. Конечно, большое значение задержки таким образом получить сложно, но для маленькой, всего в сотые доли секунды, такой способ намного выгоднее обычного "пустого" FOR-цикла. Кстати, обратим внимание и на то, как использованы эти функции: они вставлены в оператор IF, чтобы не выделять под них лишнюю строку. А чтобы значение этой функции не влияло на условие IF, она "подсоединена" к "действительному" условию через OR (если значение функции, как и требуют авторы, равно 0, при такой записи ее наличие или отсутствие несущественно).

Что дает такая оптимизация? Во-первых, программа занимает мало места как в ОЗУ, так и на носителе (можно скомпановать несколько подобных игр в одну программу с меню выбора игры). Во-вторых, как и отметили авторы, набрать такую программу можно очень быстро (всего за 5—10 минут). И наконец, такая программа в силу своей краткости работает намного быстрее, что для динамических игр очень важно (в данных программах на "медленном" Бейсике скорость игры приближается к скорости для аналогичных программ в кодах). Однако, к сожалению, за все хорошее надо платить. И в данном случае за все перечисленные "плюсы" с лихвой уплачено крайне "бедным" внешним оформлением (а внешний вид для хорошей игры тоже не менее важен).


Распознавание и преобразование в гипертекст: Владислав М. Антонов

2004 г