Выбираем результат для каждого символа
// Рычаг переходит в нижнее положение,
function pull(); {
// Когда рычаг приводится в действие,
// каждый раз вычитаем один доллар.
cash--;
showCash() ;
// Воспроизводим анимацию рычага.
_root["arm"].gotoAndPlay(2);
// Воспроизводим анимацию вращения,
for (i=l; i
// Сообщаем, сколько раз нужно вращать барабан.
_root["spin"+i].numTimes = 8-i*2;
_root["spin"+i].gotoAndPlay(2); }
// Выбираем результат для каждого символа случайным образом.
for (i=l; i
_root["symbol"+i].gotoAndStop(randomSymbol());
}}
Запрограммировать случайный выбор символа непросто. Если вероятность выбора каждого из семи символов одинакова, тогда вероятность Я вывода трех совпадений одинакова для любого символа. Другими словами, три изображения желудя появляются так же часто, как и три изображения лисы. То есть не имеет смысла выплачивать различные суммы за совпадения различных картинок.
У реальных игровых автоматов необычайно сложный метод выбора символов, которые появятся в окошках. В таком методе используются сложные математические формулы, так что казино может точно рассчитать вероятность выигрыша.
Но вероятность появления одного символа должна отличаться от вероятности появления другого символа. Например, символ с бревном появляется в 29% случаев. С другой стороны, символ лисы появляется только в 3% случаев.
Это осуществляется с помощью массива, куда записывается вероятность появления того или иного символа. Затем произвольным образом выбирается число из этого массива. Если оно попадает в диапазон между нулем и вероятностью появления первого символа, выбирается первый символ. В противном случае программа переходит к следующему числу в массиве. Так происходит до тех пор, пока какой-нибудь символ не будет выбран. Просмотрите следующий код, чтобы увидеть, как работает эта схема.
// Выбираем произвольный символ в зависимости
//от вероятности его появления.
function randomSymbol() {
// Задаем вероятность появления каждого символа.
chances = [29,21,16,12,9,7,6];
// Сдаем первые пять карт.
function firstDraw() {
cards = new Array();
for (i=0; i
cards.push(deck.pop());
}
// Допускаем, что игрок оставляет все карты,
hold = [true, true, true, true, true];
showCards();
}
Для того чтобы преобразовать содержимое массива cards в то, что игрок видит на экране, функция showCards на рабочем поле устанавливает кадры для каждого из пяти экземпляров клипа. Кадры должны соответствовать символьной строке, расположенной в массиве hand.
// Определяем вид клипов карт, сданных игроку. function showCards() {
for (i=0; i
_root["card"+i].gotoAndStop(cards[i]) ;
}}
После того как все карты будут показаны игроку, он должен решить, что делать дальше. Кнопка "Hold/Draw" под каждой картой вызывает функцию holdDraw и передает ей число от 0 до 4.
Первый раз, когда щелкают по кнопке, программа изменяет экземпляр клипа так, что отображается рубашка карты. Если игрок щелкает по ней еще раз, карта возвращается в исходное состояние. Игрок может сколько угодно переворачивать карты, прежде чем щелкнуть по кнопке Draw.
В массиве hold будет находиться значение true, если игрок хочет оставить соответствующую карту, и false, если хочет ее заменить.
// Переворачиваем карту, предназначенную для замены,
function holdDraw(cardNum) {
// Переворачиваем карту, которая находится среди тех,
// которые игрок хочет оставить,
if (hold[cardNum]) {
_root["card"+cardNum].gotoAndStop("back");
hold[cardNum] = false;
// Если карта перевернута еще раз, оставляем ее.
} else {
_root["card"+cardNum].gotoAndStop(cards[cardNum]);
hold[cardNum] = true;
}}
Когда игрок щелкает по кнопке "Draw", функция secondDraw заменяет те карты, для которых в массиве hold значения были равны false. Затем вызывается функция showCards, чтобы изменения были отражены на экране.
Затем программа с помощью функции handvalue определяет, какой расклад имеется у игрока. Ценность расклада передается функции winning, которая рассчитывает, какую сумму следует добавить к величине cash (сумме наличных). Переменная resultsDisplay используется для отображения этих значений на экране.
if (bet > 25) bet = 25;
showBet;
}
Когда игрок щелкает по кнопке Deal (Раздать), вызывается функция makeBet, которая вычитает сумму ставки из суммы наличных игрока, Затем ролик проходит по четырем кадрам от "Deal1" до "Deal4".
// Вычитаем сумму ставки из суммы наличных денег игрока.
function makeBet() {
cash -= bet;
showCash();
}
В каждом из четырех кадров вызывается функция dealCard, дважды с использованием массива playerHand и дважды - dealerHand. При выполнении этой функции по две карты раздаются игроку и раздающему. Также в каждом кадре вызывается функция showCards.
// Раздаем игроку одну карту из колоды.
function dealCard(hand) {
hand.push(deck.pop());
}
Функции showBet и showCash отображают текущую ставку и текущую сумму наличных с добавлением знака "$" впереди. Не забудьте создать, соответствующие текстовые поля для каждой из этих сумм.
// Отображаем сумму наличности со знаком "$".
function showCash() {
cashDisplay = "$" + cash;
}
// Отображаем сумму ставки со знаком "$".
function showBet() {
betDisplay = "$" + bet;
}
Функция showCards просматривает карты, имеющиеся на руках у игрока и раздающего, и помещает соответствующие клипы на рабочее поле. С помощью переменной showDealerFirstCard указывается, отображается ли первая карта раздающего или показывается всего лишь рубашка карты.
// Отображаем карты на руках у игрока и раздающего,
function showCards() {
// Отображаем первую карту раздающего, когда игроку
// все карты розданы.
if (showDealerFirstCard) {
_root["dealerO"].gotoAndStop(dealerHand[0]);
} else {
_root[“dealer0"].gotoAndStop(2);
}
// Показываем остальные карты раздающего,
for (i=1; i
_root["dealer"+i].gotoAndStop(dealerHand[i]);
}
// Показываем все карты игрока,
for (i=0; i
_root["player"+i].gotoAndStop(playerHand[i]);
}
// Отображаем сумму карт на руках.
playerValue = handValue(playerHand);
dealerValue = handValue(dealerHand);
level++;
}}
(15)// Размещаем клипы открытой и закрытой колод,
for(i = 0 ; i
me = _root.attachMovie("Deck","stack"+i,level)
mc._x = i*60+100;
mc._y = 340;
mc._xscale =50;
mc._yscale = 50;
level++;}
// Показываем "рубашку" для закрытой колоды.
_root["stackO"].gotoAndStop("back");
(16) // Задаем значение первой выбранной карты и массив для
// открытой колоды.
firstCard = undefined;
stack = new Array();
(17) // Создаем и размещаем рамку.
outline = _root.attachMovie("outline","outline",1000);
outline._xscale = 50;
outline._yscale = 50;
outline._x = -1000;
}
Функция createDeck такая же, как в игре "Двадцать одно". Однако теперь вы сортируете только одну колоду. Результат представляется в виде глобальной переменной deck.
// Создаем перетасованную колоду.
function createDeck() {
// Создаем упорядоченную колоду.
suits = ["с","d","s","h"];
temp = new Array();
for(suit=0;suit
for(num=l;num
temp.pushfsuits[suit]+num);
}}
// Выбираем случайные карты, пока не создадим перетасованную
// колоду.
deck = new Array();
while (temp.length > 0) {
r = int(Math.random()*temp.length);
deck.push(tempt[r]);
temp.splice(r, 1) ;
}}
Вместо того, чтобы использовать сценарий клипа или кнопку для обнаружения щелчков мыши, я определю функцию для обработки события onMouseDown.
Сначала она совершает цикл по всем картам в пирамиде и определяет, не совершен ли щелчок по одной из них. (18). Цикл начинается с 28 и совершает обратный отсчет. Таким образом, карты наверху рассматриваются сначала, а карты внизу - потом.
Далее мы проверяем, если по карте был совершен щелчок, то программа определяет, закрывают ли данную карту другие карты пирамиды (19). Для этого вызывается функция cardPresent вместе со значениями ряда и колонки двух карт, которые могли бы закрывать карту, по которой был совершен щелчок.
Если локальная переменная card все еще не определена, значит, ни одна карта не была выбрана. Нужно еще проверить, не выбрал ли игрок карту из стопки карт с открытой мастью. Эту колоду представляет клип "stack1" (20).
Если карта была выбрана, а глобальная переменная firstcard все еще не определена, значит, не выбрана никакая другая карта. Ссылка на выбранную карту помещается в firstcard (21).
Если другая карта уже выбрана, значения старой и новой карт складываются. Функция cardValue используется для хранения численных значений карт (22). Если сумма равна 13, обе карты удаляются при помощи функции removeCard.
Если, с другой стороны, значение firstcard равно 13, значит, это король, и он может быть удален сам по себе (23).
Если по клипу "stack0" был совершен щелчок, это значит, что игрок решил перенести карту из закрытой колоды в открытую. В этом случае берется последнее значение в массиве deck и используется для изменения кадра клипа "stack1" (24). Массив stack используется для отслеживания карт, которые перемешаются между стопками. Чтобы выделить выбранную карту, клип "outline" перемешается в то же положение, что и выбранная карта (25).
И наконец, проверяется первая карта пирамиды (26). Если она отсутствует, значит, игрок ее удалил и выиграл игру.
Содержание раздела