МИНЕР
© Александр Белозеров, Москва, 1994.
Сегодня мыы предлагаем программу на Бейсике "МИНЁР". Автор пишет, что программирует на Pascal и Fortran на IBM-PC, а с Бейсиком приходится сталкиваться только по необходимости, поэтому эта программа -далеко не образец программирования. Самы,ш главныш недостаток - убийственно долгий предварительный расчет -около 40 сек! Но в то же время, по словам Александра, отнимать у других возможность усовершенствовать программу - кощунство.
Программа нам понравилась своей "игручестью", и мыы (по совету автора) немного её усовершенствовали: максимально увеличили размер "минного" поля, ввели несколько жизней и изменяемыми уровень игрыг, а также изменили цвета и русифицировали программу. Но основа осталась та же, что и в оригинале автора. В таком виде и предлагаем программу читателям. Кто захочет, сможет продолжить усовершенствования. Итак, слово автору.
Правила игры.
Перед Вами минное поле размером 19 х 19 квадратов. Ваша задача - открыть все квадраты, свободные от мин. Если Вы попытаетесь открыть квадрат с установленной в нем миной - жизнь долой, и Вам не останется ничего иного, как попытать счастье ещё раз. Количество мин на поле и число жизней зависят от уровня сложности игры. Выполнить задание, надеясь только на удачу, практически невозможно. Поэтому в каждом квадрате установлен индикатор, указывающий суммарное количество мин в прилегающих к нему восьми квадратах. Если же в открытом квадрате цифры вообще нет, то смело можете открывать все восемь прилегающих к нему квадратов - мин нет.
Количество свободных от мин квадратов (полей), пока ещё не открытых Вами отображается в правом верхнем углу. С каждым, открытым квадратом это число уменьшается на единицу. И когда оно станет равно нулю - выигрыш Ваш!
Вы можете облегчить себе задачу, сделав игру более наглядной и уменьшив число "несчастных случаев. Для этого можно использовать флажки-маркеры. Их у Вас точно по числу мин. Ставятся они на закрытые квадраты и снимаются клавишей "1". Чтобы открыть помеченный флажком квадрат, надо сначала снять флажок (который действует как предохранитель). Флажком-маркером помечается квадрат, если Вы подозреваете или рассчитали, что в квадрате - мина. Число оставшихся флажков-паркеров также отображается в правой части экрана (указатель "МИНЫ"). Конечно, разминировать всё поле не используя маркеры сложнее, но и интереснее.
Игра требует внимания и умения хорошо мыслить логически, помогает развить эти способности. Но неизбежно будут встречаться ситуации, когда останется только надеяться на удачу. Да и первый ход (а зачастую и несколько первых ходов) Вы делаете исключительно "на удачу".
Управление - клавишами Q, A, O, P, SPACE. Кроме того, правый SINCLAIR-джойстик и клавиша 1.
Листинг программы,1 приводится в варианте для дисковода. Для магнитофонного варианта надо исправить строки 3, 9900, 9910.
ццццщ ццццщ
SHIHHHi SHIHHHi nHIHHHi
■I i| i| i| i| i|
ИИИИИИ
ииииии ииииии ииииии ииииии
GO TO 5 0
BORDER 0: PAPER 0: INK 7: CLEAR 645 99: RANDOMIZE RANDOMIZE USR 15619: REM : LOAD "chr"CODE 64600 POKE 23675,88: POKE 23676,255: RUN GO TO 9900
1
2
3
4
5 8 9
19
20 21 22
23
24
25
26
27
28 29
39
40
41
42
43
POKE 23606,88: POKE 23607,251: RETURN : REM RUS POKE 23606,0: POKE 23607,60: RETURN : REM LAT DATA 129,254,194,194,194,194,254,255 129,254,194,218,218,194,254,255 0,8,24,8,8,8,28,0 0,24,36,4,8,16,60,0 0,24,36,8,4,36,24,0 0,36,36,36,60,4,4,0 0,60,32,56,4,36,24,0 0,28,32,56,36,36,24,0 0,60,4,8,16,32,32,0 0,24,36,24,36,36,24,0 0,24,52,114,126,60,24,0
DATA DATA DATA DATA DATA DATA DATA DATA DATA DATA FOR N=0
"A"+N,RO "N"+N,RO "Q"+N,RO "S"+N,RO "E"+N,RO
N=0 N=0 N=0 N=0 N=0 N=0 SUB
INK 7: BORDER DIM A$(20,20): I(20,20): DIM GO SUB 6000 FOR L=2 TO 20 FOR K=2 TO 20 LET A$(L,K)= "A" NEXT K NEXT L
FOR L=2 TO 20 FOR K=2 TO 20 PRINT AT L,K; NEXT K NEXT L
NEXT NEXT NEXT NEXT NEXT NEXT
44
45
46
47
48
49
50 60 61
62
63
64
65
66 67
"R"+N,RO "T"+N,RO "H"+N,RO "U"+N,RO " I"+N,RO "O"+N,RO
FOR FOR FOR FOR FOR FOR GO
READ RO: POKE READ RO: POKE READ RO: POKE READ RO: POKE READ RO: POKE READ RO: POKE LEV=1
0: PAPER 0: CLS DIM S$(20,20): C (20, 20)
DIM Q(21,21): DIM D$(20,20): DIM P(20,20): DIM
LET P(L,K)=5: LET C(20,20)=0
70
75
76
77
78 80 83
90
91
92
93 95 97 100
BEEP .3,10: BEEP .3,10: LET DV=0: LET DG=0 LET G=2: LET V=2: PRINT
AT 2,2; PAPER 1; INK 0; FLASH 1;"A"
1;ST: POKE 23658,8: PAUSE 0
GO GO
PRINT AT 4,28; IF (INKEY$="P" IF (INKEY$ = "Q" IF (INKEY$ = "O" IF (INKEY$ = "A" IF INKEY$=" " IF INKEY$ = "1" GO TO 83
INK 4; PAPER 2; BRIGHT OR INKEY$="7") AND G<2 0 THEN LET DG=1 OR INKEY$="9") AND V>2 THEN LET DV=-1 OR INKEY$="6") AND G>2 THEN LET DG=-1 OR INKEY$="8") AND V<2 0 THEN LET DV=1 OR INKEY$="0" THEN GO SUB 2000 THEN GO SUB 9000
1000 BEEP .01,18: PRINT AT V,G; PAPER P(V,G); INK C(V,G); G=G+DG: LET DG=0: LET V=V+DV: LET DV=0: PRINT AT V,G; 1;a$(V,G)
1001 RETURN
2000 IF A$(V,G)<>"A" THEN RETURN
2002 BEEP .1,5
2005 LET P(V,G)=4: LET C(V,G)=I(V,G) 2010 IF S$(V,G)="O" THEN GO TO 7000 2015 LET ST=ST-1 2020 LET A$(V,G)=D$(V,G)
2030 PRINT AT V,G; PAPER P(V,G); INK 1; FLASH 1;A$(V,G) 2 04 0 PRINT AT 4,28; PAPER 2; INK 4; BRIGHT 1;"0 " 2050 IF ST=0 THEN GO TO 7900 2500 RETURN 6000 RANDOMIZE 6100 FOR J=1 TO B 6200 LET GI=2+INT (RND*19) 6210 IF S $(VI,GI)= "O" THEN 6220 LET S $(VI,GI)="O" 6230 NEXT J
6250 FOR K=2 TO 20
6251 FOR Y=2 TO 20
6260 IF S$(K,Y)<>"O" THEN GO TO 6400
6270 LET Q(K-1,Y)=Q(K-1,Y)+1
6271 LET Q(K+1,Y)=Q(K+1,Y)+1
6272 LET Q(K,Y+1)=Q(K,Y+1)+1
6273 LET Q(K-1,Y-1)=Q(K-1,Y-1)+1
6274 LET Q(K+1,Y-1)=Q(K+1,Y-1)+1
6275 LET Q(K+1,Y+1)=Q(K+1,Y+1)+1
6276 LET Q(K-1,Y+1)=Q(K-1,Y+1)+1
6277 LET Q(K,Y-1)=Q(K,Y-1)+1 6400 NEXT Y
FLASH 0;A$(V,G): LET PAPER P(V,G); INK 1; FLASH
6410 NEXT K
6450 FOR K=2 TO 20
6455 FOR Y=2 TO 20
6460 IF Q(K,Y)=0 THEN LET D$(K,Y)=" "
6465 IF Q(K,Y)=1 THEN LET D$(K,Y)="O"
6467 IF Q(K,Y)=2 THEN LET D$(K,Y)="S"
6469 IF Q(K,Y)=3 THEN LET D$(K,Y)="E"
IF Q(K,Y)=4 THEN LET D$(K,Y)="R"
IF Q(K,Y)=5 THEN LET D$(K,Y)="T"
IF Q(K,Y)=6 THEN LET D$(K,Y)="H"
IF Q(K,Y)=7 THEN LET D$(K,Y)="U"
IF Q(K,Y)=8 THEN LET D$(K,Y)="I"
INK 2;AT V,G;"O" INK 4; PAPER 1;
PRINT PAPER 4;
LET P(V,G) =4: LET C(V,G)=2: STEP -1: BEEP .01,L: NEXT L 7 004 LET LIV=LIV-1: LET B=B-1: PRINT AT 2,29; INK 1; PAPER 7;LIV;
BRIGHT 1;AT 6,28;B: IF LIV>0 THEN GO TO 83 7 010 PRINT AT 0,5; INK 6; FLASH 1; BRIGHT 1;"ВЫ ПРОИГРАЛИ !"; INK 4; PAPER 0;AT
7,0;"H";AT 8,0;"A";AT 9,0;"6";AT 10,0;"M";AT 11,0;"3";AT 12,0;" ";AT 13,0;"0";AT 14,0;"Г";AT 15,0;"0";AT 16,0;"H";AT 17,0;"b" 7020 IF INKEY$="0" OR INKEY$=" " THEN GO TO 60 7030 GO TO 7020
7900 FOR L=-25 TO 25: BEEP .01,L: NEXT L
7905 PRINT AT 6,28; INK 4; PAPER 1; BRIGHT 1;"0 ": GO SUB 8000
7910 PRINT AT 0,5; INK 6; FLASH 1; BRIGHT 1;"ВЫ ПОБЕДИЛИ !"; INK 4; PAPER 0;AT
7,0;"H";AT 8,0;"A";AT 9,0;"6";AT 10,0;"M";AT 11,0;"3";AT 12,0;" ";AT 13,0;"0";AT 14,0;"Г";AT 15,0;"0";AT 16,0;"H";AT 17,0;"b" 7920 GO TO 7020 8000 FOR K=2 TO 20 8010 FOR Y=2 TO 20
8020 IF S$(K,Y)="O" THEN PRINT AT K,Y; PAPER 4; INK 2;S$(K,Y) 8030 NEXT Y 8050 NEXT K
8060 LET LEV=LEV+(LEV<5) 8070 RETURN 8500 CLS
8504 LET B=45+5*LEV
8505 LET ST=361-B
8506 LET LIV=6-LEV
8507 |
PRINT |
AT |
2, |
23; |
INK |
6; |
"ЖИ3HИ |
"; |
PAPER 7 |
; |
INK |
8510 |
PRINT |
AT |
4, |
23; |
INK |
6; |
"П0ЛЯ" |
|
|
|
|
8520 |
PRINT |
AT |
6, |
23; |
INK |
6; |
"MИHЫ" |
|
|
|
|
8530 |
PRINT |
AT |
4, |
28; |
INK |
4; |
PAPER |
2; |
BRIGHT |
1; |
ST |
8540 |
PRINT |
AT |
6, |
28; |
INK |
4; |
PAPER |
1; |
BRIGHT |
1; |
B |
8600 PRINT AT 1,1; PAPER 2; INK 6;CHR$ 139;AT 1,21;CHR$ 135;AT 21,1;CHR$ 142;AT 21,21;CHR$ 141
8610 FOR L=2 TO 20: PRINT AT L,1; INK 6; PAPER 2;CHR$ 138;AT L,21;CHR$ 133;AT
1,L;CHR$ 131;AT 21,L;CHR$ 140: NEXT L 8620 PRINT AT 9,23; INK 4;"Q -ВВЕРХ";AT 11,23;"F -BH33";AT 13,23;"O -ВЛЕВО";AT
15,23;"P -ВПРАВО";AT 17,23;"1 -®5A60K";AT 19,23;" SPACE -";AT 20,24;"-0ТКРЫТЬ" 8630 PRINT AT 19,3; INK 1; PAPER 5; FLASH 1;"П0ЖАЛУЙСТА, ЖДИТЕ" 8700 RETURN
9000 IF A$(V,G)="A" AND B>0 THEN BEEP .1,-10: LET B=B-1: LET A$ (V,G)="N": GO TO 9099 9010 IF A$(V,G)="N" THEN BEEP .1,-10: LET B=B+1: LET A$(V,G)="A"
9099 PRINT AT V,G; PAPER P(V,G); INK 1; FLASH 1;A$(V,G)
9100 PRINT AT 6,28; PAPER 1; INK 4; BRIGHT 1;" ";AT 6,28;B 9110 RETURN
9500 PRINT INK 4; BRIGHT 1;AT 11,10;"УР0BЕHЬ ИГРЫ:"^ 13,4;"1-H0BИЧ0K ... 5-ЭКСПЕРТ" 9510 LET L$=STR$ LEV: INPUT (L$;" : ";);LINE L$: IF L$<>"" THEN LET LEV=VAL L$ 9520 IF LEV>5 OR LEV<1 THEN BEEP 1,0: GO TO 9510 9530 RETURN
9900 RANDOMIZE USR 15619: REM : ERASE "MINER" 9910 RANDOMIZE USR 15619: REM : SAVE "MINER"LINE 2
GO TO 6490
LET I(K,Y)=0
LET I(K,Y)=1
LET I(K,Y)=3
LET I(K,Y)=2
LET I(K,Y)=2
LET I(K,Y)=2
LET I(K,Y)=2
LET I(K,Y)=2
GO TO 6490 GO TO 6490 GO TO 6490 GO TO 6490 GO TO 6490 GO TO 6490 GO TO 6490 GO TO 6490
6471 6473 6475 6477 6479
6490 NEXT Y
6491 NEXT K 6500 RETURN
7000 LET A$(V,G)="O":
Программа русифицирована при помощи загружаемого в строке 3 русско-латинского символьного набора.
Подчеркнутые символы являются UDG-символами и набираются в графическом регистре.
Из-за полиграфических ограничений строки с символами блочной графики набраны при помощи CHR$. Это строки 8600, 8610. Несмотря на то, что такой вариант полностью работоспособен, логичнее было бы набрать эхйи команды, пользуясь вместо CHR$ графическим регистром и цифровыми клавишами.
Автостарт программы происходит со 2 строки. Набирая программу, наберите вначале строки 5, 9900, 9910. Тогда Вы сможете при наборе периодически пользоваться командой RUN 5 для сохранения того, что уже набрано.
* * *