Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
Шрифт:
Затем проверяется, есть ли на руках пары с валетом или картами высшего достоинства (7) . Обычно видеопокер отмечает только такие пары.
Следующий тест проверяет, есть ли в раскладе туз (8) . Это будет нужно для определения флэш стрита. Если у игрока флэш стрит, и одна из карт – туз, то у него самый высший тип флэш стрита – флэш роял.
Теперь у функции есть весь набор значений логических переменных: straight, flush, hasAce, fourOfAKind, threeOfAKind, twoPair, pair, fullHouse и jackOrHigher. С их помощью определяется действительная ценность расклада, и возвращается символьная строка (9) .
// Определяем расклад.
function handValue {
// Копируем и сортируем карты игрока.
hand = cards.slice;
(1) → hand.sort(compareHands);
// Создаем массив мастей и рангов для более легкого
suits = new Array;
nums = new Array;
for (i=0; i<5; i++) {
suits.push(hand[i].substr(0,1));
nums.push(Number(hand[i].substr(1,2)));
}
(2) → // Проверяем, расположены ли они по возрастанию.
straight = true;
for (i=0; i<4; i++) {
if (nums[i]+1 != num[i+1]) straight = false;
}
(3) → // Ищем десятку, валета, даму, короля и туза.
if (nums[0] == 1) and (nums[1] == 10) and (nums[2]) == 11) and (nums[3] == 12) and (nums[4] == 13)) straight = true;
(4) → // Выясняем, одной ли масти карты.
flush = true;
for (i=1; i<5;l i++) {
if (suits[i] != suits[0]) flush = false;
}
(5) → // Создаем массив для подсчета, сколько карт одного
// достоинства находится в раскладе.
counts = new Array;
for (i=0; i<14; i++) {
counts.push(0);
}
for (i=0; i<5; i++) {
counts[nums[i]]++;
}
(6) → // Используя массив counts, ищем совпадения.
pair = false;
twoPair = false;
threeOfAKind = false;
fourOfAKind = false;
for (i=1; i<14; i++) {
// Найдена пара.
if (counts[i] == 2) {
// Найдена вторая пара.
if (pair) {
twoPair = true;
// Найдена только одна пара.
} else {
pair = true;
}
// Три карты одного достоинства.
} else if (counts[i] == 3) {
threeOfAKind = true;
// Четыре карты одного достоинства.
} else if (counts[i] == 4) {
fourOfAKind = true;
}
}
(7) → // Проверяем, есть ли среди совпадающих карт валеты или
// карты более высокого ранга.
jackOrHigher = false;
for (i=1; i<14; i++) {
if (((i==1) or (i>10) and (counts[i]>=2)) {
jackOtHigher = true;
}
}
(8) → // Выясняем, является ли карта более высокого ранга тузом.
hasAce = false;
if (counts[1] > 0) hasAce = true;
(9) → // Делаем вывод, какой расклад на руках у игрока.
if (straight and flush and hasAce) {
return("Royal Flush");
} else if (straight and flush) {
return("Straight Flush");
} else if (fourOfAKind) {
return("Four-Of-A-Kind");
} else if (pair and threeOfAKind) {
return("Full House");
} else if (flush) {
return("Flush");
} else if (straight) {
return("Straight");
} else if (threeOfAKind) {
return("Three-Of-A-Kind");
} else if (twoPair) {
return("Two Pair");
} else if (pair and jaskOrHigher) {
return("High Pair");
} else if (pair) {
return("Low Pair");
} else {
return("Nothing");
}
}И последняя оставшаяся функция – winning, которой передается строчка, сгенерированная функцией handValue и которая определяет соответствующую сумму выигрыша.
// Исходя из типа расклада возвращаем сумму выигрыша.
function winnings(handVal) {
if (handVal == "Royal Flush") return(800);
if (handVal == "Straight Flush") return(50);
if (handVal == "Four-Of-A-Kind") return(25);
if (handVal == "Full House") return(8);
if (handVal == "Flush") return(5);
if (handVal == "Straight") return(4);
if (handVal == "Three-Of-A-Kind") return(3);
if (handVal == "Two Pair") return(2);
if (handVal == "High Pair") return(1);
if (handVal == "Low Pair") return(0);
if (handVal == "Nothing") return(0);
}
К сведению
К каждой кнопке Hold/Draw прикреплен собственный фрагмент кода. Для первой кнопки он выглядит следующим образом:on (press) {
holdDraw(0);
}Цифра 0 сообщает функции holdDraw, что действие производится с нулевой картой. Для остальных четырех кнопок вместо нуля стоят числа от 1 до 4.
Хотя первый кадр ролика сразу же вызывает функцию startGame (см. раздел «Создание кода»), второй кадр должен вызывать функцию startDeal. Просмотрите ролик, приведенный в качестве примера, чтобы самостоятельно изучить, как это реализовано.
Другие возможности
Суммы, указанные в функции winnings, я выбрал, руководствуясь
Можно сделать и так: когда на счету игрока не остается денег, переходить, например, к кадру game over.
Еще одна вариация игры – позволить игроку ставить от одного до пяти долларов за игру. Таким образом, игрок ставит меньшую сумму, когда чувствует, что ему не везет, и большую – в других случаях.Игра в очко, или двадцать одно
Исходный файл: Blackjack.fla
Двадцать одно – еще одна популярная карточная игра в казино, которую легко можно перенести на компьютер. Раздающий карты следуют определенному набору правил, следовательно, можно написать программу, которая будет имитировать действия раздающего.
Задача проекта
Наша цель – создать базисный вариант игры в очко, не стремясь реализовать полный набор функций. Некоторые правила в этой игре редко используются, например удваивание ставки, страхование и разделение, но если вы захотите включить их в свою игру, написание кода окажется очень сложной задачей. Оценить наличие таких правил смогут только избранные, поэтому здесь они опущены, чтобы не перегружать книгу лишней информацией.
На рис. 15.4 показан кадр ролика Blackjack.fla. Вы видите, что игрок взял пять карт, которые в сумме дали 18 очков. А раздающий карты взял три карты, их сумма составляет 21.
Рисунок 15.4. Расклад, когда раздающий выиграл, так как у него 21, а у игрока только 18 очков
В этой простой игре игроку и раздающему дается по две карты. Первая карта раздающего остается лежать рубашкой вверх до тех пор, пока игрок не закончит набирать карты. Игрок может брать карты до тех пор, пока у него не окажется двадцать одно очко или более. Затем компьютер выдает карты раздающему, пока у того не будет минимум 17 очков.
Если с первыми двумя картами у игрока 21 очко, он сразу же выигрывает и получает дополнительно 50 % суммы выигрыша. Если у раздающего получается 21, игра сразу же приостанавливается. Если же так не случилось, то выигрывает тот, у кого на руках большее количество очков, не превышающее 21.
Игрок может контролировать свои ставки (от 5 до 25 долларов), каждый раз повышая ставку на пять долларов.Подход
Как и в видеопокере, здесь есть массив deck, в котором содержится перетасованная колода карт. Разница заключается в том, что в этой игре в массиве находятся шесть колод. В игре в очко такой массив называется shoe.
Как для игрока, так и для раздающего создается массив, в котором представлены карты, имеющиеся на руках. Вам нужно будет подумать насчет первой карты раздающего, так как она не должна быть видна до тех пор, пока игрок не закончит набирать карты.
В отличие от видеопокера оценка расклада в этой игре проста. Единственная сложность: туз может стоить как одно, так и 11 очков. Однако, так как два туза дадут 22 очка, второй туз никак не может стоить 11. То есть все, что нужно, – определить, есть ли на руках туз, подсчитать, что он равен единице, а затем добавить 10, если при этом на руках не будет перебора. Например, расклад с тройкой, девяткой и тузом рассматривается как 13 очков, потому что если считать, что туз стоит 11, то на руках окажется 23 очка, то есть перебор.
Подготовка ролика
В отличие от видеопокера на руках может быть от двух до 11 карт. Для каждого расклада создаются 11 экземпляров клипов, имена которых изменяются от «playerO» до «player10» и от «dealerO» до «dealer10». Кадры клипа «deck» – пусты. Следовательно, когда вы поместите клип на рабочее поле, вы не увидите ничего, кроме меток, которые устанавливаются программой Flash для клипов по умолчанию. На рис. 15.5 показаны все 22 метки.
Рисунок 15.5. Все карты представлены в виде маленьких кружочков, меток клипа, так как на данный момент карты не видны
В этом ролике сложная основная временная шкала. Каждая метка представляет собой различный этап игры. На рис. 15.6 показана шкала в момент, когда видна большая часть меток.