Игры на Бейсике своими руками 1996 г.

Игры - текст игры "CRIBBAGE".


Считается общепризнанным тот факт, что КРИБЕДЖ - это саиая ин-
тересная карточная игра для двух играющих. Есть, правда, версии и
для трех игроков и даже для четырех, но это уже ие то. Вчетвером
можно иайти игру и поинтереснее (тот же бридж, например), а вот ес-
ли Вас только двое, то крибедж - это то, чего Вам не хватает для
полного счастья.

Предполагают, что изобрел крибедж и дал ему название английс-
кий поэт, лорд Джон Саклинг (1609-1642). Впоследствии первые коло-
нисты завезли игру в Америку, где она и получила свой расцвет.

В чем прелесть крибеджа7 Дело в том, что здесь, как и в любой
другой карточной игре, определенную роль играет везение, ио не
слишком большую. У опытного игрока всегда есть возможность дока-
зать, что счастье - это хорошо, ио голова на плечах - лучше. Своим
успехом крибедж во многом обязан правилам, которые сложными пожалуй
не назовешь, но многообразными - можно Счет очков идет настолько
динамично, что для игроков даже существует специальное приспособле-
ние - доска с отверстиями Игроки по мере набора очков переставляют
свои колышки иэ отверстия в отверстие, стараясь как можно быстрее
пройти путь к концу доски.

Предлагая Вам самостоятельно набрать эту программу, мы должны
предварительно посвятить Вас в правила этой игры, в правила подсче-
та очков и дать осиовы стратегии.

В игре используется полная колода карт - 52 листа. Старшинство

карт следующее (сверху вниз): К,Д,В,10,.....3,2,Т. Туз - младшая

карта. Каждая карта инеет свое достоинство. Все фигуры и десятка -
по 10 очков, прочие - по номиналу, а туз - 1 очко.

Вся игра состоит иэ геймов, гейм состоит из раундов. Гейм за-
кончен, когда кто-то наберет 121 очко. Победителю в гейме эасчиты-
вается одио очко, если его противник набрал более 61 очка и два оч-
ка, если тот набрал меньше. О том, до какого счета по геймам Вы бу-
дете играть - договоритесь сами,, обычно играют до 6 или до 12-ти
Наша программа счет по геймам не ведет, она разыгрывает как бы один
гейм и ведет счет внутри гейма.

Сдача в игре производится по очереди. Сдающий ииеет значитель-
ное преимущество, ои ведет активную игру. Его противник как бы дер-
жит обороиу. Сдача происходит в следующем порядке:

1. Каждому сдаются по 6 карт.

2. Каждый оставляет себе по 4 карты и по две карты сбрасывает
на стол рубашкой вверх, не показывая их противнику. В результате у
каждого осталось по 4 карты и иа столе образовалась еще одна рука с
четырьмя картами - эту руку называют КРИВ. Она принадлежит сдающе-
му.

3. После сноса криба противник "срезает" колоду и сдающий отк-
рывает верхнюю (после срезки карту) Эту карту называют "стартер".
Она остается иа колоде, но условно принадлежит всем играющим, в том
числе и крибу, т.е они имеют для игры по 4 карты, но для зачетов
очков - по пять карт вместе со стартером.

Очки в раунде добываются двумя путями.

Во-первых, можно взять очки с игры. В этом смысле и сдающий и

4

его противник равны между собой.

Во-вторых, даются очки за те комбинации карт, которые образо-
вались на Вашей руке после сброса двух карт и вскрытия стартера.
Поскольку сдающий кроме своей руки владеет еще и крибом, то те ком-
бинации, которые окажутся в нем после розыгрыша раунда, прибавятся
к его очкам.

ИГРА.

Сначала рассмотрим, как набираются очки с игры. Игра произво-
дится поочередным выкладыванием карт на стол. При зтом нельзя, что-
бы сумма выложенных карт превысила 31 очко.

Первым выкладывает любую свою карту несдававший. Затеи кладет
карту сдатчик. При этом:

- если полученная сумма равна 15. ему запишется 2 очка;

- если его карта равиа карте предыдущего хода, т.е. образуется
"пара", ему запишется 2 очка.

Ход переходит к несдававшему. Он может сделать:

- "пятнадцать" (2 очка)

- "пару"(2 очка)

- "секанс" (три карты подряд, например, ДЕСЯТКА, ВАЛЕТ, ДАМА
или ТРОЙКА, ДВОЙКА, ТУЗ - 3 очка).

Ход переходит, и так далее.

В последующие ходы могут возникать и более сложные комбинации:

- "секансы" из более чем трех карт оцениваются во столько оч-
ков, сколько карт в секаисе.

- "пэр рояль" - три одинаковые карты подряд дают 6 очков.

- "двойной пэр рояль" - 4 карты одного достоинства - 12 очков.

Так игроки ходят по очереди до тех пор, пока один иэ ннх не
сможет сделать ход. Ведь выходить за пределы 31 очка нельзя. Тогда
он объявляет "ХОД" и его противник получает себе очко. Теперь про-
тивник может, если у него есть мелкие карты, выкладывать их на
стол, оставаясь в пределах 31 очка. Так можно выложить за ход и две
и три карты подряд. Если ему удается в результате своего хода наб-
рать ровно тридцать одио, ему запишется 2 очка, если меньше, то од-
но.

Когда и второй играющий не сможет сделать хода, то с оставши-
мися на руках картами игроки начинают новую выкладку. Первым кладет
карту тот, кто первым пропустил ход.

Ход последней картой (из восьми) дает еще одно очко, а если к
тому же в результате этого хода образовалось 31, то добавляются 2
дополнительных очка.

Теперь, когда все карты выложены, игроки начинают подсчитывать
свои очки за комбинации, которые у них были на руках к началу игры.
Начинающим для простоты можно разобрать выложенные карты со стола
по рукам и начать считать. В игре с компьютером подсчет сделает за
Вас машииа, если Вы этого пожелаете. Стартер считается пятой картой
для каждой из трех рук.

В зачет идут следующие комбинации:

"Пятнадцать" - 2 очка.
"Пара" - 2 очка.
"Пэр рояль" - 6 очков.
"Двойной пэр рояль" - 12 очков.
"Секанс" - по числу карт.
"Флешь" 4 или 5 очков.

Флешь - это 4 карты одной масти в руке, но ие в крибе (4 оч-
ка) . Если ту же масть имеет стартер - то 5 очков. За 4 карты одной
масти в крибе не дается ничего, но если эту масть имеет и стартер,
то хозяин криба (сдающий) получает 5 очков. "Дворецкий" - Если у
Вас на руках есть валет той же насти, что и масть стартера. Вы по-
лучаете одно очко, "челядь" - Если валет оказывается картой-старте-
ром, то сдатчику эасчитывается очко.

Теперь рассмотрим некоторые примеры подсчета очков. Комбинация
КОРОЛЬ, ДАМА, ДАМА, ВАЛЕТ:

КОРОЛЬ, ДАМА, ВАЛЕТ - 3 очка
КОРОЛЬ, ДАМА, ВАЛЕТ - 3 очка
ДАМА, ДАМА - 2 очка

Итого: 8 очков

Комбинация КОРОЛЬ, ДАМА, ДАМА, ВАЛЕТ, 10:

КОРОЛЬ, ДАМА, ВАЛЕТ, 10-4 очка
КОРОЛЬ, ДАМА, ВАЛЕТ, 10-4 очка
ДАМА, ДАМА - 2 очка

Итого: 10 очков

Комбинация КОРОЛЬ, ДАМА, ДАМА, ДАМА, ВАЛЕТ:

КОРОЛЬ, ДАМА, ВАЛЕТ - 3 очка
КОРОЛЬ, ДАМА, ВАЛЕТ - 3 очка
КОРОЛЬ, ДАМА, ВАЛЕТ - 3 очка
ДАМА, ДАМА, ДАМА - 6 ОЧКОВ

Итого: 15 очков

комбинация КОРОЛЬ, ДАМА, ДАМА, ВАЛЕТ, ВАЛЕТ:

КОРОЛЬ, ДАМА, ВАЛЕТ - 3 очка

КОРОЛЬ, ДАМА, ВАЛЕТ - 3 очка

КОРОЛЬ, ДАМА, ВАЛЕТ - 3 очка

КОРОЛЬ, ДАМА, ВАЛЕТ - 3 очка

ДАМА, ДАМА - 2 очка

ВАЛЕТ, ВАЛЕТ - 2 очка

Итого: 16 очков

как видите, в крибедже не так просто правильно подсчитать все
положенные Вам очки. В этом тоже есть интересный элемент игры. Счи-
тать нужно быстро и точно - этому Вас научит правило МАГГИНЗ. Дело
в том, что если Вы, объявляя свои очки, что-то забудете подсчитать,
то Ваш соперник имеет право Вас подправить, объявив "Маггинэ!" и
эти очки, которые он увидел, а Вы - нет, запишутся ему.

Вообще-то говоря, не принято при игре с новичками пользоваться
этим правилом, поэтому в той программе, которая предлагается Вашему
вниманию, есть возможность играть с этим правилом или без. Если Вы
играете с ним, то сами должны ввести количество своих очков. Ошибе-
тесь , компьютер сделает Вам "Маггинэ!". Если Вы от этого правила
откажетесь, то компьютер будет делать все расчеты и за Вас и за се-
бя по всем правилам.

СТРАТЕГИЯ В КРИБЕДЖЕ.

Исследование стратегий в крибедже можно разделить на два эта-
па. На первом этапе игроки должны определиться со сносом в криб. На
первый взгляд достаточно сосчитать все очки в шести картах и отло-
жить две с тем, чтобы сохранить максимальный счет в оставшихся че-
тырех. Но иногда это приводит к тому, что приходится сносить в криб
очки или ценные карты. Если криб принадлежит Вам, в этом нет ничего
плохого, но если он принадлежит противнику, лучше ослабить руку и
"надуть" криб. В криб противника очень опасно сносить пятерки, се-
мерки, восьмерки и карты, которые могут стать основой для секанса.
Лучшими для "надувания" являются очень высокие по достоинству,
очень малые и карты "с разбросом", имеющие по достоинству промежу-
ток в две и более карты.

Иногда приходится дробить комбинацию на руке, даже если криб
принадлежит Вам. Как правило, лучше сохранить секаис и разбить па-
ру, если это необходимо. Секанс в руке дает хорошие ожидания на
поддержку от стартера, после того, как он будет открыт.

На втором этапе, в розыгрыше игры основной принцип стратегии
состоит в том, чтобы не дать противнику объявить "пятнадцать" или
"секанс". Самой надежной картой для первого хода является ход "чет-
веркой" . В ответ противник ни может сделать "пятнадцать", ни может
помешать это сделать Вам. Ои конечно может дать "пару", но против
пар защиты быть не может.

Десятиочковая карта (десятка или фигура) не очень хороший пер-
вый ход, но он неплох, если у Вас есть пятерка. Когда противник
объявит "пятнадцать", Вы поставите "пару".

Гораздо приятнее ход, например семеркой. Если противник поста-
вит "пару". Вы сможете тузом сделать "пятнадцать". Если противник
поставит "пятнадцать" с помощью восьмерки, у Вас возможность дать
"пару" и открытая и сверху и снизу секансная последовательность.

Одним словом, если у Вас на руке есть "пятнадцать", например
9+6 то ходите старшей иэ них - это безопасно. При отсутствии других
соображений ходить старшими более предпочтительно, сберегая младшие
на конец раунда для игры под 31 очком.

ПРИМЕР РОЗЫГРЫША ПАРТИИ.

Рассмотрим в качестве примера розыгрыш одной партии, после че-
го перейдем непосредственно к нашей программе, в результате сдачи
карт образовался следующий расклад:

СДАТЧИК ПРОТИВНИК

ПК Б9 Т9 Б8 П7 ЧТ БВ П10 48 Т7 45 ТЗ

Противник сносит в криб 10-3. Он не может сбросить 8-7 как
прекрасную комбинацию (это "пятнадцать" и хорошая основа для "се-
канса"). Ои не может сбросить 5, т.к. велика вероятность, что стар-
тером окажется десятиочковая карта. Выбирая между бубновым валетом
и пиковой десяткой, он предпочитает оставить валета, т.к. он может
оказаться "дворецким".

f

У сдатчика уже есть двойной "секанс" 9-9-8-7, поэтому он легко
сносит К-Т.

После переворота <ртартера оказалось, что это пиковая шестерка.

1. Противник заходит восьмеркой (можно было пойти и семеркой).
- "Восемь"

2- Сдатчик делает ход семеркой- - "Пятнадцать" - "два очка".

3. Противник кладет семерку. - "Двадцать два" - "пара" - "два
очка".

4. Сдатчик играет бубновой девяткой. - "Тридцать одно" - "два
очка".

5. Противник открывает новый счет. Он ходит валетом - "Де-
сять ."

6. Сдатчик может положить восьмерку или девятку. Ои кладет де-
вятку, полагая, что девятки у противника иет, иначе тот на третьем
ходу положил бы ее, делая "секанс", а он сделал "пару" - "Девят-
надцать" .

7. Противник играет пятеркой. - "Двадцать четыре".

8. у сдатчнка восьмерка. Ее класть нельзя, т.к. сумма превысит
31 очко. Он объявляет "Ход!" и противник заносит себе очко.

9. У противника нет карт. Счет открывается в третий раз. Ходит
сдатчик, выкладывает свою восьмерку и получает очко "за последнюю
карту".

Начинается подсчет комбинаций.

ПРОТИВНИК

"пятнадцать" В,5 - 2 очка

"пятнадцать" 8,7 - 2 очка
"секаис" 8,7,6,5 - 4 очка

Итого: 8 очков

Сдатчик открывает криб, ио таи, к сожалению, иет ии одного оч-
ка .

ПРОГРАММА

Программа отличается эиачительиым размером и представляет не-
малую сложность в отладке. Для упрощения этой трудоемкой работы мы
привели в конце статьи комментарий к программе - ои Вам поможет.

1 GO ТО 10

2 CLEAR 64599. LOAD "chr"CODE
64600

4 GO SUB В: GO SUB 9900: RUN

5 SAVE "CRIBBAGE" LINE 2:STOP

8 POKE 23606,88: POKE 23607,2
51 RETURN

9 POKE 23606,0: POKE 23607,60
: RETURN

10 GO SUB 8

60 DEF FN T(X)=(X>9)»10+(X<10)

*X

70 DEF FN S(X)=10*(X-INT (X))
80 GO TO 7000
500 REM ***********************
********** ВЫБОР 2-Х КАРТ

510 PRINT AT 7,8; FLASH 1;"Я ДУ
МАЮ";AT 0,0;
565 FOR 1=1 TO 5
570 FOR 3 = 1 + 1 TO 6
575 LET Y-l: LET SUM=0: LET F5

580 FOR X=1 TO 6
585 IF X=I OR X=J THEN GO TO 6
10

590 LET H(Y)=C(X): LET I(Y)=D(X
): LET H$(Y)=C$(X): LET SUM-SUM*
I(Y)

595 IF I(Y)=5 THEN LET F5=F5+1

600 LET Y=Y+1

610 NEXT X

620 GO SUB 1000

630 LET S=S+P+F+FL+F5. LET CR=0
640 IF C(3)=C(I) OR C(3)=C(I)+1
THEN LET CR=2

645 IF C(I)=5 OR D(3)=5 THEN L
ET CR-CR+2

650 IF D(I)+D(J)=15 THEN LET С
R=CR+2

652 IF DEBUG THEN PRINT . FOR
G=1 TO 4: PRINT H(G);" ";: NEXT
G: PRINT ,S;" ";CR;" ";

655 IF DIR-1 THEN LET S=S+CR:
GO TO 665
660 LET S-S-CR

665 IF S>MAX THEN LET MAX-S: L
ET T(l)-I: LET T(2)=3 IF DEBUG
THEN PRINT "X";
670 NEXT 3: NEXT I
675 LET Y=0

680 LET X=T(1): GO SUB 5300
685 LET X=T(2): GO SUB 5300
690 PRINT AT 7,8;" ГОТОВ "
695 RETURN
1000 HEM ***********************
.**.**».«. РАСЧЕТ РУКИ
1070 LET p=0- LET F=0: LET FL-4:

REM (FL-4)
1110 IF SUM-15 THEN LET F-2
1120 FOR X-l TO C-l
1130 FOR Y-X+l TO С
1140 IF H(X)=H(Y) THEN LET P-P+
2

1150 IF I(X)+I(Y)-15 THEN LET F
-F+2

1155 IF C<5 THEN GO TO 1220

1160 LET T-0

1170 FOR Z=1 TO С

1180 IF Z=X OR Z=Y THEN GO TO 1

200

1190 LET T=I(Z)+T
1200 NEXT Z

1210 IF T-15 THEN LET F-F+2

1220 NEXT Y: NEXT X

1240 FOR X=1 TO 4

1250 IF SUM-I(X)«15 THEN LET F=

F+2

1260 IF H$(X)<>H$ (1) THEN LET F
L-0: REM (FL=0)
1270 NEXT X

1280 IF C-4 THEN GO TO 1400
1290 IF SUM-I(5)=15 THEN LET F-
F+2

1300 IF FL-4 and H$(5)»Ht(l) THE
n LET FL=5: REM (FL)
1310 IF FL-4 AND CR-1 THEN LET
FL-O: REM ФЛЕШЬ В КРИБЕ МОЖЕТ

ИМЕТЬ НЕ МЕНЕЕ 5 КАРТ
1400 LET Х=1: LET S-0
1410 IF Х>3 THEN RETURN
1420 LET R-l: LET D-l
1430 IF H(X+1)-H(X)+1 THEN LET
R-R+l. GO TO 1490
1440 IF H(X+1)>H(X) THEN GO TO
1470

1450 LET D=D+1 IF D<>3 THEN GO
TO 1490

1455 IF H(X-l)OH(X) THEN LET D
-4

1460 GO TO 1490

1470 IF R>RLEN THEN LET S=S+D*R
: IF R-2 THEN LET S=S-D
1480 LET X-X+l: GO TO 1410
1490 LET X-X+l: IF X<C THEN GO
TO 1430

1500 IF R>RLEN THEN LET S=S+D*R

IF R-2 THEN LET S-S-D
1510 RETURN

2000 REM ***********************

*.*..* ВЫКЛАДЫВАНИЕ КАРТ НА СТОЛ

2005 LET Р-0: LET S-0

2008 LET CT-FN T(C)

2010 IF SUM+CT>31 THEN LET S--1

: RETURN

2015 LET N-N+l LET T(N)=C
2020 LET T-SUM+CT: IF T-15 OR T=
31 THEN LET S=2
2022 IF N=1 THEN RETURN

2025 IF ABS (T(N-1)-C)>=N THEN
RETURN

2026 REM ****** ПРОВЕРКА НА ПАРУ
2030 FOR X=N-1 TO 1 STEP -1
2040 IF T(N)OT(X) THEN GO TO 2
100

2050 LET P—P+2
2060 NEXT X

2100 IF P-6 THEN LET P=12
2110 IF P-4 THEN LET P-6
2115 LET S-S+P
2120 IF P>0 THEN RETURN
2130 REM ПАР НЕТ,

ПРОВЕРИМ СЕКАНСЫ
2200 IF N<3 THEN RETURN
2210 FOR L=3 TO N
2220 LET Y=1
2230 FOR X=N-L+1 TO N
2240 LET H(Y)=T(X): LET Y=Y+1
2250 NEXT X
2270 GO SUB 24 00
2330 LET R=1 : REM (R=L)
2340 FOR X-l TO L-l
2350 IF H(X)+loH(X+l) THEN GO
TO 2380
2360 NEXT X

2370 IF R>P THEN LET P=R
2380 NEXT L
2385 LET S-S+P
2390 RETURN

24 00 REM ПОДПРОГРАММА СОРТИРОВКИ

МАССИВА H() РАЗМЕРНОСТЬЮ L;

2410 LET Z=0

2420 FOR X-l TO L-l

2430 IF H(X)>H(X+1) THEN LET Z=

H(X): LET H(X)=H(X+1): LET H(X+l

)=Z

2440 NEXT X

2450 IF ZOO THEN GO TO 2410
2460 RETURN

2700 REM ***»«*♦*«»»• ХОД ИГРОКА
2710 IF NH-4 THEN LET HGO=l: PR
INT AT 6,9;" ХОД! ": RETURN
2715 LET М$="ВЫБЕРИТЕ КАРТУ": GO
SUB 5500

2720 LET C=4: LET X=1: GO SUB 37
00

2740 IF B(X)<>0 THEN GO TO 2765
274 2 IF SUM<22 THEN GO TO 2720
2745 PRINT AT 21,X«4-4;"ВАШ ХОД?

II

2747 LET М$="ЕСЛИ НЕЧЕМ ХОДИТЬ,
НАЖМИТЕ ENTER": GO SUB 5500
2750 LET HGO=X: PAUSE 30
2755 print at 21,hgo*4-4;"

": go sub 3700
2760 if hgoox then go to 2740

2762 if sum<safe then let safe=
sum

2763 return

2765 let k=x: beep .02,15

2770 let c=a(k): go sub 2000

2775 if s<0 then beep .2,20: le

t MS-"сумма должна быть меньше 3

2": go sub 5500: go to 2720

2780 let nh=nh+1

2785 let sum-t: let b(k)=0

2790 let x=k: let y=16

2800 go sub 5300

2820 let x=nh: let y=8

2830 let x$=r$(c): let y$=a$(k)

2840 go sub 5400

2850 let player=man

2900 rem •»»»•»«** подсчет очков

2910 paper 4

2920 print at 6,0;"всего ";sum;"

•I

2940 print at 6,9:" ";s;" "
2955 go sub 6000
2960 return

3200 rem «»*•**.* ход компьютера
3220 if nc=4 then let cgo=l: re
turn

3225 let m$="" : go sub 5500
3230 if debug-1 then print #1;a

т о,о;n$;at 0,0;

3240 let max=-9: let x1=0

3250 for 1=1 to 4

3260 if d(i)<0 then go to 3500:

rem ход уже сделан
3270 let c=c(i)

3280 go sub 2000: if s<0 then g
о to 3500: rem he по правилам
3290 let n=n-1: let i(i)=s: rem
переиграть, счет сохранить
3300 rem »•* специальные правила
3305 IF T+031 AND T<SAFE THEN
LET S=S-1

3310 LET S=S+(T>15)-(T=21)+(T>=S
AFE)-2*(T=5)

3315 IF N>0 THEN GO TO 3400
3 320 FOR 3=1 TO 4
3330 IF 1=3 OR D(3)<0 THEN GO T
О 3360

3340 IF T<>5 AND T+D(3)=15 THEN
LET S-S+2
3350 IF ABS (C-C(3))<2 THEN LET
S=S+2
3360 NEXT 3
3380 GO TO 3450

3400 IF ABS (T(N)-C)>2 THEN GO
Tb 3450

3410 FOR 3=1 TO 4

3420 IF 3=1 OR D(3)<0 THEN GO T

О 3440

3430 IF ABS (T(N)-C(3))<=2 THEN ■

IF T+2*D(I)<32 THEN LET S=S+2
3440 NEXT 3
3450 LET S-S+(RND>.6)
3460 IF S>=MAX THEN LET MAX=S:
LET X1=I

3490 IF DEBUG THEN PRINT #1;C;"

=,,;I(I);,,,,,;S;,,

3500 NEXT I

3550 IF X1=0 THEN LET CGO=l: PR
INT AT 6,9;" ХОД! "j RETURN
3560 LET C=C(X1): LET T=SUM+FN T

(C)

3570 LET N=N+1: LET T(N)=C
3580 LET SUM=T: LET S=I(X1)
3590 LET NC=NC+l: LET D(X1)«-9
3600 LET X=NC: LET Y=0
3610 LET XS=RS(C): LET YS-CS(Xl)
3620 BEEP .02,12: GO SUB 5400
3630 LET PLAYER-ZX
3640 GO TO 2900

3700 REM ***********************
**.«.****. ВЫБОР КАРТЫ
3710 PAPER 4
3720 PRINT AT 21,X*4-3; FLASH 1,
ii .

3725 IF INKEYSo"» THEN GO TO 3
725

3730 IF CODE INKEY$=13 THEN GO
TO 3800

3750 IF INKEYSo" " THEN GO TO
3730

3760 PRINT AT 21,X*4-3;"
3770 LET X=X+1: IF X>C THEN LET
X=1

3790 GO TO 3720

3800 PRINT AT 21,X*4-3;" ";

3810 RETURN

4000 REM ***********************

**....***. ОЧЕРЕДНОСТЬ ХОДОВ

4040 LET RLEN-2

4050 LET NH-0: LET NC=0

4065 LET SAFE=31

4080 GO SUB 4400

4090 IF DIRoZX THEN GO TO 4200

4100 REM ИГРОК

4110 IF DONE=l THEN RETURN

4120 GO SUB 2700

4125 IF WIN>0 THEN RETURN

4130 IF SUM=31 THEN GO SUB 4300

GO TO 4200
4140 IF CGO=0 THEN GO TO 4200
4150 IF HGO-O THEN GO TO 4100
4160 LET S=1: GO SUB 2900: IF WI
N>0 THEN RETURN
4170 GO SUB 4300
4200 REM КОМПЬЮТЕР
4205 IF DONE=l THEN RETURN
4210 GO SUB 3200
4 220 IF WIN>0 THEN RETURN
4230 IF SUM=31 THEN GO SUB 4300
- GO TO 4100

4240 IF HGO-O THEN GO TO 4100
4250 IF CGO-O THEN GO TO 4200
4260 LET S=1: GO SUB 2900: IF WI
N>0 THEN RETURN
4270 GO SUB 4300
4290 go to 4100

4300 rem ******* переворот карты

4310 let y=0

4 320 for x=1 to nc

4325 go sub 5350

4 330 next x

4 340 let ¥-8

4 350 for x=1 to nh

4 360 go sub 5350

4370 next x

4400 rem ******* следующий раунд

4405 let done-o

4420 let sum=0- let n«=0

4 430 if nh=4 and nc=4 then let

done=l

4440 let cgc=0. let hgo=0

4450 go sub 2900 return

4500 rem ***********************

******* открытие и подсчет очков

4510 print #1;at o.o.n»

4515 let c-=5: let rlen-2

4520 let x=18: go sub 5600

4530 if dir=zx then go to 4600

4540 for x=1 to 5

4550 let h(x)=c(x): let h$(x)=c$

(X)

4560 next x

4570 let up=1: let c-4: go sub 5
100

4575 let м»-"считаю свои очки".
go sub 5500

4580 let player=zx: go sub 4700

4585 if win then return

4590 if dir-zx then go to 4 660

4600 let m$="считаю ваши очки":

go sub 5500

4605 for x»1 to 5

4610 let h(x)=a(x) : let h»(x)«=a$

(X)

4620 next x

4625 let c=4: let y=ll
4630 go sub 5000
4640 let player-man: go sub 4 700

4645 if win then return

4650 if dir-zx then go to 4540

4660 let m$="вскрываю криб? (люб
ая клавиша)": go sub 5500

4661 pause 0

4665 let x-18 go sub 5600
4670 go sub 5200

4675 let ms"--"считаю очки в крибе
": go sub 5500
4680 go sub 4700
4690 return

4700 rem ***********************

********** подсчет очков

4705 let nob^o: let sum=0

4710 for x«=l to 5

4715 if x<5 and h(x)«11 and h$(

x)=es(5) then let nob-1

4720 let i(x)=fn t(h(x))

4735 let sum-sum+i(x)

4740 next x

4750 let l-5: go sub 2400
4760 let c=5: go sub 1000
4 765 priht

4770 let m$«"": go sub 5500
4775 if player=zx or not mug the
n go to 4 820

4780 input "введите свой счет: "
;ss

4785 if ss<0 or ss>50 then go t
о 4780

4790 if ss-s+p+f+fl+nob then le
t м$«"я согласен": let s=ss: go
to 4880

4795 let m$=str$ ss+" - неверно.
я получаю очки!"
4800 let mug-2: let player-=zx
4820 paper 4

4830 if f>0 then print j,15-tb -

II . p - tl H о

4840 if p>0 then print "пары -"
;P;" ■■;

4845 PRINT

4850 IF FL>0 THEN PRINT "ФЛЕШЬ
-";FL;" ";

4860 IF S>0 THEN PRINT "СЕКАНС-

" ;S;

4865 PRINT

4870 IF NOB=l THEN PRINT "ЕГО E

ЛАГОРОДИЕ -1"

4875 LET S-S+P+F+FL+NOB

4880 PRINT "ВСЕГО = " ;S;

4885 IF MUG-2 THEN PRINT " МОИ!

4890 GO SUB 5500: GO SUB 6000

4891 IF MUG=2 THEN LET PLAYER=M
AN: LET MUG=1: PAUSE 100

4895 RETURN

4900 REM ***********************
***** СНЯТИЕ КОЛОДЫ - СТАРТЕР ВЫ
КЛАДЫВАЕТСЯ ПЯТОЙ КАРТОЙ В РУКЕ
4905 LET У—8: GO SUB 5350
4910 LET М$="ТЕПЕРЬ Я СНИМАЮ КОЛ
ОДУ"

4915 IF PLAYER-MAN THEN GO SUB
5500: PAUSE 50: GO TO 4930
4920 LET M$■="СНИМИТЕ КОЛОДУ - ЛЮ
БОЙ КЛАВИШЕЙ": GO SUB 5500
4925 IF INKEY$="" THEN GO TO 49
25

4 930 LET R=RND*40+12.5

4935 LET K=INT P(R)

4940 IF K-S THEN GO TO 4930

4945 LET K$=St(FN S(P(R)))

4950 LET X$=R$(K): LET Y$=K$

4955 LET X-X-.25: LET Y=7

4960 GO SUB 5400

4965 LET A(5)=K: LET A$(5)«K$

4970 LET C(5)=K: LET C$(5)=K$

4975 LET E(5)=K: LET E$(5)=Kt

4980 RETURN

4985 LET E(5)=K: LET E$(5)=KS
5000 REM *** ВЫКЛАДКА ВАШЕЙ РУКИ
5020 FOR Х=1 TO С

5030 LET X»=R$(A(X))- LET Y$=A$(

X)

5040 GO SUB 5400
5050 NEXT X: RETURN
5100 REM *** ВЫКЛАДКА РУКИ
КОМПЬЮТЕРА

5110 LET Y=0

5120 FOR X-l TO С

5130 LET X»=RI(C(X)): LET Y$=CS(

X)

5150 GO SUB 5400

5170 NEXT X: RETURN

5200 REM ******** ВЫКЛАДКА КРИВА

5210 LET CR=1: LET ¥=11: IF DIR=

ZX THEN LET Y=0

5220 FOR X=1 TO 5

5230 LET H(X)=E(X): LET H$(X)-E$

(X)

5240 LET X$=Rt(E(X)): LET Y$=ES(
X)

5250 IF X<5 THEN GO SUB 5400

5270 NEXT X: RETURN

5300 REM ******** СТИРАНИЕ КАРТЫ

5310 PAPER 4: GO TO 5370

5 350 REM ЗАКРЫТАЯ КАРТА

5360 PAPER 2

5370 LET X$=" ": LET Y$=X$: GO T
О 5420

5 400 REM ОТКРЫТАЯ КАРТА

5410 PAPER 7: IF Y$=S$(1) OR Y$=

S$(3) THEN INK 2

5420 LET Xl-4*X-4

5440 PRINT AT Y,XI;X$;" ";AT Y+

1,X1;¥$;" "

5450 PRINT AT Y+2,XI;" ";AT Y+
3,XI;" " ;Y$

5460 PRINT AT Y+4,XI;" ";X$
5470 PAPER 4: INK 0: RETURN
5500 REM ****** ПЕЧАТЬ СООБЩЕНИЙ

5510 PRINT #l;AT 1,0;N$;AT 1,0;M
$

5520 BEEP .1,20: RETURN
5600 REM ******** ОЧИСТКА ЭКРАНА
5630 PAPER 4: PRINT AT 0,0;
5650 FOR Y-l TO 22: PRINT TAB X:

next y

5690 PRINT AT 0,0: RETURN
5700 REM ***********************
ИЗОБРАЖЕНИЕ ДОСКИ ДЛЯ КРИБЕДЖА
5710 PRINT AT 0,25; PAPER 6;" ВЫ
Я "

5715 PRINT TAB 25, PAPER 6;"
ii

5720 FOR Y-l TO 6
5730 PRINT TAB 25; PAPER 6;" A
A "

5740 PRINT TAB 25; PAPER 6;" A
A "

5750 PRINT TAB 25; PAPER 6;" В

В "
5760 NEXT Y

5765 PRINT TAB 25; PAPER 6;"

и

5770 PRINT NS: PAPER 6

5775 PRINT AT 2,28 "E";AT 19,28;

"E" :

5780 LET М$="КРИБЕДЖ"
5790 FOR X-l TO 7
5800 PRINT AT 2*X+1,28;M$(X)
5810 NEXT X

5820 PRINT AT 1,0;: PAPER 4: RET
URN

6000 REM *** КОРРЕКТИРОВКА СЧЕТА
6010 BEEP .2,10

6015 IF S-0 THEN RETURN : REM
ВХОД В ДЕМОНСТРАЦИОННУЮ
ПОДПРОГРАММУ
6020 LET SS—V(PLAYER)
6030 IF SS>0 THEN GO SUB 64 00
6040 LET V(PLAYER)=S(PLAYER)
6050 LET S(PLAYER)=S(PLAYER)+S
6060 IF S(PLAYER)>120 THEN LET
WIN-PLAYER. GO TO 6085
6070 LET SS-S(PLAYER)
6080 GO SUB 6400

6085 PRINT PAPER 6;AT 20,25;S(M

AN)

6090 PRINT PAPER 6;AT 20,31-(S(
ZX)>99)-(S(ZX)>9);S(ZX)
6095 RETURN

6400 LET X=25 LET V-l

6405 IF PLAYER-ZX THEN LET X-31

: LET V=3

6410 IF SS>60 THEN LET SS=SS-60
6415 IF SS<31 THEN LET SS=31-SS
: GO TO 644 0

64 20 LET SS-SS-30: LET X-27: LET
V-3: IF PLAYER-ZX THEN LET X=2
9: LET V-l

6440 LET Y—1+(SS+INT ((SS-1J/5))

/2

6450 IF YolNT Y THEN LET Y-INT

Y+l: LET V=V+1
6460 PRINT OVER 1; PAPER 6;AT Y
,X:V$(V)
6490 RETURN

7000 REM ********* ИНИЦИАЛИЗАЦИЯ
7005 RANDOMIZE : LET DEBUG=0
7010 BORDER 4:PAPER 4:INK 0:CLS
7020 LET X—0: LET Y=0: LET Z=0:
LET 1=0: LET 3-0

7025 DIM h(8)' DIM hs(6) DIM I{

6)

7030 DIM A(6): DIM AS(6): DIM Bf

6): REM РУКА ИГРОКА

7035 DIM C(6) DIM C$(6)- DIM D(

6): REM РУКА КОМПЬЮТЕРА

704 0 DIM E(6): DIM E$(6): REM

РУКА КРИВА
7050 DIM G(2): DIM S(2): DIM V(2
) DIM V$(5). REM СЧЕТ
7055 DIM P(52): DIM T(12): REM
КОЛОДА

7060 POKE 23658,8; INPUT "ДОБРО
ПОЖАЛОВАТЬ"1j"ВАМ НУЖНА ИНСТРУКЦ
ИЯ? (Y/N):";!$

7070 IF I$(1)="Y" THEN GO SUB 9
ООО

7300 LET ZX=1: LET MAN-2
7310 LET Vt-"GF3IK"
7315 LET St«="HCDS"
7320 LET Rt-"T234 56789RLMN"
7330 LET NJ-"

7335 LET 0$ = "НАЖМИТЕ ЛЮБУЮ КЛАВИ
ШУ"

7340 IF It="Y" THEN GO SUB 9050

7350 REM ***** ПОДГОТОВКА КОЛОДЫ

7355 LET Z=0

7360 FOR X-l TO 13

7365 FOR Y-l TO .4 STEP .1

7370 LET Z=Z+1: LET P(Z)=X+Y

7375 NEXT Y

7380 NEXT X

7390 LET G(MAN)cO: LET G(ZX)=0
7400 REM ***********************
**.*.*...« НАЧАЛО НОВОЙ ИГРЫ

7404 LET MUG-О

7405 POKE 23658,8. INPUT "ИГРАЕМ
С ПРАВИЛОМ МАГГИНЗ? ";М$: IF М$

■="Y" THEN LET MUG-1

7406 GO SUB 5700

7410 PRINT #1 ;AT 0,0;"МЛАДИ1АЯ KA
РТА СДАЕТ"

7420 LET S(ZX)«0: LET S(MAN)-0:

LET V(1)=0: LET V(2)«0

7425 LET DIR=ZX: LET S=0: LET PL

AYER=ZX: LET WIN-0

7430 LET X=2: GO SUB 4900: LET S

=K

7435 PAUSE 50

7440 LET PLAYER-MAN LET X=5: GO

SUB 4900
7450 IF S<K THEN LET DIR-MAN
7470 PAUSE 50: LET X=23: GO SUB
5600

7500 REM ***********************
******* ТАСОВАНИЕ КОЛОДЫ И СДАЧА
7510 LET М$ = "Я СДАЮ"

7520 IF DIR-MAN THEN LET М$="ВЫ
СДЕТЕ"

7530 PRINT #0;AT 0,0;M$;N»

7535 LET М$="ТАСУЮ КОЛОДУ"

7540 GO SUB 5500

7610 FOR X=1 TO 51

7620 LET Y-INT (RND*(53-Х))+X: L

ET Z-=P(X) LET P(X)=P(Y): LET P(

Y)-Z

7630 NEXT X

7635 LET Mt="": GO SUB 5500

7640 REM ******* СОРТИРОВКА КАРТ

7650 FOR Y=1 TO 7 STEP 6

7655 LET Z-0

7660 FOR X-Y TO Y+4

7670 IF P(X)>P(X+1) THEN LET Z-

X: LET 3-P(X): LET P(X)-P(X+1).

LET P(X+l)-3

7680 NEXT X: IF Z>0 THEN GO TO
7655

7690 NEXT Y

7700 REM ******* СДАЧА

7710 LET 1-0: LET 3=16

7720 IF DIR-ZX THEN LET 1=16: L

ET 3-0

77 30 FOR X=1 TO 6

7740 LET V-I: GO SUB 5350

7750 LET C(X)=INT P(X): LET C$(X

)=S$(FN S(P(X)))

7760 LET D(X)=FN T(C(X))

7770 LET Y-3: GO SUB 5350

7780 LET A(X)=INT P(X+6): LET A$

(X)=S$(FN S(P(X+6)))

7790 LET B(X)-1

7795 NEXT X

7799 REM ****** СНОС КАРТ В КРИБ

7800 LET C-6: LET Y-16: GO SUB 5
000

7805 IF DEBUG THEN GO SUB 5100
7810 LET M$="ПОДОЖДИТЕ, ПОКА Я С
НЕСУ 2 КАРТЫ": GO SUB 5500
7820 LET С-4: LET RLEN-1: LET CR
IB-0
7825 LET MAX=-99: LET T(l)=l: LE

T T(2)=6

7830 GO SUB 500

7840 LET Mt="ВЫБЕРИТЕ 2 КАРТЫ":
GO SUB 5500

7845 IF It—"Y" THEN GO SUB 9300
: GO SUB 9400

7850 LET C=6: LET Y-16: LET X-l
7860 GO SUB 3700: GO SUB 5350
7870 LET T(3)=X: GO SUB 3700
7880 L'ET Xt=Rt(A(X)): LET Yt-AS (
X)

7885 IF X-T(3) THEN GO SUB 5350
: GO TO 7860

7890 LET T(4)=X: GO SUB 5350

7895 REM ********** ЗАКРЫТИЕ РУК

7900 FOR X=1 TO 2

7905 LET E(X)=C(T(X)): LET Et(X)

=Ct(T(X))

7910 LET C(T(X))=0
7915 LET E(X+2)=A(T(X+2)): LET E
$(X+2)=At(T(X+2))
7920 LET A(T(X+2))=0
7925 NEXT X
7930 LET Y-l: LET Z-l
7935 FOR X=1 TO 6
7940 IF C(X)=0 THEN GO TO 7955
7945 LET C(Y)-C(X) : LET D(Y)=D(X
)

7950 LET Ct(Y)-C$(X): LET Y=Y+1
7955 IF A(X)=0 THEN GO TO 7970
7960 LET A(Z)=A(X) : LET At(Z)-At
(X): LET Z-Z+l
7970 NEXT X

7980 LET X=24: GO SUB 5600
7985 IF I$-"Y" THEN GO SUB 9450
7990 PRINT #0;AT 0,0;Nt

7999 REM ************ ХОД КАРТОЙ

8000 LET S=0: LET PLAYER-DIR
8010 LET X-6: GO SUB 4900

8020 IF K=ll THEN LET M$="2 ОЧК
А ЗА ЕГО ЧЕЛЯДЬ": GO SUB 5500: L
ET S=2: GO SUB 6000: PAUSE 40

8030 LET C-4

8040 LET Y-16: GO SUB 5000

8050 GO SUB 4000

8060 IF WIN THEN GO TO 8200

8065 IF IS="Y" THEN GO SUB 9200

8070 GO SUB 4500

8080 IF WIN THEN GO TO 8200

8100 LET Mt="СЛЕДУЮЩИЙ ХОД? (ЛЮБ

АЯ КЛАВИША)": GO SUB 5500

8105 IF INKEYt-"" THEN GO TO 81

05

8110 LET DIR-DIR+1: IF DIR>2 THE
N LET DIR-1

8120 LET X-25: GO SUB 5600
8130 IF It<>"Y" THEN GO TO 7500
8140 POKE 23658,8: INPUT "ПРОДОЛ
ЖАТЬ ИНСТРУКЦИЮ (Y/N)?";I$
8160 GO TO 7500

8200 REM ************ ПОБЕДИТЕЛЬ
8210 LET Mt—"ПРИМИТЕ П03ДРАВЛЕНИ
Я С ПОБЕДОЙ! "

8220 IF WIN-ZX THEN LET MS="BAM

HE ПОВЕЗЛО - МОЯ ПОБЕДА! "
8230 PRINT #1;AT 0,0;MS
8240 PRINT PAPER 6;AT 18,28; FL
ASH 1;V$(5)

8250 FOR X-l TO 60 STEP 3: BEEP
.02,X: NEXT X

8260 LET G(PLAYER)=G(PLAYER)+l
8265 LET Mt-Ot: GO SUB 5500
8270 PAUSE 0

8280 LET X«=23: GO SUB 5600
8290 PRINT AT 4,8;"СЧЕТ:";AT 5,7

8300 PRINT AT 7,8;"ВЫ : ";G(MAN)
8310 PRINT AT 9,8;"Я : ";G(ZX)
8320 POKE 23658,8: INPUT "СЫГРАЕ
M ЕЩЕ? (Y/N) : ";M$
8330 IF Mt="N" THEN STOP
8380 GO TO 7400

9000 REM ***********************
********** ИНСТРУКЦИЯ
9010 CLS : PRINT

крибедж - игра для двух игро-
ков каждый получает по шесть
карт, из которых должен две
снести, образуя третью руку,
называемую кривом. криб счи-
тается в пользу сдатчика. из
колоды вскрывается карта, при-
надлежащая одновременно всем
трем рукам - стартер "
9020 print 1

тузы оцениваются в одно очко.
все фигуры - в 10 очков." ■
9030 print 1 "

во время игры вы увидите, как
за некоторые комбинации карт
начисляются очки "
9040 print ■ "

полученные очки отмечаются на
игровой доске перемещением ко-
лышков. победит тот, кто пер-
вый наберет 121 очко (дважды
обойдет доску)."
904 s return

9060 let ms-os: go sub 5500
9065 pause о
9070 cls : go sub 5700
9090 let м*="для демонстрации на
жмите space": go sub 5500: pause
0

9095 if inkeyso" " then go to
9175

9100 let s(man)-0: let s(zx)-0
9105 let ms^"посмотрим мои очки"

go sub 5500
9110 for i-zx to man
9115 let player-i: let win-0
9120 let s(player)-0: let v(play
er) -0

9130 let s-int (rnd»10): go sub
6015

9140 if win=0 then go to 9130
9145 print paper 6,at 18,28;v$(

9150 let м$="посмотрим ваши очки
": go sub 5500
9155 next i

9160 let м$-"для повтора нажмите
space": go sub 5500: pause 0: i
f inkeys-" " then go sub 5700:
go to 9100

9180 print at 3,0. over 1; paper
8;

когда вам надо выбрать
карту, перемещайте ука-
затель клавишей space и
делайте свой выбор кла-
вишей enter."

9190 print at 9,0, over 1; paper
8.

если вы будете играть с
правилом маггинз.то дол-
жны сами считать свои
очки. я отберу их, если
вы ошибетесь!"
9195 return

9200 let х=25 go sub 5600
9210 print

каждый cam считает"1 "

свои очки, затем сдавав-"'
ший считает криб. "

9240 go sub 9305: go sub 9400
9245 let m$-0$ go sub 5500
9250 pause 0: let x-25: go sub 5
600

9255 let x=6: let y=8: go sub 53
50

9260 let x-x-.25: let y=7: let x
s-rs(c(5)): let y$=c$(5)
9270 go sub 5400
9280 return

9300 print at 2,0; "

очки начисляются за "• "

комбинации:

9310 print "

15 баллов.........2 очка"

9320 print
пара..............2 очка"

9330 print

три..............6 очков"

9340 print "

четыре..........12 очков"

9350 print "

секанс.....очко за карту"

9360 return

9400 print "

флешь из четырех..4 очка"

9410 print "

флешь из пяти____5 очков"

9420 print "

валет масти стартера____" 1 "

...его благородие 1 очко"
9440 return

9450 print at 0,0; "

мы ходим по очереди, "1 "

пока сумма очков не при-"'
близится к 31.

9460 print "

набравший 31 балл, по-"'
лучает 2 очка. ближайший"1 "

к 31 получает 1 очко.
9470 print "

комбинации на руках" ' "

дают очки: "

9510 go sub 9320

9520 print 1 "

если нечем ходить.....

..выбирайте пустую карту"
9530 let mt-ot: go sub 5500
9540 pause 0: let x=25: go sub 5
600

9590 return
9600 data "a"

9610 data 0,195,195,0,0,195,195
,0

9620 data "b"

9630 data 0,195,195,0,0,0,0,0
9640 data "c"

9650 data 0,56,56,16,214,254,214
,16

9660 data "d"

9670 data 0,16,56,124,254,124,56
,16

9680 data "e"

9690 data 0,24,24,0,0,0,0,0
9700 data "f"

9710 data 240,255,240,0,0,0,0,0
9720 data "g"

9730 data 0,0,0,0,240,255,240,0
9740 data "h"

9750 data 0,108,254,254,124,56,1
6,0

9760 data "i"

9770 data 15,255,15,0,0,0,0,0
9780 data "3"

9790 data 0,0,0,0,15,255,15,0
9800 data "k"

9810 data 28,28,28,28,8,8,8,8
9812 data "l"

9814 data 254,3,99,254,99,99,115
,238

9816 data "m"

9818 data 252,6,99,99,99,99,118,
236

9820 data "n"

9822 data 227,102,108,120,120,10

8,102,227

9830 data "s"

9835 data 0,16,56,124,254,214,16
,56

9840 data "r"

9850 data 0,95,219,219,219,219,2
23,0

9900 print #1;"пожалуйста, подож
дите"

9905 restore 9600: poke 23675,88

: poke 23676,255

9910 for x=1 to 16: read kt

9920 for y=0 to 7: read z

9930 poke usr kt+¥,z

9940 next y: next x

9950 return

КОММЕНТАРИЙ.

Графика пользователя используется в строках: 5730, 5740, 5750,
5775, 7310, 7315 и 7320.

Стратегия работы программы состоит иэ двух фаз. Первая фаза -
когда компьютер решает, какие же 2 карты ему следует снести в криб.
Здесь программа просматривает все комбинации из шести карт по 4 и
каждый раз рассчитывает силу руки. Оценивается также сила двух сно-
симых в криб карт. Этих комбинаций всего 15 и они занимают около 1
секунды. Всего расчет оптимального сноса занимает порядка 20 се-
кунд. Это самая медленная часть программы, но если Вы попробуете с
ней сыграть, то увидите, что это не намного дольше, чем ожидание
решения от живого партнера, так что здесь со скоростью работы проб-
лемы особой нет.

Вторая фаза - розыгрыш рук и ведение счета. Здесь программа
рассчитывает итог, который может быть получен при том или ином ходе
и применяет некоторый эвристический подход, который в определенной
степени может давать и непредсказуеные результаты. Те, кому инте-
ресно посмотреть, как это происходит, могут в строке 7005 задать
для переменной DEBUG значение LET DEBUG=1.

Несмотря на то, что программа полностью написана на Бейсике, в
ней многое сделано для структурирования. Наиболее часто использую
щиеся подпрограммы, вынесены в начало для минимизации времени дос-
тупа к ним. Ниже мы рассмотрим назначение основных подпрограмм.

Данные также структурированы. Колода представлена массивом из
пятидесяти двух чисел - Р(). Целая часть каждого числа выражает со-
бой достоинство карты (1...13), а дробная часть - ее масть
(0.1...0.4). Массив организуется случайным образом во время тасова-
ния колоды.

Другие важнейшие массивы:

Партнер: А() - достоинство карт;
А$() - масти карт:
В() - вспомогательный массив.

Компьютер: С() - достоинство карт;
С$() - масти карт;
D() - вспомогательный массив.

Криб: Е() достоинство карт;

Е$() - масти карт;

Вычислительные массивы: Н() - достоинство карт;

Н$ () - масти карт;

1() - вспомогательный массив;

Т() - массив, содержащий карты, выложен
ные на стол во время ходов; карты
стола;

S() - счет.

Все вычисления, связанные со счетом, производятся после копи-
рования массивов того или иного игрока в вычислительные массивы.
Использование прочих переменных мы рассмотрим в составе основных
подпрограмм■

500 Подпрограмма рассматривает все возможные комбинации 4-х
карт из шести с целью определения что же сносить в криб. Сами рас-
четы делает другая подпрограмма (1000), к которой происходит обра-
щение по мере необходимости.

На входе в подпрограмму задаются массивы, описывающие руку
компьютера - С(), С${), D().

На выходе она выдает Т(1) и Т(2) - позиции тех карт, которые
должны быть снесены в криб

1000. Подпрограмма рассчитывает очки, имеющиеся на руке. Она
вызывается не только при расчете сноса, но и при проведении расче-
тов после открытия карт. Параметр с указывает сколько карт принима-
ются в расчет. При расчете сноса С=4, при подсчете итогов С=5
(включая карту-стартер).

Другие переменные:

RLEN - содержит минимальную длииу секаиса;

SUM - суммарная сила карт руки;

Н(), 1(), Н$() - временно содержат данные той руки, для кото-
рой идет подсчет очков;

CRIB-1, если расчет идет для криба (флаг криба).

На выходе эта подпрограмма выдает:
Р - очки за "пары";

F - очки за комбинации "пятнадцать";
S - очки за секансы;
FL - очки за флеши.

2000. Подпрограмма переносит карту из массива игрока в массив
стола (делается ход, если он законный). Изменяется сила руки игрока
и общий счет.

На входе подпрограмма получает:

С - номер карты, которой делается ход;
SUM - текущая сила руки;
Т() - массив карт, уже лежащих на столе;
N - количество карт, лежащих на столе.

На выходе подпрограмма выдает:

S - текущий счет (если сделан был незаконный ход, то этот па-
раметр выдается отрицательным);

Т() и N - измененные значения.

2400. Подпрограмма выполняет сортировку поступившего массива
Н(), имеющего длину L.

2700. Подпрограмма обслуживает ход игрока.

Вход:

NH - количество карт, сыгранных с этой руки;

А(), А$() - карты, имеющиеся на руке;

В() - содержит нули для карт, которые уже сыграны.

Выход:

HGO=l, если ни один ход не может быть сделан;
WIN=MAN, если игрок достиг 121 очка и победил.

2900. Подсчитывает текущую сумму очков, корректирует счет, ес-
ли необходимо.

Вход:

SUM - текущая сумма очков;

S - счет;

PLAYER - указывает на игрока;

PLAYER=ZX - компьютер;

PLAYER=MAN - человек.

Выход: - нет.

3200. Рассчитывает оптимальный ход с руки компьютера. Переби-
раются и оцениваются все возможные ходы.

Вход:

NC - количество карт, сыгранных с этой руки;

С(), С$() - карты, имеющиеся на руке;

D() - содержит нули для карт, которые уже сыграны.

Выход:

CGO=1, если ни один ход не может быть сделан.

3700. Подпрограмма обеспечивает игроку выбор карты для хода
путем перемещения указателя. SPACE - перемещение, ENTER - ход.

Вход:

С - количество карт на руке.

Выход:

X - номер избранной карты.

4000. Подпрограмма последовательно вызывает подпрограммы, от-
вечающие за ход игрока и ход компьютера. Подпрограмма в строке 3400
используется для того, чтобы перевернуть карты на столе, когда те-
кущий счет дойдет до 31. Вызов подпрограммы 4400 сбрасывает текущий
счет на ноль.

Вход:

DIR - содержит сведения о тон, кто сдавал карты.
DIR=ZX - компьютер;
DIR=MAN - человек.

Выход:

D0NE=1, если ход сделан;
WIN - указывает на победителя;
WIN=ZX - компьютер;
WIN=MAN - человек.

4500. Изображает на экране раскрытые карты игроков и результат
подсчета очков

4700. Печатает счет для руки. Если в силе правило "МАГГИНЭ",
предлагает игроку самому ввести свой результат.

Вход:

MUG=1, если действует "МАГГИНЭ";
Н(), Н$() - карты анализируемой руки.

4900. Подпрогранна выполняет "срезку" колоды для вскрытия
стартера.

Вход:

X - позиция указателя в колоде.
Выход:

К - достоинство стартера;
К$ - его масть.

5000- Изображает на экране карты игрока.

Y - вертикальная позиция на экране;
С - количество карт в руке.

5100. Изображает на экране карты компьютера.

С - количество карт в руке;

UP=1, если карты следует положить в открытом виде.

5200. Изображает на экране карты криба и копирует их из Е() в
Н() для подготовки к расчетам.

5300. Стирает карты с экрана. X - позиция карты от 1 до 6. Y -
позиция экрана по вертикали.

5350. Печатает карту, изображенную рубашкой вверх (в темную).

X - позиция карты от 1 до 6;

Y - позиция экрана по вертикали.

5400. Печатает открытую карту.

X - позиция карты от 1 до 6;

Y - позиция экрана по вертикали;

Х$ - достоинство карты;

YS - масть.

5500. Печатает в нижней части экрана текст сообщения иэ пере-
менной м$.

5600. очищает левую часть экрана.

5700. Рисует доску для крибеджа.

1

6000. Корректирует счет на доске для крибеджа.

7000. Инициализация программы. Объявление массивов, задание
графики пользователя, составление колоды.

7400. Начало игры. Сбрасывается счет, вытягиванием младшей
карты определяется, кто будет сдавать первый.

7500. Тасуется и сдается колода.

7800. Сброс карт. Вызывается подпрограмма 500 для определения
карт сноса. Дважды вызывается подпрограмма 3700 для сброса карт иг-
рока. Массивы рук перерабатываются для удаления образовавшихся за-
зоров .

8000. Начало розыгрыша раунда. {Грезается колода вызовом 4 900,
затем игроки по очереди ходят (4000) и карты открываются для подс-
чета очков (4500).

8200. Определяется победитель. Изменяется счет в геймах. Начи-
нается новый гейн.

9000. Печать инструкции по игре Переменная i$ определяет да-
вать инструкции или иет.

9600. Данные по UDG-графике.

9990. Инициализация цвета, установка верхней границы области
БЕЙСИКа оператором CLEAR.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Реклама - реклама и объявления.
Hardware - Cистемное П3У Kворумa, плюсы и минусы.
Люди - Spectrum глазами обывателя.
Epilogue - the end...
Мозаика - Пара сображений по поводу общения между SysOp'ами и user' ами.

В этот день...   18 апреля