CASH-FLOW
Игра имитирует игровой автомат. Монета падает вниз, ударяясь о неподвижные штыри. Таким образом, путь монеты в значительной мере случаен. В нижней части игрового поля монета попадает в один из шести монетоприемников, в каждом из которых уже может находиться до четырех монет. Ваша задача - довести их количество до пяти. Тогда монеты будут выданы Вам в качестве приза (разумеется, при наличии у вашего "Спектрума" соответствующей приставки для выдачи "наличных"). Выигранные монеты можно использовать для продолжения игры. Результат игры в основном зависит от момента, когда Вы бросаете монету. В то же время, у Вас есть возможность подтолкнуть падающую монету в любом направлении, но только один раз и только в верхней части доски со штырями. Монетоприемник N 4 "проглатывает" все монеты, поэтому его следует избегать всеми силами. Всего на игру Вам дается 6 монет по 10 пенсов каждая. Постарайтесь как можно раньше получить выигрыш и продолжать игру как можно дольше.
1 GO TO 10
2 CLEAR 64599:LOAD "CHR" CODE 64600
3 POKE 23606,88:POKE 23607,251
4 GO SUB 3000:RUN
5 SAVE "CASH-FLOW"LINE 2:SAVE "CHR" CODE 64600,768:STOP 10 POKE 23658,8:BORDER 5:PAPER 6:INK 1
15 LET OW=0
20 LET A$="AB":LET B$="CD" 25 GO SUB 2500 30 CLS
35 FOR N=0 TO 21:DIM I$(26):PRINT PAPER 6;AT N,3;I$:DIM J$(2):PRINT PAPER 5;AT N,0;J$;AT
N,30;J$:NEXT N 40 FOR N=0 TO 192 STEP 32
45 CIRCLE 32+N,77,2:BEEP .05,10:CIRCLE 32+N,109,2:BEEP .05,20:CIRCLE 32+N,141,2:BEEP .05,30 50 NEXT N
55 FOR N=0 TO 160 STEP 32
60 CIRCLE 48+N,93,2:BEEP .05,40:CIRCLE 48+N,125,2:BEEP .05,20 65 NEXT N
70 DEF FN T()=INT ((65536*PEEK 23674+256*PEEK 23673+PEEK 23672)/50) 72 LET T1=FN T() 75 FOR N=0 TO 21
80 PRINT INK 4;AT N,2;"F";AT N,29;"E"
85 IF N>12 THEN PRINT INK 2;AT N,3;"EF EF EF EF EF EF EF" 90 NEXT N
95 PLOT INK 3;24,159:DRAW INK 3;207,0 100 LET W=0:LET L=0 120 GO TO 1000
130 PRINT AT X,Y;" ";AT X+1,Y;" "
135 IF INKEY$="Q" AND L>40 THEN LET NW=W-L:GO TO 2000
140 LET K=2*COS (PI*(INT (RND *2)))
150 LET X=X+2
151 IF I=0 AND M<4 AND Y<=25 AND INKEY$="P" THEN BEEP .05,32:LET Y=Y+2:LET I=1:GO TO 160
152 IF I=0 OR M<4 AND Y>=5 AND INKEY$="O" THEN BEEP .05,32:LET Y=Y-2:LET I=1:GO TO 160
154 IF K>0 AND Y=27 THEN LET Y=Y-K:GO TO 160
155 IF K>0 AND Y<26 THEN LET Y=Y+K
157 IF K<0 AND Y=3 THEN LET Y=Y-K:GO TO 160
158 IF K<0 AND Y>4 THEN LET Y=Y+K 160 PRINT INK 1;AT X,Y;A$;AT X+1,Y;B$
165 BEEP .05,20
166 FOR N=1 TO 100:NEXT N 170 LET M=M+1
180 IF M=6 THEN GO TO 500 190 GO TO 130
500 IF Y=5 THEN LET G=A:LET A=A+1:GO TO 530
505 IF Y=9 THEN LET G=B:LET B=B+1:GO TO 530
510 IF Y=13 THEN LET G=C:LET C=C+1:GO TO 530
515 IF Y=17 THEN LET G=0:GO TO 530
520 IF Y=21 THEN LET G=E:LET E=E+1:GO TO 530
525 IF Y=25 THEN LET G=F:LET F=F+1
530 IF G=4 THEN GO TO 600
540 FOR N=0 TO 3-G:PRINT INK 1;AT 12+2*N,Y;" ";AT 13+2*N,Y;" ";AT 14+2*N,Y;A$;AT
15+2*N,Y;B$ 550 PAUSE 20 560 NEXT N
565 IF Y=17 THEN PRINT AT 20,17;" ";AT 21,17;" ":BEEP 1,0
568 IF CR<=0 THEN GO TO 2000
570 PRINT INK 2;FLASH 1;AT 1,20;"НАЖМИТЕ A"
575 IF INKEY$="A" THEN PRINT INK 2;FLASH 1;AT 1,28;"Z":GO TO 1100
576 LET T=FN T():IF T>T1+240 THEN GO TO 1990
578 IF INKEY$="Q" AND L>40 THEN LET NW=W-L:GO TO 2000 580 GO TO 575 600 BEEP 1,40 604 FOR N=0 TO 4
606 LET W=W+10:LET NW=W-L:LET CR=NW+60
608 PRINT AT 12+2*N,Y;" ";AT 13+2*N,Y;" ":BEEP .1,30:PAUSE 20
610 PRINT AT 0,15;" "
612 PRINT BRIGHT 1;FLASH 1;AT 0,15;CR
615 NEXT N
618 IF CR<=0 THEN GO TO 2000
620 IF Y=5 THEN LET A=0
621 IF Y=9 THEN LET B=0
622 IF Y=13 THEN LET C=0
624 IF Y=21 THEN LET E=0
625 IF Y=25 THEN LET F=0
630 PRINT INK 2;FLASH 1;AT 1,20;"НАЖМИТЕ A"
635 IF INKEY$="A" THEN PRINT INK 2;FLASH 1;AT 1,28;"Z":GO TO 1100
638 IF INKEY$="Q" AND L>40 THEN GO TO 2000 640 GO TO 635
1000 |
LET 2* |
A=INT (RND *3):FOR N=1 TO N,5;A$:BEEP .05,0:NEXT N |
A: |
IF |
A<>0 |
THEN |
PRINT |
INK |
1 |
AT |
23- |
2*N |
,5;BJ |
В;AT 22- |
1010 |
LET 2* |
B=INT (RND *3):FOR N=1 TO N,9;A$:BEEP .05,10:NEXT N |
B: |
IF |
B<>0 |
THEN |
PRINT |
INK |
1 |
AT |
23- |
2*N |
,9;BJ |
B;AT 22- |
1020 |
LET 2* |
C=INT (RND *5):FOR N=1 TO N,13;A$:BEEP .05,20:NEXT N |
C: |
IF |
C<>0 |
THEN |
PRINT |
INK |
1 |
AT |
23- |
2*N |
,13; |
3$;AT 22 |
1040 |
LET 2* |
E=INT (RND *5):FOR N=1 TO N,21;A$:BEEP .05,30:NEXT N |
E: |
IF |
E<>0 |
THEN |
PRINT |
INK |
1 |
AT |
23- |
2*N |
,21; |
3$;AT 22 |
1050 |
LET |
F=INT (RND *3):FOR N=1 TO |
F: |
IF |
F<>0 |
THEN |
PRINT |
INK |
1 |
AT |
23- |
2*N |
,25; |
3$;AT 22 |
2*N,25;A$:BEEP .05,30:NEXT N
1055 LET CR=60:PRINT BRIGHT 1;FLASH 1;AT 0,15;CR
1060 PRINT INK 2;FLASH 1;AT 1,20;"НАЖМИТЕ A"
1065 IF INKEY$="A" THEN PRINT INK 2;FLASH 1;AT 1,28;"Z":GO TO 1100
1068 IF INKEY$="Q" AND L>40 THEN GO TO 2000
1070 GO TO 1065
1100 LET L=L+10:LET NW=W-L:LET CR=NW+60:LET I=0
1101 PRINT AT 0,15;" "
1102 PRINT BRIGHT 1;FLASH 1;AT 0,15;CR
1104 PRINT INK 1;AT 0,3;A$;AT 1,3;B$:PAUSE 6
1105 FOR N=3 TO 27
1110 PRINT AT 0,N;" ";AT 1,N;" "
1115 IF N=27 AND CR<=0 THEN GO TO 2000
IF N=27 THEN GO TO 1060
PRINT INK 1;AT 0,N+1;A$;AT 1,N+1;B$
PAUSE 6
IF INKEY$="Z" AND INT (N/2)<>INT ((N-1)/2) THEN LET Y=N+1:PRINT AT 1,20;" ":GO
TO 1200 NEXT N
LET X=0:LET M=0
PRINT AT X,Y;" ";AT X+1,Y;" "
PRINT AT 0,15;" "
PRINT BRIGHT 1;FLASH 1;AT 0,15;CR
LET X=X+2:LET M=M+1
PRINT INK 1;AT X,Y;A$;AT X+1,Y;B$
BEEP .05,20:FOR N=1 TO 50:NEXT N
IF INT ((Y+1)/4)=INT ((Y+3)/4) THEN GO TO 1300
IF M=2 THEN GO TO 1300
GO TO 1210
PRINT AT X,Y;" ";AT X+1,Y;" " PLOT INK 3;24,159:DRAW INK 3;207,0 GO TO 135
PRINT AT 0,15;" ";AT 1,20;" "
PRINT INK 1;FLASH 1;AT 1,8;" ИГРА ОКОНЧЕНА " FOR N=0 TO 400:NEXT N PRINT AT 0,15;" ";AT 1,20;" "
LET OW=OW+NW
IF OW>=0 AND INT ((OW-10)/100)=INT (OW/100) THEN PRINT INK 7;PAPER 1;BRIGHT 1;AT
1,4;"ИТОГОВЫЙ ВЫИГРЫШ #";OW/100;"O " IF OW>=0 AND INT ((OW-10)/100)<>INT (OW/100) THEN PRINT INK 7;PAPER 1;BRIGHT 1;AT
1,4;"ИТОГОВЫЙ ВЫИГРЫШ #";OW/100;".O" IF OW<0 AND INT ((OW-10)/100)=INT (OW/100) THEN PRINT INK 7;PAPER 1;BRIGHT 1;AT
1,4;"ИТОГОВЫЙ ПРОИГРЫШ #";-OW/100;"O " IF OW<0 AND INT ((OW-10)/100)<>INT (OW/100) THEN PRINT INK 7;PAPER 1;BRIGHT 1;AT
1,4;"ИТОГОВЫЙ ПРОИГРЫШ #";-OW/100;".O" FOR N=0 TO 8 DIM I$(26)
PRINT PAPER 2;BRIGHT 1;AT 13+N,3;I$ NEXT N
PRINT INK 7;PAPER 2;AT 14,4;" ВЫ ИЗРАСХОДОВАЛИ - ";BRIGHT 1;L PRINT INK 7;PAPER 2;AT 16,7;" И ПОЛУЧИЛИ - ";BRIGHT 1;W
IF NW>=0 THEN PRINT INK 7;PAPER 2;AT 18,5;"ВАША ПРИБЫЛЬ - ";INK 7;PAPER 0;BRIGHT 1;AT 18,22;NW
IF NW<0 THEN PRINT INK 7;PAPER 2;AT 18,7;"ВАШИ ПОТЕРИ - ";INK 7;PAPER 0;FLASH 1;BRIGHT 1;-NW
PRINT INK 7;PAPER 1;BRIGHT 1;FLASH 1;AT 20,4;"СЫГРАЕТЕ ЕЩЕ РАЗ? ДА-^>" IF T>T1+240 AND INKEY$="Y" THEN LET T1=FN T():LET OW=0:GO TO 2100 IF INKEY$="Y" THEN GO TO 2100 GO TO 2040
PRINT AT 1,3;" "
FOR N=0 TO 8 DIM I$(26)
PRINT PAPER 6;AT 13+N,3;I$ NEXT N GO TO 75
DIM I$(704):PRINT AT 0,0;I$
PLOT INK 6;26,144:DRAW 0,-32,11*PI/10:BEEP .05,10 PAUSE 30
PLOT 32,112:DRAW 12,32:BEEP .05,10:DRAW 12,-32:BEEP .05,10:PLOT 35,120:DRAW 18,0:BEEP .05,10
PLOT INK 6;80,136:DRAW -8,-8,3*PI/2:BEEP .05,10:PLOT INK 6;64,120:DRAW 8,8,3*PI/2:BEEP
.05,10 PAUSE 30
PLOT 88,112:DRAW 0,32:BEEP .05,10:PLOT 104,112:DRAW 0,32:BEEP .05,10:PLOT 88,128:DRAW
16,0:BEEP .05,10 PAUSE 30
PLOT 116,128:DRAW 8,0:BEEP .05,10 PAUSE 30
FOR N=0 TO 3:PRINT INK 1: 15+2*N,Q;B$:BEEP .05,Q: I FOR N=0 TO 2:PRINT INK 1: 15+2*N,Q;B$:BEEP .05,Q:I FOR N=0 TO 1:PRINT INK 1:
15+2*N,Q;B$:BEEP .05,Q:NEXT N PRINT INK 1;AT 14,Q;A$;AT 15,Q;B$:BEEP .05,Q LET Q=Q+4:IF Q<29 THEN GO TO 2560
IF Q=29 THEN PRINT FLASH 1;BRIGHT 1;INK 1;AT 10,1;"ВАМ -НУЖНА ИНСТРУКЦИЯ? ДА - <Y>"
PAUSE 0:IF INKEY$="Y" THEN GO TO 2600
RETURN
CLS
PRINT INVERSE 1;AT 1,10;" CASH-FLOW " PRINT AT 3,0;"
ВАША ЦЕЛЬ - СОБРАТЬ 5 МОНЕТ В ОДНОМ МОНЕТОПРИЕМНИКЕ. В ЭТОМ СЛУЧАЕ ВСЕ ОНИ ДОСТАНУТСЯ ВАМ." PRINT AT 6,0;"
У ВАС ЕСТЬ 6 МОНЕТ ПО 10 ПЕНСОВ ПЛЮС ВСЕ, ВЫИГРАННЫЕ ВАМИ." PAUSE 100:PRINT INK 6;PAPER 2;FLASH 1;AT 9,4; PAUSE 500:PRINT AT 9,4;"
2642 2644 2650 2660 2670 3000 3005 3010 3020 3030 3040
3050
PAPER 2;AT 9,9;" УПРАВЛЕНИЕ
"A - ВСТАВИТЬ МОНЕТУ В АВТОМАТ"^ 13,0;"Z - ЗАПУСТИТЬ МОНЕТУ" "O И P - ПОДТОЛКНУТЬ МОНЕТУ ВЛЕВО ИЛИ ВПРАВО (ТОЛЬКО 1 РАЗ)"
Q - ПРЕКРАЩЕНИЕ ИГРЫ (ТОЛЬКО ПОСЛЕ ТОГО, КАК ВЫ ИЗРАСХОДУЕТЕ ПЕРВЫЕ 50 ПЕНСОВ" PAUSE 100
DIM I$(160):PRINT PAPER 6;AT 3,0;I$
PRINT INK 2;FLASH 1;AT 5,3;" НАЧИНАТЬ ИГРУ? ДА - <Y> "
IF INKEY$="Y" THEN RETURN
GO TO 2660
RESTORE :LET Н=0
POKE 23675,88:POKE 23676,255
LET U=PEEK 23675+256*PEEK 23676
READ J:IF J=.5 THEN RETURN
POKE U+N,J:LET N=N+1:GO TO 3020
DATA 7,31,63,112,119,228,239,231,224,248,252,14,230,247,247,247,231,224,231,97,112,
63,31,7,247,247,231,198,14,252,248,224 DATA 127,127,127,127,127,127,127,127,254,254,254,254,254,254,254,254,.5
PLOT 136,112:DRAW 0,32:BEEP .05,10:DRAW 16,0:BEEP .05,10:PLOT 136,128:DRAW 10,0:BEEP
.05,10 PAUSE 30
PLOT 176,112:DRAW -16,0:BEEP .05,10:DRAW 0,32:BEEP .05,10 PAUSE 30
PLOT INK 6;194,144:DRAW 0,-32,5*PI/6:BEEP .05,10:DRAW 0,32,5*PI/6:BEEP .05,10 PAUSE 30
PLOT 214,144:DRAW 8,-32:BEEP
8,32:BEEP .05,10 FOR N=13 TO 21
PRINT INK 2;AT N,3;"EF EF EF EF EF PRINT INK 4;AT N,2;"F";AT N,29;"E" NEXT N LET Q=5
AT 12+2* NEXT N AT 12+2* NEXT N AT 12+2*
2533
2534
2535
2536
2537
2538
2540 2545 2550 2555 2558
2560
2561
2562
2563 2565 2570 2575 2580 2600 2610 2615
05,10:DRAW 8,16:BEEP .05,10:DRAW 8,-16:BEEP .05,10:DRAW
2620
2622 2624 2628 2630 2635 2640
Программа русифицирована по методике, описанной выше. Автостарт программы -со строки 2, где происходит загрузка символьного набора. В строке 3 происходит включение символьного набора, а в строке 4 - формирование банка символов UDG-графики при помощи подпрограммы 3000. Формируются только символы "A" -"F", так как только они применяются в программе. После этого происходит старт программы с начальной строки. Так Вы будете запускать программу при остановке во время отладки: командой RUN.
Фактическое начало выполнения программы - строка 10. Здесь происходит принудительное включение регистра CAPS LOCK для того, чтобы упростить процедуру опроса нажатых клавишей при помощи INKEY$. Например, чтобы проверить нажатие клавиши "A", обычно применяется конструкция: IF INKEY$="a" OR INKEY$="A" ...
Включив CAPS LOCK, можно исключить первую половину этого выражения, так как невозможно будет нажатие "a".
В строке 15 обнуляется счетчик суммарного выигрыша на протяжении нескольких игр, проведенных подряд. Далее задается изображение верхней и нижней половины монеты при помощи символов UDG-графики. В строке 25 выполняются действия, связанные с прорисовкой титульной страницы игры при помощи подпрограммы 2500. В строке 2500 фактически выполняется очистка экрана, но, в отличие от CLS, это происходит плавно, для более приятного зрительного эффекта. Строки 2520 - 2538 воспроизводят название игры, причем это делается довольно оригинальный способом.
Строки 2540 - 2555 прорисовывают монетоприемники, а строки 2560 -2565 заполняют их монетами.
В строке 2570 начинаются действия, связанные с выводом на экран инструкции игры. Для этого надо нажать "Y". Если это зафиксировано, то подпрограмма переходит на строки 2600 - 2670 для вывода краткой инструкции по игре. Если нет, то подпрограмма завершается и выполняется возврат на продолжение выполнения программы со строки 30.
Строки 30 - 95 обеспечивают прорисовку игрового поля. 35 -голубые полосы слева и справа экрана. 40 - 65 - штыри для изменения направления падения монеты. 75 - 90 -монетоприемники. 95 -направляющая для движения монеты.
В строке 100 обнуляются счетчики выигрыша и проигрыша, затем происходит переход на строку 1000. Здесь монетоприемники заполняются монетами случайным образом. Ну не совсем случайным, все-таки имеются некоторые ограничения. В крайних монетоприемниках задается не более двух монет, а в третьем и пятом их количество может достигать четырех. Количество монет в монетоприемниках 1-6 определяется соответственно переменными A-F. Так как в 4-м монетоприемнике не может быть монет по условиям игры, то переменная D не задается.
Строка 1055 задает Ваш "начальный капитал". Далее выводится предписывающая надпись и автомат ждет, когда Вы опустите монету в автомат. Если Вы это сделаете (нажатием "A"), то программа переходит на строку 1100.
В строках с 1100 происходит движение монеты по направляющей, проходящей внутри автомата. Теперь Вы должны в нужный момент сбросить ее вниз, нажав "Z". Если Вы не сделаете это вовремя, пока она не докатится до конца направляющей, то Вы ее просто потеряете. При нажатии "Z" программа переходит на строку 1200. Это начало падения монеты. Дистанция по вертикали, которую монета прошла от верхней направляющей, обозначена переменной M. При достижении M=2, строки с 1300 обеспечивают "закрывание щели", через которую монета провалилась в автомат. Далее программа переходит на строку 135.
В строках 151 и 152 происходит проверка нажатия клавишей "O" или "P", при помощи которых можно подтолкнуть монету. Обратите внимание на условия, при которых возможно подталкивание монеты. Это, прежде всего, флажок, запоминающий факт подталкивания - I. Монету можно подтолкнуть только один раз. Кроме того, это дистанция, на которой монета находится от верхней направляющей. Если монета упала слишком глубоко (M больше или равно 4), то подтолкнуть монету уже не удастся. Факт подталкивания монеты сопровождается коротким звуковым сигналом. Строка 160 обеспечивает прорисовку монеты на новом месте. Строка 166 определяет скорость падения монеты.
При падении монеты, когда она достигнет уровня монетоприемников (что определяется по величине дистанции M), программа переходит на строку 500. В этих строках вычисляется, сколько же монет стало в том монетоприемнике, куда упала монета. Если там к этому времени уже находилось 4 монеты, то программа переводит на строку 600. Если монета упала в четвертый монетоприемник, то она пропадает (строка 565). Если это была последняя монета, то переход на финал игры, строку 2000 (определяется в строке 568). Строка 570 обеспечивает продолжение игры.
Если в монетоприемнике оказалось 5 монет, то программа продолжается со строки 600. Здесь Вам достаются все выигранные 5 монет, а монетоприемник освобождается. В строках 620-625 обнуляются счетчики монет в соответствующем монетоприемнике. Со строки 630 все действия повторяются.
Финальная часть программы - это строки с 2000. Здесь производится рассчет результата игры - разницы между израсходованными и выигранными монетами, рассчет суммарного результата по итогам нескольких игр и вывод всех этих данных на экран. В строке 2060 Вам предлагается продолжить игру. В том случае, если Вы согласитесь, нажав "Y", игра будет продолжена.
Начиная набивать программу, наберите строки 1-3. Потом сделайте RUN 2 и загрузите заготовленный русско-латинский символьный набор. После его включения продолжайте набивать программу. Имена переменных набирайте в режиме CAPS LOCK. Обратите внимание, что символы "A" - "O" в строке 20 набираются при помощи графического регистра. То же относится и к символам "E" - "F" в строках 80, 85 и 2545, 2550. Периодически выполняйте RUN 5 для записи результатов работы на магнитофон.