AFRICAN SEEDS
Уважаемые читатели! Мы получаем массу писем с просьбой больше давать программ на БЕЙСИКе для самостоятельного набора начинающими. Многие полагают, причем совершенно справедливо, что это является прекрасной школой обучения программированию. Мы с этим утверждением полностью солидарны. И дело даже не в том, что при наборе программы начинающий программист осваивает клавиатуру, использует новые для себя операторы и конструкции языка, узнает новые приемы. Основная прелесть состоит в том, что как бы ни старался читатель набрать программу без ошибок, в 99 случаях из 100 у него это не выйдет. Практически все при любом опыте наделают ошибок. А вот поиск этих ошибок и отладка программы и являются по-настоящему ценной школой начинающего программиста.
Интерпретатор БЕЙСИКа устроен так, что от большинства ошибок он Вас застрахует. Если при наборе строки Вы нарушите синтаксис языка, он Вас немедленно предупредит и строка не будет введена в программу клавишей ENTER до тех пор, пока Вы эту ошибку не исправите. Тем не менее, существуют еще сотни возможных видов ошибок, которые он не увидит. Например, он ничего не сможет поделать, если Вы пропустите какую-либо строку. Об этом Вы узнаете только запустив программу, причем ошибка проявится совсем не в том месте, в котором Вы пропустили строку. Она проявится там, где компьютеру надо будет воспользоваться данными, содержавшийся в пропущенной строке.
Поэтому прежде, чем Вы приступите к набору программы, нам хотелось бы дать Вам некоторые приемы, которые помогут сделать мучительный процесс отладки чуть менее мучительным. Тем не менее, настройтесь все-таки на тяжелую и кропотливую работу.
Во-первых, когда программу набирают со страниц журнала или книги, большой процент ошибок возникает в связи с плохой различимостью символов. Так, например, часто путают буквы "i", "I", "l" и цифру "1". Путают букву "O" и цифру "0". Можно спутать букву "B" и цифру "8". Имея дело с этими символами относитесь к ним предельно осторожно.
Теперь о ходе отладки. Вы, конечно понимаете, что предусмотреть все возможные виды ошибок, которые Вы наделаете, заранее никто не сможет, хотя кое-какая статистика у нас имеется. Можно сказать, что до 90 процентов самых больших неприятностей связано с тремя видами ошибок:
Variable not found (переменная не найдена).
Out of screen (печать вне пределов экрана).
End of DATA (нехватка данных).
Что касается Variable not found, - это наиболее часто встречающаяся неприятность. К ней, как правило, и приводит путаница в символах, о которой мы писали выше. Хотя это, конечно, не единственный способ напороться на данную ошибку.
Когда компьютер сообщает об этой ошибке, он указывает и номер строки, в которой она произошла. Внимательно сверьте эту строку с исходным текстом. Если все в порядке, попробуйте распечатать переменные "подозрительного" выражения прямой командой. Та, которая ошибочна, распечатана не будет и Вы опять получите сообщение "Variable not found". Теперь надо найти программную строку, в которой эта переменная была в первый раз определена. Может быть эту строку Вы и пропустили или неправильно набрали переменную.
Иногда эта ошибка появляется не тогда, когда Вы что то пропустили, а наоборот набрали что-то лишнее, что было воспринято, как имя переменной.
Ошибка Out of screen возникает при печати (PRINT, PLOT, DRAW, CIRCLE), если координаты печати выходят за пределы экрана. Бороться с этой ошибкой весьма трудно, поскольку ошибка возникает в тех случаях, когда параметры координат позиции печати выражены не числом, а переменными, распечатайте их прямой командой PRINT.
Посмотрите, какой параметр "врет". Вернитесь по программе назад, найдите строку, в которой этот параметр вычисляется. Пусть это будет например строка 5550. Поставьте после нее отладочную строку: 5551 PRINT <имя перем.>: PAUSE 0
Так, постепенно "раскручивая" эту переменную, Вы и найдете в какой строке вычисления с ней портят Вашу программу.
Ошибка "Out of DATA" возникает в случае несоответствия количества данных, прочитанных программой по оператору READ и имеющихся в строках DATA. Борьба с ней довольно проста и требует только внимательности и точности.
А теперь, закончив с этим затянувшимся вступлением, мы предлагаем нашим читателям старинную африканскую игру "AFRICAN SEEDS". Игра относится к направлению, называемому "Манкала". В этом семействе имеются сотни разных игр. Выбранная нами игра отличается относительной простотой правил и несложной алгоритмизацией. Несмотря на свою простоту, компьютерная версия игры отличается тем, что победить ее непросто. Мы не будем здесь рассказывать правил игры, Вы их прочитаете непосредственно после запуска программы. Укажем только, что играть можно не только с компьютером. Воспользовавшись камешками или ракушками Вы можете играть с друзьями на пляже или с помощью сосновых шишек в лесу. В связи с приближением отпускного сезона, Вам это может пригодиться.
Программа переведена на русский язык. Если Ваш "Спектрум" имеет русский регистр, то набор русского текста не вызовет у Вас трудностей. Но, учитывая тот факт, что большинство компьютеров у наших пользователей нерусифицированные, мы использовали в программе загружаемый символьный набор "НС" в кодах КОИ-7 в стандарте ASCII (он приведен ниже). Это "утолщенный" русско-латинский символьный набор, предложенный для русификации программы "MF-09" (см. статью Алексеева А.Г. в "ZX-РЕВЮ" N 1-2 за 1992 г. стр. 29). Для тех читателей, которые подписались на "РЕВЮ" только в этом году, мы повторяем этот способ русификации. Мы будем всякий раз ссылаться на него при публикации в дальнейшем БЕЙСИК-программ для самостоятельного набора.
Для формирования символьного набора используется программа для шестнадцатиричного ввода (см. "ZX-РЕВЮ"-93, N 1-2, стр. 5-7).
СИМВОЛЬНЫЙ НАБОР "НС" КОИ-7
FC58 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
54 |
FD10 |
00 |
7E |
66 |
0C |
18 |
30 |
30 |
00 |
75 |
FC60 |
00 |
18 |
18 |
18 |
18 |
00 |
18 |
00 |
D4 |
FD18 |
00 |
3C |
66 |
3C |
66 |
66 |
3C |
00 |
FB |
FC68 |
00 |
6C |
6C |
6C |
00 |
00 |
00 |
00 |
A8 |
FD20 |
00 |
3C |
66 |
66 |
3E |
06 |
3C |
00 |
A5 |
FC70 |
00 |
6C |
FE |
6C |
6C |
FE |
6C |
00 |
18 |
FD28 |
00 |
00 |
18 |
18 |
00 |
18 |
18 |
00 |
85 |
FC78 |
00 |
18 |
7E |
58 |
7E |
1A |
7E |
18 |
90 |
FD30 |
00 |
00 |
18 |
18 |
00 |
18 |
18 |
30 |
BD |
FC80 |
00 |
62 |
64 |
08 |
10 |
26 |
46 |
00 |
C6 |
FD38 |
00 |
00 |
0C |
18 |
30 |
18 |
0C |
00 |
AD |
FC88 |
00 |
30 |
58 |
30 |
7A |
CC |
76 |
00 |
F8 |
FD40 |
00 |
00 |
00 |
7C |
00 |
7C |
00 |
00 |
35 |
FC90 |
00 |
18 |
30 |
00 |
00 |
00 |
00 |
00 |
D4 |
FD48 |
00 |
00 |
30 |
18 |
0C |
18 |
30 |
00 |
E1 |
FC98 |
00 |
0C |
18 |
18 |
18 |
18 |
0C |
00 |
0C |
FD50 |
00 |
3C |
66 |
0C |
18 |
00 |
18 |
00 |
2B |
FCA0 |
00 |
30 |
18 |
18 |
18 |
18 |
30 |
00 |
5C |
FD58 |
00 |
7C |
CE |
D6 |
DE |
C0 |
7C |
00 |
8F |
FCA8 |
00 |
00 |
6C |
38 |
FE |
38 |
6C |
00 |
EA |
FD60 |
00 |
3C |
66 |
66 |
7E |
66 |
66 |
00 |
AF |
FCB0 |
00 |
00 |
18 |
18 |
7E |
18 |
18 |
00 |
8A |
FD68 |
00 |
7C |
66 |
7C |
66 |
66 |
7C |
00 |
0B |
FCB8 |
00 |
00 |
00 |
00 |
00 |
18 |
18 |
30 |
14 |
FD70 |
00 |
3C |
66 |
60 |
60 |
66 |
3C |
00 |
71 |
FCC0 |
00 |
00 |
00 |
00 |
7C |
00 |
00 |
00 |
38 |
FD78 |
00 |
7C |
66 |
66 |
66 |
66 |
7C |
00 |
05 |
FCC8 |
00 |
00 |
00 |
00 |
00 |
18 |
18 |
00 |
F4 |
FD80 |
00 |
7E |
60 |
7C |
60 |
60 |
7E |
00 |
15 |
FCD0 |
00 |
00 |
06 |
0C |
18 |
30 |
60 |
00 |
86 |
FD88 |
00 |
7E |
60 |
7C |
60 |
60 |
60 |
00 |
FF |
FCD8 |
00 |
3C |
66 |
6E |
76 |
66 |
3C |
00 |
FC |
FD90 |
00 |
3C |
66 |
60 |
6E |
66 |
3C |
00 |
9F |
FCE0 |
00 |
18 |
38 |
18 |
18 |
18 |
3C |
00 |
B0 |
FD98 |
00 |
66 |
66 |
7E |
66 |
66 |
66 |
00 |
11 |
FCE8 |
00 |
3C |
66 |
06 |
3C |
60 |
7E |
00 |
A6 |
FDA0 |
00 |
3C |
18 |
18 |
18 |
18 |
3C |
00 |
75 |
FCF0 |
00 |
3C |
66 |
0C |
06 |
66 |
3C |
00 |
42 |
FDA8 |
00 |
0E |
06 |
06 |
66 |
66 |
3C |
00 |
C7 |
FCF8 |
00 |
0C |
1C |
2C |
4C |
7E |
0C |
00 |
1E |
FDB0 |
00 |
66 |
6C |
78 |
78 |
6C |
66 |
00 |
41 |
FD00 |
00 |
7E |
60 |
7C |
06 |
66 |
3C |
00 |
FF |
FDB8 |
00 |
60 |
60 |
60 |
60 |
60 |
7E |
00 |
13 |
FD08 |
00 |
3C |
60 |
7C |
66 |
66 |
3C |
00 |
25 |
FDC0 |
00 |
C6 |
EE |
D6 |
D6 |
C6 |
C6 |
00 |
A9 |
FDC8 |
00 |
66 |
66 |
76 |
6E |
66 |
66 |
00 |
41 |
FE90 |
00 |
00 |
3E |
30 |
30 |
30 |
30 |
00 |
8C |
FDD0 |
00 |
3C |
66 |
66 |
66 |
66 |
3C |
00 |
DD |
FE98 |
00 |
00 |
66 |
3C |
18 |
3C |
66 |
00 |
F2 |
FDD8 |
00 |
7C |
66 |
66 |
7C |
60 |
60 |
00 |
59 |
FEA0 |
00 |
00 |
66 |
66 |
6E |
76 |
66 |
00 |
B4 |
FDE0 |
00 |
3C |
66 |
66 |
6E |
6E |
3E |
00 |
FF |
FEA8 |
00 |
18 |
66 |
66 |
6E |
76 |
66 |
00 |
D4 |
FDE8 |
00 |
7C |
66 |
66 |
7C |
6C |
66 |
00 |
7B |
FEB0 |
00 |
00 |
66 |
6C |
78 |
6C |
66 |
00 |
CA |
FDF0 |
00 |
3C |
60 |
3C |
06 |
66 |
3C |
00 |
60 |
FEB8 |
00 |
00 |
1E |
36 |
36 |
36 |
66 |
00 |
DC |
FDF8 |
00 |
7E |
18 |
18 |
18 |
18 |
18 |
00 |
EB |
FEC0 |
00 |
00 |
C6 |
EE |
D6 |
C6 |
C6 |
00 |
D4 |
FE00 |
00 |
66 |
66 |
66 |
66 |
66 |
3C |
00 |
38 |
FEC8 |
00 |
00 |
66 |
66 |
7E |
66 |
66 |
00 |
DC |
FE08 |
00 |
66 |
66 |
66 |
66 |
3C |
18 |
00 |
F2 |
FED0 |
00 |
00 |
3C |
66 |
66 |
66 |
3C |
00 |
78 |
FE10 |
00 |
C6 |
C6 |
D6 |
D6 |
FE |
44 |
00 |
88 |
FED8 |
00 |
00 |
7E |
66 |
66 |
66 |
66 |
00 |
EC |
FE18 |
00 |
66 |
3C |
18 |
18 |
3C |
66 |
00 |
8A |
FEE0 |
00 |
00 |
3E |
66 |
3E |
36 |
66 |
00 |
5C |
FE20 |
00 |
66 |
3C |
18 |
18 |
18 |
18 |
00 |
20 |
FEE8 |
00 |
00 |
7C |
66 |
66 |
7C |
60 |
00 |
0A |
FE28 |
00 |
7C |
0C |
18 |
30 |
60 |
7C |
00 |
D2 |
FEF0 |
00 |
00 |
3C |
66 |
60 |
66 |
3C |
00 |
92 |
FE30 |
00 |
1E |
18 |
18 |
18 |
18 |
1E |
00 |
CA |
FEF8 |
00 |
00 |
7E |
18 |
18 |
18 |
18 |
00 |
D4 |
FE38 |
00 |
C0 |
60 |
30 |
18 |
0C |
06 |
00 |
B0 |
FF00 |
00 |
00 |
66 |
66 |
3E |
06 |
3C |
00 |
4B |
FE40 |
00 |
78 |
18 |
18 |
18 |
18 |
78 |
00 |
8E |
FF08 |
00 |
00 |
D6 |
D6 |
7C |
D6 |
D6 |
00 |
DB |
FE48 |
00 |
18 |
3C |
5A |
18 |
18 |
18 |
00 |
3C |
FF10 |
00 |
00 |
7C |
66 |
7C |
66 |
7C |
00 |
4F |
FE50 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
FF |
4D |
FF18 |
00 |
00 |
60 |
60 |
7C |
66 |
7C |
00 |
35 |
FE58 |
00 |
00 |
DC |
F6 |
F6 |
F6 |
DC |
00 |
F0 |
FF20 |
00 |
00 |
C6 |
C6 |
F6 |
DE |
F6 |
00 |
75 |
FE60 |
00 |
00 |
3C |
66 |
7E |
66 |
66 |
00 |
4A |
FF28 |
00 |
00 |
3C |
66 |
0C |
66 |
3C |
00 |
77 |
FE68 |
00 |
00 |
7C |
60 |
7C |
66 |
7C |
00 |
A0 |
FF30 |
00 |
00 |
C6 |
D6 |
D6 |
D6 |
FE |
00 |
75 |
FE70 |
00 |
00 |
6C |
6C |
6C |
6C |
7E |
06 |
A2 |
FF38 |
00 |
00 |
78 |
0C |
3C |
0C |
78 |
00 |
7B |
FE78 |
00 |
00 |
3C |
6C |
6C |
6C |
FE |
C6 |
BA |
FF40 |
00 |
00 |
C6 |
D6 |
D6 |
D6 |
FF |
03 |
89 |
FE80 |
00 |
00 |
7E |
60 |
7C |
60 |
7E |
00 |
B6 |
FF48 |
00 |
00 |
66 |
66 |
3E |
06 |
06 |
00 |
5D |
FE88 |
00 |
00 |
7C |
D6 |
D6 |
7C |
10 |
00 |
3A |
FF50 |
00 |
00 |
70 |
30 |
3C |
36 |
3C |
00 |
9D |
После того, как работа по вводу этих кодов будет завершена, запишите полученный символьный набор на магнитную ленту: SAVE "chr" CODE 61600,768. Он пригодится Вам и для других программ.
Перед тем, как набирать текст БЕЙСИК-программы, сделайте следующее: CLEAR 64599: LOAD "chr"CODE POKE 23606,88: POKE 23607,251
Теперь включен загруженный символьный набор. Попробуйте набирать БЕЙСИК программу. Токены ключевых слов "Спектрума", состоящие из заглавных латинских букв, будут печататься как обычно. Текст, набираемый при помощи буквенных клавишей при отключенном режиме CAPS LOCK, будет набираться русскими буквами. Так же он будет выглядеть и на экране. При включений регистра CAPS LOCK, текст будет набираться латинскими буквами. При этом, правда, придется обходиться только заглавными русскими и латинскими буквами, но зато это позволит легко совмещать русский и английский текст внутри одного оператора PRINT. Имена переменных для удобства чтения набираются заглавными латинскими буквами.
Кроме формирования самого символьного набора, в программу вводятся дополнительные строки. Это строка 2, загружающая символьный набор. С нее должен происходить автостарт программы. Еще это переключатели шрифта, строки 8 и 9 (могут быть любые другие номера, такие, какие удобно вписываются в программу). Используя команду GO SUB 8, можно включить загруженный символьный набор, а командой GO SUB 9 -выключить его. Эти команды можно как включать в БЕЙСИК-строки, так и подавать напрямую, находясь в режиме редактирования БЕЙСИК-строк.
**** RFRICRH SEEDS ****
К*******************************
ВПЫ ХОД. ЧКПЖНТЕ лчнкч.с
Следует также предупредить тех пользователей, которые имеют БЕТА-ДИСК
I I I I I ^МНИ I I I ■!■ I I I I I I I I I
П В С □ Е F ХОД G Н I J К L
интерфейс. В программах, в которых используется блок UDG-графики, стандартно расположенный после рестарта компьютера с адреса 65368, полезно бывает перед стартом программы включать еще и конструкцию, задающую системную переменную UDG: POKE 23675,88: POKE 23676,255
Это, казалось бы лишнее, так как после рестарта компьютера в указанные ячейках и так находятся указанные числа. Дело в том, что значения этих ячеек могли быть изменены в процессе работы дискового загрузчика "boot". Так некорректно ведет себя, например, в общем-то очень хороший и широко распространенный загрузчик "MOA-SERVICE". Эта рекомендация убережет Вас от возможных "накладок" и в других случаях.
А теперь, когда есть определенность с вопросом русификации, можно переходить непосредственно к тексту программы "AFRICAN SEEDS".
1 GO TO 1000
2 CLEAR 64599:LOAD "CHR" CODE 64600
3 POKE 23675,88:POKE 23676,255:RESTORE 2100:FOR P=0 TO 95:READ G:POKE USR "A"+P,G:NEXT P
4 RUN
5 SAVE "AFRICA"LINE 2:SAVE "CHR" CODE 64600,768:STOP
8 POKE 23606,88:POKE 23607,251:RETURN:REM RUS
9 POKE 23606,0:POKE 23607,60:RETURN:REM LAT
100 PRINT AT 17, CODE A$(H);BRIGHT 1;PAPER 2;SCREEN$(17, CODE A$(H)):LET S=H(H):LET H(H)=0:LET D=D+1
110 IF S THEN LET S=S-1:LET H=H+1-12*(H=12):LET H(H)=H(H)+1:GO TO 110
200 PRINT AT 17, CODE A$(H);BRIGHT 1;INK 0;PAPER 2;SCREEN$(17, CODE A$(H)):IF H(H)<>1 THEN
FOR B=10 TO 10+H(H):BEEP .002,B+D:NEXT B:RETURN 210 PRINT AT 17, CODE A$(H);BRIGHT 1;PAPER 5;SCREEN$(17, CODE A$(H));:LET END=1:LET OP=13-H:FOR B=20 TO 20+H(OP):BEEP .02,B:NEXT B:IF (NOT ZX AND OP<7) OR (ZX AND OP>6) OR NOT H(OP) THEN RETURN
220 LET WIN=H(OP):LET H(OP)=0:LET S(2-ZX)=S(2-ZX)+WIN*SC:PRINT AT 17, CODE A$(OP);FLASH 1;BRIGHT 1;PAPER 5;SCREEN$(17, CODE A$(OP)):FOR B=30 TO 30+WIN:BEEP .025,B:NEXT B:RETURN
300 PRINT AT 19,25;" ";AT 19,11;BRIGHT 1;PAPER (D-8*INT (D/8));INK 9;" ХОД ";D;"
";:FOR P=1 TO 12:RESTORE 2300+B(P):READ N$ 330 PRINT AT CODE X$(P), CODE Y$(P);N$:LET H(P)=B(P):BEEP .005,D+B(P):NEXT P 340 PRINT AT 15,11;S(2);:PRINT AT 15,20;S(1):PRINT AT 19,11;L$:RETURN 400 BRIGHT 0:PRINT AT 17,0;PAPER 4;"A B C D E F ХОД G H I J K L":RETURN 500 PRINT ("ЧИСЛО ПРОИГРАННЫХ ВАМИ ОЧКОВ: "+STR$ (S(1)-S(2)) AND S(1)>S(2))+("ЧИСЛО
ВЫИГРАННЫХ ВАМИ ОЧКОВ: "+STR$ (S(2)-S(1)) AND S(1)<S(2)) 510 GO SUB 400
520 PRINT AT 0,0:INPUT "ХОТИТЕ СЫГРАТЬ ЕЩЕ РАЗ? (Y) ";LINE U$:IF CODE U$=121-32*(U$="Y")
THEN GO TO 1040 530 STOP
580 PRINT AT 18,0;"ЛУНКИ ПРОТИВНИКА ПУСТЫ. ВСЕ ОС-ТАВШИЕСЯ ФИШКИ ПЕРЕШЛИ К НЕМУ." 600 PRINT AT 20,0;"ИГРА ";("ПРОДОЛЖАЕТСЯ." AND S(1)=S(2));("ЗАКОНЧЕНА." AND S(1)<>S(2)):GO TO 500
700 IF S(1)>24 OR S(2)>24 THEN GO TO 600
710 IF S(1)+S(2)>39 AND NOT WIN THEN LET C=C+1:IF C>10 THEN GO TO 600 720 RETURN
1000 GO SUB 8:POKE 23658,8:LET D=0:DIM S(2):DIM B(12):DIM H(12):DIM A$(12):DIM C$(12):DIM X$(12):DIM Y$(12)
1020 GO SUB 2000:PRINT AT 19,1;INK 0;"ВЫ БУДЕТЕ СМОТРЕТЬ ИНСТРУКЦИЮ?"^ 21,4;"(ЕСЛИ ДА, ТО
ВВЕДИТЕ Y)":INPUT LINE U$:IF CODE U$+32*(U$="Y")=121 THEN GO SUB 2400
1030 RESTORE 2160:FOR N=1 TO 12:READ A:LET A$(N)=CHR$ A:NEXT N 1040 GO SUB 2020
1060 GO SUB 2080:INPUT LINE U$:IF U$<"0" OR U$>"9" THEN GO TO 1060
1070 LET L=VAL U$+20*(U$="0"):PRINT AT 15,0;" ":FOR P=15 TO 21 STEP
2:PRINT AT P,17;" ":NEXT P:LET L$="УРОВЕНЬ "+U$+" "
1080 RESTORE 3000:FOR N=1 TO 12:READ X,Y:PRINT AT X,Y;" ";AT X+2-4*(N>6),Y+1;INK 7;PAPER
0;BRIGHT 1;CHR$ (64+N):LET X$(N)=CHR$ X:LET Y$(N)=CHR$ Y:NEXT N 1090 PRINT AT 15,0;BRIGHT 1;PAPER 1;INK 7;"ИГРОК СЧЕТ КОМПЬЮТЕР"
1100 DIM M(12):LET D=0:LET T=0:LET SC=0:LET C=0:LET S(1)=0:LET S(2)=0:FOR P=1 TO 12:LET
B(P)=4:LET H(P)=4:NEXT P 1110 RANDOMIZE :LET ZX=INT (RND *2)
GO SUB 300:GO SUB 400
IF ZX THEN PRINT AT 17,19;BRIGHT 1;INK 7;PAPER 1;">":INPUT "ПЕРВЫЙ ХОД ВЫПАЛ КОМПЬЮТЕРУ. НАЖМИТЕ ENTER, ЕСЛИ ГОТОВЫ. ";LINE U$:LET PREF=INT (RND *7+6):GO TO 1400
IF NOT ZX THEN GO TO 1500 GO SUB 700
IF NOT (B(7)+B(8)+B(9)+B(10)+B(11)+B(12)) THEN LET S(1)=S(1)+48-S(1)-S(2):GO TO 580 LET OP=0:LET SC=0:LET WIN=0:DIM M(12)
PRINT AT 17,19;BRIGHT 1;INK 7;PAPER 1;">":INPUT "НАЖМИТЕ ENTER, ПОЖАЛУЙСТА.";LINE U$:GO
SUB 400:IF U$=" STOP " THEN GO TO 600 PRINT AT 19,26;"АНАЛИЗ":FOR P=7 TO 12:LET D=0:LET END=0:LET WIN=0:LET OP=0:IF NOT B(P)
THEN GO TO 1350 LET H=P:LET M=P:FOR K=1 TO 12:LET H(K)=B(K):NEXT K GO SUB 400:GO SUB 100:IF D<1 AND NOT END THEN GO TO 1330 LET M(P)=WIN*END NEXT P
LET PREF=7:PRINT AT 19,26;"ОЦЕНКА"^ P=7 TO 12:IF M(P)>M(PREF) THENLET PREF=P NEXT P
LET B=0:FOR P=7 TO 12:IF P<>PREF THEN IF B(P)>0 THEN IF M(P)=M(PREF) THEN LET B=B+1:LET M(B)=P
NEXT P:IF B THEN LET PREF=M(INT (RND *B)+1)
LET END=0:LET D=0:LET OP=0:LET SC=1:LET H=PREF:LET WIN=0:GO SUB 400:FOR P=1 TO 12:LET H(P)=B(P):NEXT P
PRINT AT 17, CODE A$(H);BRIGHT 1;PAPER 2;SCREEN$(17, CODE A$(H)):GO SUB 100
FOR P=1 TO 12:LET B(P)=H(P):NEXT P:GO SUB 300:IF NOT END THEN GO SUB 400:GO TO 1410
GO SUB 700
IF NOT (B(1)+B(2)+B(3)+B(4)+B(5)+B(6)) THEN LET S(2)=S(2)+48-S(1)-S(2):GO TO 580 PRINT AT 17,12;BRIGHT 1;INK 7;PAPER 1;"<":POKE 23658,8:INPUT "ВАШ ХОД. УКАЖИТЕ
ЛУНКУ/'^^ U$:IF U$=" STOP " THEN GO TO 600 LET H= CODE U$-64-32*(U$>"Z"):GO SUB 400:IF H<0 OR H>6 THEN PRINT #0;"ЗАПРЕЩЕННЫЙ
ХОД......ПОВТОРИТЕ, ПОЖАЛУЙСТА.":BEEP 1.5,0:GO TO 1500
LET D=0:LET ZX=0:LET SC=1:LET WIN=0:LET OP=0:IF NOT B(H) THEN GO TO 1500
PRINT AT 17, CODE A$(H);BRIGHT 1;PAPER 2;SCREEN$(17, CODE A$(H)):GO SUB 100
FOR P=1 TO 12:LET B(P)=H(P):NEXT P:IF NOT OP THEN GO SUB 300:GO SUB 400:GO TO 1560
GO SUB 300:LET ZX=1
GO TO 1200
BORDER 4:PAPER 4:INK 2:CLS:PRINT " "
■ I ■ HH H I
I I I ■ ■ I ■■ I
IIII I I I I II I I I I
PRINT "
■ |
II |
II I I |
III |
III |
II I IIII |
I |
I |
II I II |
PRINT AT 16,3;INK 0;"MIKE EDWARDS + ""ИНФОРКОМ......:RETURN
BORDER 6:PAPER 6:INK 0:CLS:PRINT PAPER 4;"**** AFRICAN SEEDS ************************************
PRINT ' "
■■■■■■■■■■■■В
IIKHLIIKHLIIKHLIIKHLIIKHLIIKHLI
PRINT PAPER 1'"
PRINT ' "
■ ■■■■■■■■■■■I
|KhLHKhLIIKhLIIKhLIIKhLIIKhLI
RETURN
PRINT AT 15,0;"ВВЕДИТЕ УРОВЕНЬ: 9=ТЯЖЕЛЫЙ""TAB19;"0=ЭКСПЕРТ" RETURN
DATA 0,0,0,24,24,0,0,0 DATA 0,24,24,0,0,24,24,0 DATA 24,24,0,24,24,0,24,24 DATA 0,102,102,0,0,102,102,0 24,24,0,195,195
DATA 195,195,0
DATA 102,102,0
DATA 102,102,0
DATA 219,219,0
102,102,0,102,102 219,219,0,102,102 102,102,0,219,219 DATA 255,255,255,255,31,7,3,1 DATA 255,255,255,255,248,224,192,128 DATA 128,192,224,248,255,255,255,255 DATA 1,3,7,31,255,255,255,255 DATA 0,2,4,6,8,10,21,23,25,27,29,31 DATA " DATA " A DATA " B DATA "AAA DATA " D DATA " E DATA "BBB DATA "BCB DATA "BDB DATA "CCC DATA "CDC DATA "CEC DATA "DDD DATA "DED DATA "EDE DATA "FCF DATA "FDF DATA "GCG DATA "FFF DATA "HCH DATA "HDH DATA "GGG DATA "HFH DATA "HGH DATA "HHH DATA " 25 DATA " 26 DATA " 27 DATA " 28 DATA " 29 DATA " 30
BORDER 4:PAPER 4:INK 0:CLS:PRINT "**** ************************************"
PRINT ""
ИГРА ОСНОВАНА НА АФРИКАНСКИХ ИГРАХ ТИПА ""МАНКАЛА"", ХОТЯ ЕЕ ПРАВИЛА ПРОЩЕ, ЧЕМ У БОЛЬШИНСТВА ЕЕ ПРЕДШЕСТВЕННИЦ." PRINT '"
ИМЕЕТСЯ 12 ЛУНОК С ЧЕТЫРЬМЯ ФИШКАМИ КАЖДАЯ. ОНИ ПОРОВНУ РАЗДЕЛЕНЫ МЕЖДУ ИГРОКАМИ. ВАША ЦЕЛЬ - НАБРАТЬ ОЧКИ, СОБИРАЯ КАК МОЖНО БОЛЬШЕ ФИШЕК. 25 ОЧКОВ ОБЕСПЕЧИВАЕТ ПОБЕДУ." INPUT "ДЛЯ ПРОДОЛЖЕНИЯ НАЖМИТЕ ENTER " BORDER 4:PAPER 4:INK 0:CLS:PRINT "****
2080
2090 2100 2101 2102
2103
2104
2105
2106
2107
2108
2109
2110 2111 2160
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330 2400
2410
AFRICAN SEEDS
LINE U$
AFRICAN SEEDS
1-3=НОВИЧОК""TAB17;"4-6=ЛЕГКИЙ""TAB17;"7-
************************************
PRINT ""
ИГРОКИ ПО ОЧЕРЕДИ БЕРУТ ФИШКИ ИЗ ЛЮБОЙ СВОЕЙ ЛУНКИ И РАССЫПАЮТ ИХ ПО ОДНОЙ В СОСЕДНИЕ ЛУНКИ ПРОТИВ ЧАСОВОЙ СТРЕЛКИ, НАЧИНАЯ С ЛУНКИ, НАХОДЯЩЕЙСЯ ПО-СОСЕД-СТВУ С НАЧАЛЬНОЙ."
PRINT '"
ЕСЛИ ПОСЛЕДНЯЯ ФИШКА ОКАЖЕТСЯ В ЗАНЯТОЙ ЛУНКЕ, ТО ИГРОК БЕРЕТ ФИШКИ ИЗ НЕЕ И ПРОДОЛЖАЕТ ХОД В ТОМ ЖЕ ПОРЯДКЕ. ТАК ПРОДОЛЖАЕТСЯ, ПОКА ХОД НЕ ЗАВЕРШИТСЯ В ПУСТОЙ ЛУНКЕ."
PRINT '"
ЕСЛИ ХОД ЗАКАНЧИВАЕТСЯ В ПУСТОЙ ЛУНКЕ ПРОТИВОПОЛОЖНОГО РЯДА, ИЛИ НАПРОТИВ ПУСТОЙ ЛУНКИ, ТО ХОД ПЕРЕХОДИТ К ПРОТИВНИКУ."
INPUT "ДЛЯ ПРОДОЛЖЕНИЯ НАЖМИТЕ ENTER ";LINE U$
BORDER 4:PAPER 4:INK 0:CLS:PRINT "**** AFRICAN SEEDS ************************************"
PRINT ""
ЗАХВАТ ФИШЕК ВОЗМОЖЕН ТОЛЬКО ЕСЛИ ПОСЛЕДНЯЯ ФИШКА В ХОДЕ ПОПАДАЕТ В ПУСТУЮ ЛУНКУ СВОЕГО РЯДА, НАПРОТИВ ЗАНЯТОЙ ЛУНКИ ПРОТИВНИКА. ТОГДА ФИШКИ ПРОТИВНИКА ИЗЫМАЮТСЯ, А СЧЕТ УВЕЛИЧИВАЕТСЯ."
PRINT ' "
ИГРА ПРОДОЛЖАЕТСЯ, ПОКА ОДИН ИЗ ИГРОКОВ НЕ НАБЕРЕТ БОЛЕЕ 24 ОЧКОВ ИЛИ ОБА ПАРТНЕРА НЕ СОГЛАСЯТСЯ НА НИЧЬЮ."
PRINT ' "
ВНИМАНИЕ! ЕСЛИ ВЫ ОСТАВИТЕ СВОЕГО ПРОТИВНИКА БЕЗ ФИШЕК И БЕЗ ХОДА, ТО ВСЕ ФИШКИ, ИМЕЮЩИЕСЯ НА ДОСКЕ, ПЕРЕХОДЯТК НЕМУ."
INPUT "ДЛЯ ПРОДОЛЖЕНИЯ НАЖМИТЕ ENTER ";LINE U$
BORDER 4:PAPER 4:INK 0:CLS:PRINT "**** AFRICAN SEEDS ************************************"
PRINT " "
ПРАВО ПЕРВОГО ХОДА ОПРЕДЕЛЯЕТ
КОМПЬЮТЕР СЛУЧАЙНЫМ ОБРАЗОМ.......
ВЫ ИМЕЕТЕ ЛУНКИ ОТ A ДО F. КОМ ПЬЮТЕР ИМЕЕТ ЛУНКИ ОТ G ДО L."
PRINT ' "
КОГДА БУДЕТ ВАШ ХОД, ВВЕДИТЕ СИМВОЛ ТОЙ ЛУНКИ, ИЗ КОТОРОЙ ВЫ ХОТИТЕ СДЕЛАТЬ ХОД. КОМПЬЮТЕР ЖДЕТ НАЖАТИЯ ENTER ДЛЯ НАЧАЛА СВОЕГО ХОДА."
PRINT ' "
КОГДА ИГРА БУДЕТ ЗАВЕРШЕНА, КОМПЬЮТЕР ПОДСЧИТАЕТ И ОБЪЯВИТ РЕЗУЛЬТАТ. МОЖНО ПРЕРВАТЬ ИГРУ В ЛЮБОЕ ВРЕМЯ, ВВЕДЯ: "" STOP ""."
INPUT "
ВВЕДИТЕ R ДЛЯ ПОВТОРА ИНСТРУКЦИИ ИЛИ ENTER, ЧТОБЫ НАЧАТЬ ИГРУ. ";LINE З$:IF
RETURN
DATA 11,2,11,7,11,12,11,17,11,22,11,27,5,27
CODE З$=114-32*(З$="R") THEN GO TO 2400 ,5,22,5,17,5,12,5,7,5,2
Набирая программу, Вы периодически можете записывать результат на магнитную ленту, выполняя: RUN 5. При наборе программы обратите внимание, пожалуйста, на те места, где набор происходит с использованием графического регистра. Это строки 20002005, в которых используется символ с кодом 143 (регистр [G], затем CS+8). Это также символы с кодами 131, 140, 143 блочной графики и символы "I"-"L" UDG-графики в строках 2030, 2050. Символы UDG-грaфики "A"-"H" используются при наборе строк 2300-2324.
Автостарт программы происходит со строки 2, где прежде всего резервируется место дли расположения загружаемого символьного набора, путем переустановки значения RAMTOP оператором CLEAR. После загрузки символьного набора происходит задание банка символов UDG-графики. На этом подготовку можно считать законченной. Далее строка 4 передает управление на начало программы. При отладке, после остановки программы, ее можно запустить командой RUN c начальной строки.
Так как мы используем русско-латинский символьный набор, то перед тем, как будет произведен ввод параметров при помощи оператора INPUT, корректно будет принудительно включать режим CAPS LOCK (устанавливать курсор [C]), так как вводиться должны параметры в виде английских букв. Это происходит, например, в начале выполнения программы, в строке 1000 подачей команды POKE 23658,6, а также в других местах.
Подпрограмма GO SUB 2000 в строке 1020 - это вывод на экран титульной заставки. После этого происходит запрос для вывода инструкции. Результат запроса (переменная U$) анализируется, причем результат не зависит от того, нажата ли клавиша "Y" в режиме CAPS LOCK или нет. В том случае, если нажата клавиша "Y", происходит вызов подпрограммы GO SUB 2400, которая выводит на экран инструкцию с правилами игры.
Подпрограмма GO SUB 2020 в строке 1040 обеспечивает прорисовку игрового поля -игровые лунки играющего и компьютера.
В строке 1060 происходит ввод уровня сложности игры. Кстати, при тестировании программы выяснилось, что эта величина нигде дальше в программе не участвует. Непонятно, для чего автор ввел этот параметр. Может быть, рассчитывая в дальнейшем на усовершенствование игры, или на то, что "пытливые умы" сами сделают такое усовершенствование. В общем, есть простор для творческого поиска. А можно пойти по другому пути: просто исключить все, что касается ввода уровня. Но нам кажется, что вариант с заданием уровня (пусть фиктивным) смотрится динамичнее.
Далее идет подготовка игрового поля и предустановка исходных данных. В строке 1110 происходит определение того, кто делает первый ход. Если право первого хода выпало компьютеру, тогда после нажатия ENTER программа переходит на строку 1400. Кстати, свой первый ход компьютер делает случайным образом выбирая одну из своих лунок. Это происходит путем задания переменной PREF в строке 1150. Но это касается только первого хода. В дальнейшем, перед тем, как сделать ход, компьютер рассчитывает наиболее удачный вариант. Это осуществляется в строках, начиная с 1200. В этой строке, если право очередного хода имеет человек, то происходит переход на строку 1500. Если ход принадлежит компьютеру, то ожидается нажатие ENTER, после чего ситуация анализируется (со строки 1300) а затем, в строке 1360, выбирается наиболее предпочтительный вариант PREF. Далее, со строки 1400 происходят действия, непосредственно связанные с выполнением кода.
Если очередной ход делает человек, то происходит переход на строку 1500. На эту строку мы попадаем сразу после того, как будет закончен ход компьютера (в строках с 1400) или в начале игры, в случае первого хода, (см. строки 1110-1200). В конце этой части программы происходит передача хода компьютеру (строка 1580) и повторение цикла со строки 1200.
И, в заключение, предлагаем еще одну игру для тех, кто любит программы, развивающие внимательность, наблюдательность и быстроту реакции.