Сделайте сами
DICEY
Сегодня в рубрике "Сделайте сами" мы предлагаем интересную настольную игру в кости. Это вариация на тему известного "покера". Тем, кто знает, что это такое, наверное ничего объяснять не надо, для тех же, кто с ним не знаком, поясним, что бросая пять игровых костей, нужно стараться создать на них одну из комбинаций выпавших очков. Для того, чтобы это было возможно, после первого броска разрешается перебросить те кости, которые Вас не устраивают. О том, что это за комбинации и как они оцениваются, мы говорить не будем, в листинге программы эта информация есть.
Покер требует в определенной степени умения мыслить комбинаторно, принимать правильные решения. Известно, что против теории вероятности не пойдешь, но тем не менее, есть игроки, которые играют лучше, а есть играющие хуже. Очевидно, первые придерживаются какой-то выигрышной стратегии, а вторые ее еше не выработали.
Данная игра дает двойную возможность для реализации Вашей стратегии. Дело в том, что за набранные комбинации Вы не просто получаете очки, а имеете возможность передвигать по результатам броска фишки на игровом поле. Надо еще хорошо подумать, прежде чем добиваться той или иной комбинации, к чему Вам следует стремиться. Это зависит от конкретной ситуации на игровом поле.
Игра нравится даже тем, кому вообще игровые программы не нравятся, и мы надеемся, что и Вам она доставит много радости.
Хочется сказать несколько слов о проблеме "ошибок в листингах". Это бич всех компьютерных журналов и у нас в "ZX-РЕВЮ" это случалось. Трудоемкость подготовки статьи с игрой для Вас, уважаемые читатели, примерно в три раза выше, чем любой другой аналогичной статьи в связи с необходимостью многочисленных проверок, перепроверок и отладок и, тем не менее, Вы сами знаете, что ошибки проникали в окончательный текст. Это досадно, хотя и не вредно для тех, кто хочет не просто набрать программу, но при этом еще и освоить программирование.
Сейчас мы изменили технологию подготовки программ для самостоятельного набора и ошибки практически исключены. Можете смело набирать и запускать программу. Если что-то не сработает, проверяйте правильность ввода.
Наша технология такова: сначала программа набирается, отлаживается, русифицируется на "Спектруме". Когда она полностью работоспособна, она "сбрасывается" на диск (TR-DOS), после чего программными средствами перекодируется "символика" и конвертируется формат записи в MSDOS. В виде файла MSDOS она верстается и распечатывается на IBM-компьютере. Поскольку все операции автоматические, то листинг, который Вы видите перед собой, точно соответствует тому, что было в памяти "Спектрума", когда программа была отлажена и работала, и ошибок здесь просто не должно быть.
Несколько слов о русификации. Мы придерживаемся ранее принятого нами способа русификации. Если Вы с ним не знакомы, Вам понадобятся выпуски ZX-РЕВЮ N3, 4 за этот год и, может быть, N 1,2 тоже за этот год.
|
|
|
|
|
■ |
] |
|
|
|
|
|
|
|
|
|
|
|
|
я
L |
■ |
|
|
|
|
|
|
|
|
■ |
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
■ |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
■ 5 |
|
|
|
|
|
|
|
|
|
|
|
|
■ 4 |
|
|
|
|
|
|
|
|
|
|
|
|
■ R |
|
|
|
|
|
|
|
|
|
|
|
|
■ I |
|
|
|
|
|
|
|
|
|
|
|
|
■ L |
|
|
|
|
|
|
в |
э- |
□ |
3- |
□ |
4 |
- |
а |
5 |
- |
□ |
фчля; три < 4 > и две <6>
намните любчю кяявицч
1 GO TO 3
2 CLEAR 64599: LOAD "chr"CODE 64600
3 BORDER 1: PAPER 1: CLS : POKE 23658,8: POKE 23606,88: POKE 23607,251:
4 PRINT AT 10,5; INK 3; BRIGHT 1;"ВАМ НУЖНА ИНСТРУКЦИЯ?"^ 12,6;"НАЖМИТЕ <Y> ИЛИ <N>": BEEP
.5,3: BEEP .35,0
5 IF INKEY$="" THEN GO TO 5
6 IF INKEY$="Y" THEN GO SUB 9100: GO TO 8
7 GO SUB 9270
8 CLS : BORDER 1: INK 0: PAPER 7
9 PRINT AT 10,0; FLASH 1; INK 1; PAPER 6; "СЕЙЧАС Я ПОДГОТОВЛЮ ИГРОВОЕ ПОЛЕ"
10 GO SUB 9900: REM U.D.G. ==== 15 RANDOMIZE
20 DIM T(5):DIM R(5):DIM Z$(6) :LET T$=CHR$ 132+CHR$ 136:LET B$ =CHR$ 129+CHR$ 130 30 DIM D(5,2,1): FOR I=1 TO 5: FOR N=1 TO 2: READ P: LET D(I,N ,1)=P: NEXT N: NEXT I
34 REM ПОДГОТОВКА КООРДИНАТ ИГРОВОГО ПОЛЯ И ИЗОБРАЖЕНИЯ ФИШЕК=
35 DIM Y(9): DIM X(13)
40 FOR I=0 TO 8: LET Y(I+1)=2*I: NEXT I
50 FOR I=1 TO 7: LET X(I)=2*I: NEXT I: FOR I=8 TO 13: LET X(I) =2*I+1: NEXT I 60 LET E1=0: LET E2=0: DIM F(9): FOR I=1 TO 9: LET F(I)=7: NEXT I
65 CLS : IF PLAY=2 THEN LET GO=1: PRINT AT 10,6; INK 1;"ПЕРВЫЙ ИГРОК НАЧИНАЕТ": PAUSE 75
66 IF PLAY=1 AND GO=1 THEN PRINT AT 10,7; INK 1;"КОМПЬЮТЕР НАЧИНАЕТ": PAUSE 75
67 IF PLAY=1 AND GO=-1 THEN PRINT AT 10,4; INK 1;"O.K. - ВЫ ХОДИТЕ ПЕРВЫМ": PAUSE 75
70 GO SUB 9000 80 GO SUB 2000 90 GO SUB 4500
REM ИГРОВОЕ ПОЛЕ ===========================
REM ИЗОБРАЖЕНИЕ КОСТЕЙ И ФИШЕК =============
REM ПРОВЕРКА НА ПОБЕДУ =====================
100 LET GO=GO*-1
200 PRINT AT 21,0; INK 1; PAPER 6; " ПЕРВЫЙ БРОСОК "
202 FOR N=1 TO 10: FOR I=1 TO 5: LET R(I)=1+INT (RND*6): NEXT I 205 BEEP .01,INT (RND*10) 210 GO SUB 3500: NEXT N
230 IF PLAY=2 OR GO=1 THEN GO SUB 3000
231 IF PLAY=1 AND GO=-1 THEN GO SUB 3600: GO SUB 5000: GO SUB 5500
234 IF M=0 THEN GO TO 310
235 PRINT AT 21,0; INK 1; PAPER 6;" ВТОРОЙ БРОСОК "
236 FOR N=1 TO 10 240 GO SUB 2400 250 GO SUB 3500 255 NEXT N
270 IF PLAY=2 OR GO=1 THEN GO SUB 3000
271 IF PLAY=1 AND GO=-1 THEN GO SUB 3600: GO SUB 5000: GO SUB 5500
274 IF M=0 THEN GO TO 310
275 PRINT AT 21,0; INK 1; PAPER 6;" ТРЕТИЙ БРОСОК "
276 FOR N=1 TO 10 280 GO SUB 2400 290 GO SUB 3500 295 NEXT N
310 GO SUB 3600
315 IF PLAY=1 AND GO=-1 THEN GO SUB 6300 320 PRINT AT 21,0;X$
330 PRINT #1; INK 6; " НАЖМИТЕ ЛЮБУЮ КЛАВИШУ "
340 PAUSE 0: INPUT ;
350 IF GO=-1 THEN GO TO 370
360 IF PLAY=2 THEN PRINT INK 1; AT 21,0;" БРОСАЕТ ПЕРВЫЙ ИГРОК "
361 IF PLAY=1 THEN PRINT INK 1; AT 21,0;" БРОСАЕТ КОМПЬЮТЕР " 365 GO TO 70
370 IF PLAY=2 THEN PRINT INK 2; AT 21,0;" БРОСАЕТ ВТОРОЙ ИГРОК "
371 IF PLAY=1 THEN PRINT INK 2; AT 21,0;" БРОСАЕТ ЧЕЛОВEK " 380 GO TO 70
2000 REM ИЗОБРАЖЕНИЕ КОСТЕЙ И ФИШЕК
2010 FOR I=1 TO 5: PLOT D(I,1,1),D(I,2,1) : DRAW 15,0: DRAW 0,-15: DRAW -15,0: DRAW 0,15:
PRINT BRIGHT 1; INK 0; PAPER 4;AT 19,6*(I-1);I;"-": NEXT I 2020 FOR I=1 TO 9
2025 IF I=E1 OR I=E2 THEN NEXT I
2026 IF I=10 THEN GO TO 2040
2030 PRINT OVER 1; INK 1; PAPER 6;AT Y(I),X(F(I));T$;AT Y(I)+1, X(F(I));B$: NEXT I
IF NOT E1 AND NOT E2 THEN RETURN LET DISP1=DISP1*GO: LET DISP2=DISP2*GO LET F(E1)=F(E1)+DISP1 IF F(E1)<1 THEN LET F(E1)=1 IF F(E1)>13 THEN LET F(E1)=13
PRINT OVER 1; INK 1; PAPER 6; AT Y(E1),X(F(E1));T$;AT Y(E1)+1,X(F(E1));B$
IF NOT E2 THEN RETURN
LET F(E2)=F(E2)+DISP2
IF F(E2)<1 THEN LET F(E2)=1
IF F(E2)>13 THEN LET F(E2)=13
PRINT OVER 1; INK 1; PAPER 6;AT Y(E2),X(F(E2));T$;AT Y(E2)+1,X(F(E2));B$ RETURN
REM СБРОС ЗНАЧЕНИИ КОСТЕЙ==
FOR I=1 TO M: LET R(T(I))=1+INT (RND*6): NEXT I
BEEP .01,INT (RND*10)
RETURN
REM ПОВТОРНЫЙ БРОСОК ======
LET R$="": INPUT AT 0,0;"ВВЕДИ Y ЕСЛИ O.K. ИЛИ N ЕСЛИ НЕТ"^^ R$
IF R$<>"Y" AND R$<>"N" THEN GO TO 3000
IF R$="Y" THEN GO TO 310
INPUT "СКОЛЬКО КОСТЕЙ ПЕРЕБРОСИТЕ? ";M
LET M=INT M: IF M<1 OR M>5 THEN GO TO 3030
PRINT #1; FLASH 1; INK 2; PAPER 7;"БУДУТ ПЕРЕБРАСЫВАТЬСЯ КОСТИ ... ": PAUSE 50
FOR I=1 TO M: INPUT "КОСТЬ НОМЕР : ";T(I): LET T(I)=INT T(I)
IF T(I)<1 OR T(I)>5 THEN GO TO 3050
NEXT I: RETURN
REM ПЕЧАТЬ ЗНАЧЕНИЙ КОСТЕЙ=
FOR I=1 TO 5: PRINT AT 19,6*I-3; INK 7; PAPER 0;R(I): NEXT I RETURN
REM СОРТИРОВКА ЗНАЧЕНИЙ КОСТЕЙ =========================
FOR N=1 TO 4: FOR I=1 TO 5-N
IF R(I)<R(I+1) THEN LET A=R(I): LET R(I)=R(I+1): LET R(I+1)=A
NEXT I: NEXT N
REM HOLD HOW MANY OF EACH==
DIM V(5,2): LET COUNT=1: LET A=0
FOR N=1 TO 5
IF N=5 THEN GO TO 3700
FOR I=N TO 4
IF R(I)=R(I+1) THEN LET COUNT=COUNT+1: GO TO 3690 GO TO 3700 NEXT I
LET A=A+1: LET V(A,2)=COUNT: LET V(A,1)=R(N) LET N=N+COUNT-1: LET COUNT=1 NEXT N
REM НАЗНАЧАЕМ ПЕРЕМЕННОЙ X$ КОМБИНАЦИЮ КОСТЕЙ И УСТАНАВЛИВАЕМ СЧЕТЧИКИ ПЕРЕМЕЩЕНИЯ ФИШЕК ==
DIM X$(32): LET E1=0: LET E2=0: LET DISP1=0: LET DISP2=0 IF V(1,2)<>5 THEN GO TO 3820 REM ПЯТЕРКИ ===============
LET Х$="ПЯТЕРКА <"+STR$ V(1,1)+"> !!!" LET DISP1=V(1,2)-1: LET E1=V(1,1): GO TO 3930 IF V(1,2)<>4 AND V(2,2)<>4 THEN GO TO 3830 REM ЧЕТВЕРКИ ==============
LET DISP1=3: IF V(1,2)=4 THEN LET E1=V(1,1) IF V(2,2)=4 THEN LET E1=V(2,1)
LET Х$="ЧЕТВЕРКА <"+(STR$ V(1,1) AND V(1,2)=4)+(STR$ V(2,1) AND V(2,2)=4)+">": GO TO 3930
IF V(1,2)<>3 AND V(1,2)<>2 OR V(2,2)<>3 AND V(2,2)<>2 OR V(1,2)=V(2,2) THEN GO TO 3850 REM ФУЛЛ ==================
LET Х$="ФУЛЛ: ТРИ <"+(STR$ V(1,1) AND V(1,2)=3)+(STR$ V(2,1) AND V(2,2)=3)+"> И ДВЕ <"+(STR$ V(1,1) AND V(1,2)=2)+(STR$ V(2,1) AND V(2,2)=2)+">" FOR I=1 TO 2
IF V(I,2)=3 THEN LET DISP1= V(I,2)-1: LET E1=V(I,1) IF V(I,2)=2 THEN LET DISP2= V(I,2)-1: LET E2=V(I,1) NEXT I: GO TO 3930
REM ТРОЙКИ ================
FOR I=1 TO 3: IF V(I,2)=3 THEN LET DISP1=V(I,2)-1: LET E1=V(I,1): LET X$="ТРОЙКА
<"+STR$ V(I,1)+">" NEXT I
REM ПАРА ИЛИ ДВЕ ПАРЫ =====
LET A=0: FOR I=1 TO 5: IF V(I,2)=2 THEN LET A = A+1: LET B=I NEXT I
IF A=0 THEN GO TO 3930
IF A=2 THEN GO TO 3900
LET E1=V(B,1): LET DISP1=V(B,2)-1
LET X$="ПАРА <"+STR$ V(B,1)+">": GO TO 3930
LET A=0: FOR I=1 TO 5
IF V(I,2)=2 AND NOT A THEN LET A=I
IF V(I,2)=2 AND A THEN LET B=I
NEXT I
LET X$="ДВЕ ПАРЫ, <"+STR$ V(A,1)+"> И <"+STR$ V(B,1)+">"
LET DISP1=V(A,2)-1: LET E1=V(A,1): LET DISP2=V(B,2)-1: LET E2=V(B,1)
REM ИНИЦИАЛИЗАЦИЯ СУММЫ И МАРКЕРОВ БОЛЬШОЙ И МАЛОЙ СУММЫ==
LET TOTAL=0: LET HIGH=0: LET LOW=0: FOR I=1 TO 5
LET TOTAL=TOTAL+R(I): NEXT I
IF TOTAL>12 AND TOTAL<23 THEN GO TO 3995
IF TOTAL>25 THEN LET HIGH=3
IF TOTAL>22 AND TOTAL<26 THEN LET HIGH=2
IF TOTAL<10 THEN LET LOW=3
IF TOTAL>9 AND TOTAL<13 THEN LET LOW=2
IF CODE X$(1)<>32 THEN GO TO 3985
REM БОЛЬШАЯ ИЛИ МАЛАЯ СУММА
GO SUB 4010: RETURN
REM ВЫБОР КОМБИНАЦИИ ======
IF PLAY=1 AND GO=-1 THEN GO TO 3994
PRINT AT 21,0;"ВЫБИРАЙТЕ, НА ЧТО ВЫ ИДЕТЕ..... ": PAUSE 100 : PRINT AT 21,0;"СУММА /
";X$(1 TO 22);"?" INPUT "'S' ЕСЛИ СУММА, ИНАЧЕ 'X': "; LINE R$ IF R$<>"S" AND R$<>"X" THEN GO TO 3990 IF R$="S" THEN GO SUB 4010 REM СТРИТ =================
FOR I=1 TO 4: IF R(I)<>R(I+1)+1 THEN GO TO 3998 NEXT I
LET DISP1=(3 AND R(1)=6)+(2 AND R(1)=5): LET E1=7: LET X$=("БОЛЬШОЙ" AND
В(1)=6)+("МАЛЫЙ" AND R(1)=5)+" СТРИТ" IF CODE X$(1)=32 THEN LET X$=" Н И Ч Е Г О !"
RETURN
LET X$=("БОЛЬШАЯ СУММА =" AND HIGH)+("МАЛАЯ СУММА =" AND LOW)+STR$ TOTAL LET DISP1=(HIGH AND HIGH)+(LOW AMD LOW): LET DISP2=0 LET E1=(8 AND HIGH)+(9 AND LOW): LET E2=0 RETURN
REM ПРОВЕРКА ВЫИГРЫША ===== LET A=0: LET B=0 FOR I=1 TO 9
IF F(I)<4 THEN LET A=A+1 IF F(I)>10 THEN LET B=B+1 NEXT I
IF A>2 OR B>2 THEN GO TO 4575 RETURN
FOR I=1 TO 30
IF PLAY=2 THEN PRINT AT 21,5; FLASH 1; BRIGHT 1; INK 1; PAPER 6; "ПОБЕДИЛ "+("ПЕРВЫЙ
AND A>2)+("ВТОРОЙ" AND B>2)+" ИГРОК" IF PLAY=1 THEN PRINT AT 21,5; FLASH 1; BRIGHT 1; INK 1; PAPER 6;("ПОБЕДИЛ
КОМПЬЮТЕР!!!" AND A^M^I ВЫИГРАЛИ! ПОЗДРАВЛЯЮ." AND B>2) BEEP .01,I: NEXT I
LET R$="": INPUT "СЫГРАЕМ ЕЩЕ? ('Y' ИЛИ 'N') "; LINE R$ IF R$="" THEN GO TO 4590 IF R$="Y" THEN GO TO 4660
LET R$="": INPUT "КОНЕЦ? ('Y' ИЛИ 'N') "; LINE R$ IF R$="" THEN GO TO 4620
4640 IF R$="Y" THEN GO TO 9998 4650 GO TO 4590
4660 CLS : PRINT ""ВЫ МОЖЕТЕ ИЗ
МЕНИТЬ РЕЖИМ ИГРЫ.......СНАЧАЛА ВВ
ЕДИТЕ ""1"" ИЛИ ""2..........ПО ЧИСЛ
У ИГРАЮЩИХ; ЗАТЕМ......(ЕСЛИ ВЫ ИГ
РАЕТЕ С КОМПЬЮТЕРОМ)......ВВЕДИТЕ
""-1"" ЕСЛИ ХОТИТЕ ХОДИТЬ......ПЕР
ВЫЙ. ИНАЧЕ ВВЕДИТЕ ""1......
4670 INPUT "ОДИН ИЛИ ДВА-ИГРОКА?"; PLAY
4680 LET PLAY=INT PLAY: IF PLAY<1 OR PLAY>2 THEN GO TO 4670
4690 IF PLAY=2 THEN GO TO 60
4700 INPUT " -1, ЕСЛИ ХОДИТЕ ПЕРВЫМ, ИНАЧЕ 1:";GO
4710 LET GO=INT GO: IF GO=0 OR GO>1 OR GO<-1 THEN GO TO 4700
4720 GO TO 60
4999 REM УСТАНОВКА МАРКЕРОВ ПРИОРИТЕТОВ ====================
5000 DIM P(9): LET A1=0: LET A2=0
5010 FOR I=1 TO 9: REM ЕСТЬ ЛИ ФИШКИ В КРАСНОЙ ЗОНЕ? =======
5020 IF F(I)<4 THEN LET A1=A1+1 5030 IF F(I)>10 THEN LET A2=A2+1 5040 NEXT I
5050 IF A1<>2 OR A2<>2 THEN GO TO 5210 5060 LET B1=7 5070 FOR I=1 TO 9
5080 IF F(I)<B1 AND F(I)>3 THEN LET B1=F(I): LET B2=I 5090 NEXT I
5100 IF B1=7 THEN GO TO 5130
5110 IF B2<7 THEN LET P(B2)=1:RETURN
5120 LET P(B2)=B2: RETURN
5130 LET B1=14
5140 FOR I=1 TO 6
5150 IF F(I)<B1 AND F(I)>10 THEN LET B1=F(I): LET B2=I 5160 NEXT I: IF B1=14 THEN GO TO 5180 5170 LET P(B2)=1: RETURN 5180 FOR I=7 TO 9
5190 IF F(I)<B1 AND F(I)>10 THEN LET B1=F(I): LET B2=I
5200 NEXT I: LET P(B2)=B2: RETURN
5210 IF A1<>2 THEN GO TO 5280
5220 LET B1=14
5230 FOR I=1 TO 9
5240 IF F(I)<B1 AND F(I)>3 THEN LET B1=F(I): LET B2=I 5250 NEXT I
5260 IF B2>=7 THEN LET P(B2)=B2: RETURN
5270 LET P(B2)=1: RETURN
5280 IF A2<>2 THEN GO TO 5380
5290 LET A2=0: FOR I=7 TO 9
5300 IF F(I)>10 THEN LET A2=A2+1
5310 NEXT I: IF A2<2 THEN GO TO 5350
5320 FOR I=7 TO 9
5330 IF F(I)>10 THEN LET P(I) = 1
5340 NEXT I: RETURN
5350 LET B1=14: FOR I=1 TO 6
5360 IF F(I)>10 AND F(I)<B1 THEN LET B1=F(I): LET B2=I
5370 NEXT I: LET P(B2)=1: RETURN
5380 FOR I=1 TO 9
5390 IF F(I)=1 THEN LET P(I)=3
5400 IF F(I)=2 OR F(I)=3 THEN LET P(I)=2
5410 NEXT I: RETURN
5499 REM РАСЧЕТ ПРИОРИТЕТАМ ===
5500 LET A=0: LET M=0: FOR I=1 TO 6 5510 IF P(I)=1 THEN LET A=I
5520 NEXT I: IF A=0 THEN GO TO 5570 5530 FOR I=1 TO 5 5540 IF R(I)<>A THEN GO SUB 6210 5550 NEXT I: IF M=0 THEN GO TO 310
RETURN
IF P(7)>I THEN GO TO 5640: REM НЕТ СМЫСЛА ДЕЛАТЬ СТРИТ === IF E1=7 THEN GO TO 310
IF E1=0 AND E2=0 THEN LET M=1: LET T(1)=5: RETURN IF P(7)<>7 THEN GO TO 5640 : REM СТРИТ НЕРЕАЛЕН ===========
FOR I=1 TO 4
IF R(I)=E1 THEN LET M=1: LET T(1)=1: RETURN NEXT I
IF P(8)<>8 OR TOTAL<20 THEN GO TO 5720: REM БОЛЬШАЯ СУММА СОМНИТЕЛЬНА
IF TOTAL>23 THEN GO TO 5690 FOR I=3 TO 5
IF R(I)<4 THEN GO SUB 6210 RETURN
FOR I=4 TO 5
IF R(I)<3 THEN GO SUB 6210 RETURN
IF P(9)<>9 OR TOTAL>15 THEN GO TO 5800: REM МАЛАЯ СУММА СОМНИТЕЛЬНА
IF TOTAL<12 THEN GO TO 5770 FOR I=1 TO 3
IF R(I)>3 THEN GO SUB 6210 NEXT I: RETURN FOR I=1 TO 2
IF R(I)>2 THEN GO SUB 6210 RETURN
IF DISP1=1 AND DISP2=1 THEN GO TO 5860
IF DISP1<>1 THEN GO TO 5980 : REM НЕТ ПАР ==================
FOR I=1 TO 5
IF R(I)<>E1 AND P(E1)=0 THEN GO SUB 6210 IF P(E1)>1 THEN LET M=4: IF I>1 THEN LET T(I)=I NEXT I: RETURN
IF P(E1)>1 AND P(E2)>1 THEN GO TO 5910: REM ДВУХ ПАР НЕТ ==
IF P(E1)=0 AND P(E2)=0 THEN GO TO 5940: REM ПРИНИМАЕТСЯ ДВЕ ПАРЫ И ПЕРЕБРАСЫВАЕТСЯ НЕПАРНАЯ КОСТЬ ==========================
REM 2 ПАРЫ, ПЕРЕБРАСЫВАЕТСЯ 1 ПАРА И НЕПАРНАЯ КОСТЬ ========
FOR I=1 TO 5
IF R(I)<>E2 AND P(E2)=0 OR R(I)<>E1 AND P(E1)=0 THEN GO SUB 6210 NEXT I: RETURN FOR I=1 TO 5
IF R(I)=E1 OR R(I)=E2 THEN GO SUB 6210 NEXT I: RETURN FOR I=1 TO 5
IF R(I)<>E1 AND R(I)<>E2 THEN GO SUB 6210 NEXT I: RETURN
IF DISP1<>2 AND DISP2<>2 THEN GO TO 6110: REM НЕ ТРОЙКА ===
IF DISP1=1 OR DISP2=1 THEN GO TO 6050
FOR I=1 TO 5
IF E1=0 THEN GO TO 6025
IF DISP1=2 AND F(E1)>5 AND R(I)>E1 THEN GO SUB 6216 IF P(E1)=3 AND R(I)=E1 THEN GO SUB 6210
IF F(E1)<6 AND P(E1)<3 AND R(I)<>E1 THEN LET M=1: LET T(1) = I IF E2=0 THEN GO TO 6045
IF DISP2=2 AND F(E2)>5 AND R(I)<>E2 THEN GO SUB 6210
IF P(E2)=3 AND R(I)=E2 THEN GO SUB 6210
IF F(E2)<6 AND P(E2)<3 AND R(I)<>E2 THEN LET M=1: LET T(1)=I
NEXT I: RETURN
REM ФУЛЛ ==================
IF E1=0 AND E2 = 0 THEN GO TO 310 FOR I=1 TO 5
IF P(E1)>1 AND P(E2)>1 THEN GO SUB 6210 IF P(E1)>1 AND P(E2)=0 AND R(I)<>E2 THEN GO SUB 6210 IF P(E1)=0 AND P(E2)>1 AND R(I)<>E1 THEN GO SUB 6210 NEXT I: RETURN
IF DISP1<>3 AND DISP2<>3 OR E1>6 THEN GO TO 6150: REM НЕ ЧЕТВЕРКА ================
FOR I=1 TO 5
IF R(I)<>E1 AND DISP1=3 OR R(I)<>E2 AND DISP2=3 THEN GO SUB 6210 NEXT I: RETURN
IF HIGH=3 OR LOW=3 OR DISP1=4 OR E1=7 AND P(7)=0 THEN GO TO 310: REM БЕЗ ПЕРЕБРОСКИ
IF HIGH=2 AND P(8)=0 THEN LET M=1: LET T(1)=5: RETURN IF LOW=2 AND P(9)=0 THEN LET M=1: LET T(1)=1: RETURN LET M=5: FOR I=1 TO 5 LET T(I)=I: NEXT I: RETURN LET M=M+1: LET T(M)=I RETURN
IF NOT HIGH AND NOT LOW THEN RETURN IF F(8)<4 AND HIGH OR F(9)<4 AND LOW THEN RETURN IF DISP1=2 AND DISP2=1 AND (F(8)-HIGH)>3 AND HIGH THEN RETURN IF DISP1=2 AND DISP2=1 AND (F(9)-LOW)>3 AND LOW THEN RETURN IF DISP1=1 AND DISP2=2 AND (F(8)-HIGH)>3 AND HIGH THEN RETURN IF DISP1=1 AND DISP2=2 AND (F(9)-LOW)>3 AND LOW THEN RETURN IF DISP1>HIGH AND HIGH OR DISP1>LOW AND LOW THEN RETURN IF (F(E1)-DISP1)<4 THEN RETURN IF E2=0 THEN GO TO 6350 IF (F(E2)-DISP2)<4 THEN RETURN IF F(E1)>10 AND F(8)<10 AND HIGH THEN RETURN IF E2=0 THEN GO TO 6360 IF F(E2)>10 AND F(8)<10 AND HIGH THEN RETURN IF F(E1)>10 AND F(9)<10 AND LOW THEN RETURN IF E2=0 THEN GO TO 6370 IF F(E2)>10 AND F(9)<10 AND LOW THEN RETURN GO SUB 4010: RETURN
REM ГРАФИКА = = = = = = = = = = = = = = =
FOR I=0 TO 17: PRINT PAPER 6; AT I,14; " ": NEXT I
FOR I=0 TO 17: PRINT PAPER 6; AT I,16;CHR$ (144+I): NEXT I
FOR I=0 TO 17: PRINT PAPER 2;AT I,2;Z$;AT I,23;Z$: NEXT I
FOR I=0 TO 17: PRINT PAPER 4;AT I,8;Z$;AT I,17;Z$: NEXT I
PLOT 15,31: FOR I=1 TO 4: DRAW 216,0: DRAW 0,16: DRAW -216, 0: DRAW 0,16: NEXT I: DRAW
216,0 : DRAW 0,16: DRAW -216,0 FOR I=2 TO 14 STEP 2: PLOT I*8-1,175: DRAW 0,-143: NEXT I:FOR I=17 TO 29 STEP 2: PLOT
I*8-1,175: DRAW 0,-143: NEXT I IF PLAY=1 THEN GO TO 9070
PRINT INK 1;AT 2,0;"П";AT 3,0;"E";AT 4,0;"P";AT 5,0;"B";AT 6,0;"Ы";AT 7,0; "Й";AT
8,0;" ";AT 9,0;"И";AT 10,0; "Г"; AT 11,0;"P";AT 12,0;"О"; AT 13,0; "К" PRINT INK 2; AT 2,30;"B";AT 3,30;"T";AT 4,30;"0";AT 5,30;"P";AT 6,30;"O";AT 7,30;"^';AT 8,30;" ";AT 9, 30; "Й"; AT 10,30; "Г"; AT 11,30; "P"; AT 12,30; "O"; AT 13,30;"K": GO TO 9080 PRINT INK 1;AT 4,0;"K";AT 5,0;"O";AT 6,0;"M";AT 7,0;"П";AT 8,0;"b";AT 9,0;"Ю";AT
10,0;"T"; AT 11,0; "E";AT 12,0; "P" PRINT INK 2; AT 5,30;"Ч";AT 6,30; "E"; AT 7,30; "Л";AT 8,30;"0";AT 9,30;"В";AT
10,30;"E";AT 11,30;"К" IF GO=1 THEN PRINT AT 15,0; INK 7; PAPER 0; FLASH 1;"X";AT 15,30; PAPER 7; " " IF GO=1 THEN PRINT AT 15,0; PAPER 7;" ";AT 15,30; INK 7;PAPER 0; FLASH 1;"Х" RETURN
REM ИНСТРУКЦИЯ ============
BORDER 1: INK 6: PAPER 1: PRINT : CLS PRINT AT 3,0; " ЦЕЛЬ ЭТОЙ ИГРЫ СОСТОИТ В ТОМ, ЧТОБЫ ПРОВЕСТИ ТРИ ФИШКИ В КРАСНУЮ ЗОНУ НА СВОЕЙ ПОЛОВИНЕ ПОЛЯ ДО ТОГО КАК ЭТО СДЕЛАЕТ ВАШ СОПЕРНИК." PRINT '
" ИГРА ВЕДЕТСЯ ДЕВЯТЬЮ ФИШКАМИ. СНАЧАЛА ОНИ РАСПОЛОЖЕНЫ В ЦЕНТРЕ ПОЛЯ НА ДОРОЖКАХ, ОБОЗНАЧЕННЫХ ""1"", ""2"",...""6"", ""R"", "" H"", ""L"".""
" ЗА ОДИН ХОД ВЫ МОЖЕТЕ ПЕРЕ-
ДВИГАТЬ ДО ДВУХ ФИШЕК. ВЕЛИЧИНА ХОДА ОПРЕДЕЛЯЕТСЯ РЕЗУЛЬТАТОМ БРОСАНИЯ ПЯТИ КОСТЕЙ." 9140 GO SUB 9300 9150 PRINT AT 5,0;
" ПОСЛЕ ПЕРВОГО БРОСКА ВЫ МОЖЕТЕ ДВАЖДЫ ПЕРЕБРОСИТЬ СТОЛЬКО КОСТЕЙ, СКОЛЬКО ХОТИТЕ. ПРИ ВТОРОМ И ТРЕТЬЕМ БРОСКАХ РАЗРЕШАЕТСЯ ИСПОЛЬЗОВАТЬ ЛЮБЫЕ КОСТИ." 9160 PRINT '
" ВАША ЦЕЛЬ ПРИ ПЕРЕБРОСКЕ КОСТЕЙ - СОСТАВИТЬ ТАКУЮ КОМБИНАЦИЮ, КОТОРАЯ ДАСТ ВАМ ВОЗМОЖНОСТЬ ЛУЧШЕГО ХОДА ФИШКАМИ." 9170 GO SUB 9300 9180 PRINT AT 1,0;
" ПРАВО НА ХОД ДАЮТ СЛЕДУЮЩИЕ КОМБИНАЦИИ:""
"- ДВЕ ИЛИ БОЛЬШЕ КОСТЕЙ ОДИНАКОВОГО ЗНАЧЕНИЯ 1...6 (ПЕРЕДВИГАЮТСЯ ФИШКИ НА ДОРОЖКЕ С СООТВЕТСТВУЮЩИМ НОМЕРОМ);"" "- ""СТРИТ"" - ПОСЛЕДОВАТЕЛЬНОСТЬ ИЗ ПЯТИ ИДУЩИХ ПОДРЯД ЗНАЧЕНИЙ КОСТЕЙ (ПЕРЕДВИГАЕТСЯ ФИШКА ПО ДОРОЖКЕ ""R"" - ""RUN"");" 9190 PRINT '
"- БОЛЬШАЯ СУММА КОСТЕЙ - БОЛЬШЕ 22 (ПЕРЕДВИГАЕТСЯ ФИШКА ПО ДОРОЖКЕ ""Н"" - ""HIGH"");"" "- МАЛАЯ СУММА - СУММА ВСЕХ КОСТЕЙ МЕНЬШЕ 13 (ПЕРЕДВИГАЕТСЯ ФИШКА ПО ДОРОЖКЕ ""L"" - ""LOW"")." 9200 GO SUB 9300 9205 PRINT AT 2,0;
" КОМБИНАЦИИ ПОЗВОЛЯЮТ СДЕЛАТЬ ХОД НА ОПРЕДЕЛЕННУЮ ВЕЛИЧИНУ:" 9210 PRINT TAB 17;"ПАРА - 1 ШАГ-'TAB 15;"ТРОЙКА - 2 ШАГА-TAB 13;"ЧЕТВЕРКА - 3 ШАГА-TAB 14; "ПЯТЕРКА - 4 ШАГА-TAB 2;"БОЛЬШОЙ СТРИТ (2-6) - 3 ШАГА"'
9220 PRINT TAB 4;"МАЛЫЙ СТРИТ (1-5) - 2 ШАГА-TAB 2;"БОЛЬШАЯ СУММА (>25) - 3 ШАГА.....БОЛЬШАЯ
СУММА (23-25) - 2 ШАГА-TAB 4;"МАЛАЯ СУММА (<10) - 3 ШАГА-TAB 2;"МАЛАЯ СУММА (10-12) - 2 ШАГА""
" ЗАМЕТЬТЕ, ЧТО ЕСЛИ У ВАС ЕСТЬ ДВЕ ПАРЫ, ИЛИ ФУЛЛ (ПАРА+ТРОЙКА) ТО ВЫ ИМЕЕТЕ ПРАВО ПЕРЕДВИНУТЬ ДВЕ ФИШКИ." 9230 GO SUB 9300
9240 PRINT '"TAB 11;"ЗАМЕЧАНИЯ" ; AT 2,11; OVER 1;"_________""
"1) ВЫ НЕ ИМЕЕТЕ ПРАВА ХОДИТЬ ОДНОВРЕМЕННО ПО ДОРОЖКАМ ""Н"" (""L"") И ""1""...-"6""."" "2) ФИШКА НЕ МОЖЕТ ВЫХОДИТЬ ЗА ВНЕШНЮЮ ГРАНИЦУ КРАСНОЙ ЗОНЫ - ПРОПУЩЕННЫЙ ХОД ПРОПАДАЕТ." 9245 PRINT '
"3) ИГРОК, ДЕЛАЮЩИЙ ХОД, ОТМЕЧАЕТСЯ КУРСОРОМ "; FLASH 1; INK 7; PAPER 0;"X"; FLASH 0; INK 6; PAPER 1;"." 9250 PRINT '
"4) НОМЕРА КОСТЕЙ ИЗОБРАЖАЮТСЯ
ЧЕРНЫМ ПО ЗЕЛЕНОМУ, НАПРИМЕР: ""TAB 16; INK 0; PAPER 4;"5-": GO SUB 9300 9255 CLS : PRINT AT 5,0;
" В НАЧАЛЕ ИГРЫ ФИШКИ УСТАНОВЛЕНЫ НА НЕЙТРАЛЬНЫХ ОТМЕТКАХ.
ОНИ ИЗОБРАЖАЮТСЯ ТАК:""TAB 15; INK 0; PAPER 6;CHR$ 132;CHR$ 136; PAPER 1 ' TAB 15; PAPER 6;CHR$ 129;CHR$ 130 9260 PRINT '
ЕСЛИ ВЫ ХОТИТЕ ПРОЧИТАТЬ ЭТУ ИНСТРУКЦИЮ ЕЩЕ РАЗ, НАЖМИТЕ <I>,
ИНАЧЕ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ...": GO SUB 9300: IF INKEY$="I" THEN GO TO 9110
9270 BORDER 1: PAPER 1: INK 6: CLS : PRINT AT 10,0;
" ЕСЛИ ВЫ ИГРАЕТЕ С КОМПЬЮТЕРОМ, ВВЕДИТЕ ""1"", А ЕСЛИ С ПАРТНЕРОМ, ТО ВВЕДИТЕ ""2""."
9271 INPUT "ВВЕДИТЕ 1 ИЛИ 2 : ";PLAY
9272 LET PLAY=INT PLAY: IF PLAY>2 OR PLAY<1 THEN GO TO 9271 9275 IF PLAY=2 THEN GO TO 9290
9280 CLS : PRINT AT 7,0;
" ПОЖАЛУЙСТА ИМЕЙТЕ ВВИДУ, ЧТО КОГДА КОМПЬЮТЕР ПРИНИМАЕТ РЕШЕНИЕ О ТОМ, КАКУЮ КОСТЬ ЕМУ ПЕРЕБРОСИТЬ, ОН РАСПОЛАГАЕТ КОСТИ В ПОРЯДКЕ ИХ ЗНАЧЕНИЙ......
9285 PRINT "
" ЕСЛИ ВЫ ХОТИТЕ ХОДИТЬ ПЕРВЫМ, ТО ВЕДИТЕ ""-1"" ИНАЧЕ ВЕДИТЕ ""1......
9286 INPUT "ВВЕДИТЕ 1 ИЛИ -1 : ";GO
9287 LET GO=INT GO: IF GO=0 OR GO>1 OR GO<-1 THEN GO TO 9286 9290 BEEP .25,3: BEEP .15,0: BEEP .15,0: BEEP .25,3: CLS : RETURN 9300 PRINT #1;
" НАЖМИТЕ ЛЮБУЮ КЛАВИШУ...": PAUSE 0: BEEP .25,3: BEEP .15,0:CLS : RETURN
9900 POKE 23675,88: POKE 23676,255: RESTORE 9900
9901 FOR I=0 TO (18*8-1): READ A
9902 POKE USR "A"+I,A: NEXT I
9904 RETURN
9905 DATA 0,8,24,56,120,88,88,24,24,24,24,24,24,126,126,0: REM A&B=1 9910 DATA 0,0,60,126,70,2,6,12,12,24,24,48,48,126,126,0: REM C&D=2 9915 DATA 0,126,126,6,12,24,48,96,124,126,6,6,102,124,120,0: REM E&F=3 9920 DATA 0,6,14,30,54,102,102,102,102,127,127,6,6,6,6,0: REM G&H=4 9925 DATA 0,126,126,96,96,96,126,126,6,6,6,12,24,112,96,0: REM I&J=5 9930 DATA 0,6,12,24,24,48,48,120,108,108,102,102,54,60,24,0: REM K&L=6
9935 DATA 0,56,124,102,102,108,108,120,112,120,108,108,102,102,102,0: REM M&N=R 9940 DATA 0,102,102,102,102,102,102,126,126,102,102,102,102,102,102,0: REM O&P=H 9945 DATA 0,96,96,96,96,96,96,96,96,96,96,96,96,126,126,0: REM Q&R=L 9950 DATA 20,27,68,27,116,27,164,27,212,27: REM DICE PLOT CO-ORDS
9980 SAVE "DICEY" LINE 2: SAVE "chr" CODE 64600,768: VERIFY "DICEY": VERIFY "chr" CODE: GO TO 9998
9990 RANDOMIZE USR 15619: REM :ERASE "DICEY"
9992 RANDOMIZE USR 15619: REM :SAVE "DICEY" LINE 2
9994 LET ERR=USR 15619: REM : VERIFY "DICEY"
9996 IF ERR<>0 THEN PRINT FLASH 1; "ERROR!": BEEP 1,0: STOP
9998 BEEP .1,26: BEEP .1,20
9999 BORDER 7: PAPER 7: INK 0: BRIGHT 0
Автостарт программы происходит со строки 2, в которой загружается символьный набор.
В строке 3 происходит переключение курсора с [L] на [C] для упрощения опроса клавишей, а также переключение на загруженный русско-латинский символьный набор.
В строках 4...6 организован вывод инструкции при нажатии клавиши "Y". Инструкция выводится при помощи подпрограммы в строках с 9100. Прочитайте ее, Вам понятнее будут многие моменты при отладке программы.
После этого при помощи подпрограммы 9270 происходит задание числа играющих. Возможна игра "ЧЕЛОВЕК-КОМПЬЮТЕР" или "ИГРОК 1-ИГРОК 2". Это определяет переменная PLAY, соответственно имеющая значение 1 или 2. В том случае, если Вы играете с компьютером, можно предоставить право первого хода Вам или компьютеру. Это определяется переменной GO в строке 9286. В том случае, если играют два партнера, первым всегда ходит игрок 1.
В строках 8...10 происходит задание UDG-графики. Это выполняет подпрограмма со строк 9100.
Со строки 15 начинается инициализация переменных, участвующих в программе. Переменные B$ и B$ в строке 20 определяют изображение фишек на игровом поле.
Основной цикл игры представлен в строках 70...380. Остальные строки программы (с 2000) являются различными фрагментами и подпрограммами, необходимыми для игры.
После прорисовки игрового поля в строках 70 и 80 и проверки условия победы в игре (строка 90) происходит передача хода противо-другому игроку в строке 100.
В строках 200... 210 организован первый бросок. Значение костей изображается при помощи подпрограммы со строки 3500. Далее (строка 230), если бросок выполнил человек, выполняется подпрограмма со строки 3000 - это пауза для оценки результата и принятия решения о том, нужна ли переброска. Если не нужна, то программа делает скачок на строку 310. А если нужна, то следует запрос о перебрасываемых костях: сколько их и какие будут перебрасываться. Далее - возврат из подпрограммы.
В строке 231 если был ход компьютера, им выполняются действия по оценке хода и определению приоритетного варианта при помоши подпрограмм со строк 3600, 5000, 5500. Если в результате выполнения этих проверок определится, что переброска не нужна, то произойдет скачок со строки 234 на строку 310. Иначе программу продолжает группа строк 235...255 это - выполнение второго броска для тех костей, которые требуют переброски.
Строки 270...274 - это копия строк 230...234 - здесь выполняются те же действия по оценке результатов броска.
Аналогично выполняется и третий бросок при помощи строк 275...295, после чего программа продолжается со строки 310. При помощи подпрограммы со строки 3600 происходит выявление результативной комбинации костей, то есть той, которая приводит к выполнению хода игроком.
В строке 320 выявленная результативная комбинация выводится на экран. После нажатия любой клавиши (строки 330,340) происходит передача хода противоположной играющей стороне (строки 350...380), после чего программа зацикливается на строку 70, то есть на повторение всех игровых действий.
Строки 9980 и 9990 служат для самозаписи программы соответственно для магнитофонной и дисковой версии. Не забудьте также о строке 2, которая в случае дисковой версии должна быть следующей:
2 CLEAR 64599: RANDOMIZE USR 15619: REM : LOAD "chr"CODE 64600
На этом мы прощаемся с Вами, желаем с пользой и интересом провести время за этой игрой, а мы пока готовим крупный сюрприз для ближайших выпусков - программный комплекс для самостоятельного создания адвентюрных игровых программ - Adventure Building System, сокращенно - ABS.
Вы увидите, что с его помощью можно разрабатывать и увлекательные обучающие программы для детей.
Идет длительный процесс по адаптации и отладке этого пакета. Мы надеемся, что к следующему выпуску все работа будут закончены и мы вынесем его для широкого применения.
Искренне Ваш, "ИНФОРКОМ".