Создайте игру в покер в Corona: Game Logic

Контент

В первой части этого урока мы настроили проект и создали интерфейс игры. Также мы создали и реализовали функцию для создания колоды карт. Во втором уроке мы создадим игровую логику.

Образец заявки

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

1. enableDealButton

Обновите реализацию функции enableDealButton, как показано ниже.

Сначала мы вызываем disableDealButton, который удаляет все ранее добавленные прослушиватели, и добавляем прослушиватель касаний, который вызывает doDeal. Метод addEventListener принимает событие и обратный вызов. Есть ряд событий, которые вы можете прослушивать, в зависимости от контекста, в котором вы его вызываете.

2. disableDealButton

Как я уже упоминал в предыдущем разделе, в disableButton мы удаляем все ранее добавленные слушатели.

3. enableBetButtons

В enableBetButtons мы добавляем прослушиватели касаний к betMaxButton и betButton и даем игроку некоторые инструкции о том, как сделать ставку.

4. disableBetButtons

Как и в disableDealButton, мы удаляем все ранее добавленные слушатели в disableBetButtons.

5. enableHoldButtons

В enableHoldButtons мы перебираем таблицу holdButtons и добавляем прослушиватель касаний к каждой кнопке.

6. disableHoldButtons

В функции disableHoldButtons мы также перебираем таблицу holdButtons, но удаляем ранее добавленные слушатели вместо добавления новых слушателей.

7. generateCard

Реализация generateCard требует немного большего объяснения. Сначала мы генерируем случайное число от 1 до длины таблицы колоды. Затем мы создаем временную карту с помощью deck ["randIndex] ..". Png "и сохраняем ссылку в tempCard. Что делает deck [" randIndex] .. ". Png", так это захватывает случайный элемент из таблицы колоды, который будет что-то вроде c1 или h5 и добавляет к нему .png. Поскольку Lua - это динамический язык, мы можем добавлять к объектам новые свойства. В этом примере мы добавляем свойство isHolding, которое сообщает нам, держит ли игрок карту, свойство cardNumber, получая подстроку выбранного элемента колоды, и мы делаем то же самое для свойства cardSuit. Наконец, мы удаляем выбранный элемент из таблицы колоды и возвращаем массив.

8. getCard

В getCard мы устанавливаем cardPosition, то есть координату x первой карты в интерфейсе игры. Мы генерируем карту, добавляем ее в таблицу playerHand и передаем переменную cardIndex, которая будет числом от 1 до 5, представляющим одну из пяти карт. Это позволяет нам размещать карты в правильном порядке в таблице playerHand. Мы устанавливаем положение каждой карты, используя смещение (93 * (cardIndex - 1)). Это означает, что карты находятся на расстоянии 93 пикселей друг от друга.

9. holdCard

В holdCard мы сначала получаем ссылку на кнопку, которая была нажата, используя ее свойство buttonNumber. Это позволяет нам проверить, находится ли карта в таблице playerHand. Если это так, мы устанавливаем для isHolding значение false и обновляем координату y карты. Если карты нет в таблице playerHand, мы устанавливаем isHolding в значение true и обновляем координату y карты. Если игрок решает держать карту, ее координата y уменьшается, что означает, что карта немного перемещается вверх.

10. resetCardsYPosition

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

11. Сохранение данных между сеансами

Мы хотим, чтобы наша игра могла сохранять значения или данные между сеансами. Мы можем создать решение самостоятельно, используя библиотеку Corona io, но в этом руководстве мы собираемся использовать стороннее решение. Артурс Сосинс создал удобный небольшой модуль для сохранения данных во время игровых сессий.

Загрузите библиотеку и добавьте два содержащихся в ней файла в свой проект. Чтобы использовать библиотеку, добавьте следующую строку вверху main.lua.

Чтобы библиотека работала в нашем проекте, нам нужно внести несколько небольших изменений в dataSaver.lua. Откройте этот файл и измените require "json" на local json = require "json".

Изменять:

К:

Второе изменение, которое нам нужно сделать, - это заменить все экземпляры system.ResourceDirectory на system.DocumentsDirectory, как показано ниже.

Изменять:

К:

12. createDataFile

Чтобы настроить хранилище данных, вставьте следующий фрагмент кода под функцией setupTextFields. Обязательно укажите определение функции, поскольку мы не заглушали эту функцию в предыдущем уроке.

В createDataFile мы сначала пытаемся загрузить ключ gameData из заставки в переменную gameData. Метод loadValue возвращает nil, если ключ не существует. Если он не существует, мы инициализируем таблицу gameData, добавляем свойства numberOfCredits и numberOfGames, обновляем соответствующие текстовые поля и сохраняем таблицу gameData, вызывая saveValue в заставке. Если ключ существует, значит, мы уже сделали это и можем заполнить текстовые поля правильными значениями.

На следующем этапе мы вызываем функцию createDataFile в функции настройки, как показано ниже.

13. betMax

В betMax мы начинаем с загрузки наших данных в gameData. Если количество кредитов больше или равно 15, мы вызываем doDeal. В противном случае у игрока недостаточно кредитов, чтобы поставить максимум 15 кредитов, и мы показываем игроку предупреждение.

14. ставка

В функции ставок мы включаем кнопку раздачи и удаляем слушателя из betMaxButton. Поскольку игрок делает обычную ставку, он не может одновременно сыграть максимальную ставку. Нам нужно проверить, больше ли количество кредитов или равно 5, чтобы убедиться, что игрок не пытается поставить больше кредитов, чем у него осталось. Если betAmount равно 15, мы вызываем doDeal, поскольку они сделали максимальную ставку.

15. doDeal

Функция doDeal координирует раздачу карт. Если это новая игра, мы раздаем первую руку. В противном случае мы раздаем игроку новые карты.

16. dealInitialHand.

Отключаем кнопки ставок в dealInitialHand и включаем кнопки удержания. Мы вызываем getCard пять раз, что генерирует первые пять карт. Затем мы загружаем gameData, обновляем currentCredits, вычисляем newCredits, обновляем текстовое поле кредита и сохраняем gameData.

17. dealNewCards

В dealNewCards мы проверяем, держит ли игрок карту. Если да, то мы получаем ссылку на текущую карту, вызываем removeSelf, устанавливаем для нее значение nil и получаем новую карту, вызывая getCard (i).

18. getHand

Функция getHand определяет руку игрока. Как вы можете видеть ниже, функция довольно сложна. Давайте разберемся, чтобы посмотреть, что происходит. Начните с реализации функции getHand, как показано ниже.

Мы начинаем с вызова table.sort для таблицы playerHand. Метод sort выполняет сортировку на месте, он использует оператор

Затем мы создаем таблицу частот, заполняем ее тринадцатью нулями (0), перебираем таблицу playerHand и увеличиваем номер каждого индекса, если playerHand содержит это число. Например, если у вас было две тройки и три пятерки, то таблица частот была бы 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0.

На следующем шаге мы объявляем и устанавливаем ряд локальных переменных, которые нам понадобятся за несколько минут. Затем мы просматриваем таблицу частот и проверяем числа, чтобы увидеть, содержит ли индекс 2, что означает, что у нас есть пара, 3, что означает, что у нас есть три одинаковых типа, или 4, что означает, что у нас есть четыре одинаковых Добрый. Затем мы проверяем количество пар, три одинаковых и четыре одинаковых, и соответственно обновляем значения winHand и cashAward.

Чтобы проверить наличие королевского стрита , нам нужно проверить, равна ли первая карта тузу, а оставшиеся карты - десять, валет, дама и король. Чтобы проверить на регулярную прямую петлю мы через playerHand и проверить , если каждый последующий cardNumber один больше , чем предыдущие. Чтобы проверить наличие флеша , мы проверяем, все ли ключи card cardSuit совпадают с ключом cardSuit первой карты.

В конце getHand мы вызываем AwardWinnings.

19. награда

В AwardWinnings мы показываем игроку, какая рука у него на руке, и обновляем настройки gameData. Сохраняем gameData и вызываем newGame с задержкой в ​​три секунды.

20. newGame

В newGame мы перебираем и сбрасываем все переменные, создаем новую колоду карт и проверяем, равно ли нулю gameData.numberOfCredits. Если это так, значит, игрок израсходовал все свои кредиты, поэтому мы присуждаем ему еще 100 кредитов. Наконец, мы обновляем текстовые поля.

21. Тестирование игры

Обновите функцию настройки, вызвав функцию createDeck, как показано ниже, и проверьте окончательный результат.

Вывод

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