Чтение онлайн

на главную - закладки

Жанры

Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript

Розенцвейг Гэри

Шрифт:

// Сдача карты.

function startDeal {

// Уменьшаем сумму наличных денег.

cash–;

showCash;

// Перетасовываем карты и снова сдаем их.

createDeck;

firstDraw;

showCards;

}

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

// Создаем перетасованную колоду.

function createDeck {

// Создаем упорядоченную колоду.

suits = ["c","d","s","h"];

temp = new Array;

for(suit=0; suit<4; suit++) {

for (num=1; num<14; num++) {

temp.push(suits[suit]+num);

}

}

//

Случайным образом выбираем карты,

// пока колода не будет полностью перетасована.

deck = new Array;

while (temp.length > 0) {

r = int(Math.random*temp.length);

deck.push(temp[r]);

temp.splice(r,1);

}

}

Функция firstDraw берет пять карт из колоды и помещает их в массив cards, а также создает небольшой массив hold, в котором хранятся имена тех карт, которые игрок хочет оставить.

// Сдаем первые пять карт.

function firstDraw {

cards = new Array;

for (i=0; i<5; i++) {

cards.push(deck.pop);

}

// Допускаем, что игрок оставляет все карты.

hold = [true, true, true, true, true];

showCards;

}

Для того чтобы преобразовать содержимое массива cards в то, что игрок видит на экране, функция showCards на рабочем поле устанавливает кадры для каждого из пяти экземпляров клипа. Кадры должны соответствовать символьной строке, расположенной в массиве hand.

// Определяем вид клипов карт, сданных игроку.

function showCards {

for (i=0; i<5; 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 используется для отображения этих значений на экране.

// Заменяем карты и определяем выигрыш.

function secondDraw {

// Заменяем карты.

for (i=0; i<5; i++) {

if (!hold[i]) {

cards[i] = deck.pop;

}

}

showCards;

// Определяем, что на руках у игрока.

handVal = handValue(cards);

// Расчитываем сумму выигрыша.

winAmt = winning(handVal);

resultsDisplay = handVal + ": " + winAmt;

// Добавляем сумму выигрыша к имеющейся сумме наличных.

cash += winAmt;

showCash;

gotoAndPlay("done");

}

Прежде чем перейти к рассмотрению функции handValue, необходимо создать функцию compareHands. Функция handValue сортирует

карты на руках у игрока по возрастанию. Программа Flash ничего не знает о колоде игральных карт, так что вам придется «научить» ее распознавать сочетания покера.

Функция compareHands берет две карты и сравнивает их. Для каждой карты из символьной строки она выбирает первый и второй символы, то есть игнорирует нулевой символ. Таким образом, карта c/ становится "7", а «c13» – «13».

Затем функция возвращает один из трех вариантов ответов: -1 – первая карта меньше по достоинству второй карты, 0 – карты одинакового достоинства, и 1 – ранг первой карты на единицу больше ранга второй.

Эта функция необходима для команды sort, использующейся в функции handValue. Если для сортировки не будет специальной функции, программа попытается отсортировать массив hand по алфавиту, то есть все трефы будут расположены перед бубнами, так как трефовая масть начинается с буквы "c", а бубновая – с "d". А вам нужно, чтобы карты были отсортированы в соответствии с их рангом.

// Эта функция используется командой сортировки для определения,

// какие карты идут первыми.

function compareHands(a,b) {

// Получаем ранг карты.

numa = Number(a.substr(1,2));

numb = Number(b.substr(1,2));

// Возвращаем —1, 0 или 1 в зависимости

// от результата сравнения.

if (numa < numb) return(-1);

if (numa == numb) return(0);

if (numa > numb) return(1);

}

Следующая функция handValue начинается с того, что копирует массив cards и помещает его в массив hand. Затем она сортирует полученный массив с использованием функции compareHands (1) .

Например, если на руках у игрока имеются карты ["h4", "d5", "c2", "s3", "h6"], после сортировки массив будет выглядеть следующим образом: ["c2", "s3", "h4", "d5", "h6"]. Так гораздо проще узнать, находится ли на руках у игрока "стрит".

"Стрит" определяется путем просмотра каждой карты и выяснением, больше ли ранг этой карты на единицу ранга карты предыдущей (2) . Если такое условие выполняется для всего массива, то тогда на руках у игрока «стрит».

Таким образом будет определен не только стрит: когда стрит начинается с десятки и заканчивается тузом, то это "флэш стрит". Произошло ли так или нет, можно определить с помощью простого теста (3) .

Затем вы проверяете, одной ли масти карты (4) . Для этого все карты, кроме первой, сравниваются с первой. Если масть всех карт совпадает с мастью первой карты, значит, все карты одной масти.

На следующем шаге создается массив counts, в котором будет храниться число карт одинакового достоинства (5) . В этом массиве находится 14 элементов, каждый из которых будет отвечать за число карт определенного ранга, имеющихся у игрока. Первый элемент массива не используется, так как нет карт с нулевым рангом.

...

Совет

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

Например, если на руках туз, две тройки, четверка и валет, массив будет выглядеть следующим образом: [0,1,0,2,1,0,0,0,0,0,0,1,0,0].

Теперь, наконец, программа может начать определение расклада на руках у игрока. Просматривается массив counts и отмечаются все значения пары, тройки или четверки (6) . Если один раз встречаются две карты одного достоинства, то у игрока пара. Если один раз встречается три карты одного достоинства, то у игрока тройка; если один раз встречается четыре карты одного достоинства, то – каре. Также можно дважды обнаружить две карты одного достоинства или пару и тройку. В первом случае будет две пары, а втором – фул хаус.

Поделиться:
Популярные книги

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец