Coronada bir Poker Oyunu qurun: Oyun Məntiqi

Göndərildi: 08.09.2021
Məqalənin müəllifi Adəm Quliyev

Bu dərsliyin birinci hissəsində layihəni qurduq və oyunun interfeysini yaratdıq. Bir kart dəstəsi yaratmaq üçün bir funksiya da yaratdıq və tətbiq etdik. Bu ikinci dərsdə oyun məntiqini yaradacağıq.

Nümunə Tətbiq

Bu dərsliyin nümunə tətbiqini işə salmaq istəyirsinizsə, əvvəlki dərsliyimdə izah etdiyim kimi avtomobillər üçün şəkillər daxil etməyinizə əmin olun. Bu təlimatdagöstərilən dataSaverkitabxanasını daxil etməyi və yeniləməyi unutmayın .

1. enableDealButton

EnableDealButton funksiyasının tətbiqini aşağıda göstərildiyi kimi yeniləyin.

Əvvəlcə əvvəllər əlavə edilmiş dinləyiciləri silən disableDealButton -a zəng edirik və doDeal çağıran bir dinləyici əlavə edirik. AddEventListener metodu bir hadisəni və geri çağırışı qəbul edir. Çağırdığınız kontekstdən asılı olaraq dinləyə biləcəyiniz bir sıra hadisələr var.

2. disableDealButton

Əvvəlki hissədə qeyd etdiyim kimi, disableButton -da əvvəllər əlavə edilmiş dinləyiciləri silirik.

3. enableBetButtons

EnableBetButtons -da, betMaxButton və betButton -a tap dinləyiciləri əlavə edirik və oyunçuya bahislərinin necə qoyulacağına dair bəzi təlimatlar veririk.

4. disableBetButtons

DisableDealButton -da olduğu kimi, disableBetButtons -da əvvəllər əlavə edilmiş dinləyiciləri silirik.

5. enableHoldButtons

EnableHoldButtons -da holdButtons cədvəlini gəzirik və hər düyməyə bir dinləyici əlavə edirik.

6. disableHoldButtons

DisableHoldButtons funksiyasında, holdButtons cədvəlini də keçiririk, lakin yeni dinləyicilər əlavə etmək əvəzinə əvvəllər əlavə edilmiş dinləyiciləri silirik.

7. kart yaradın

GenerateCardın tətbiqi bir az daha çox izahat tələb edir. Əvvəlcə göyərtə masasının uzunluğundan 1 -ə qədər təsadüfi bir rəqəm yaradırıq. Daha sonra göyərtədən ["randIndex] ..". Png "istifadə edərək müvəqqəti bir kart yaradırıq və bir istinadı tempCard -da saxlayırıq." Deck ["randIndex] ..". Png "nə edirsə, göyərtə masasından təsadüfi bir element tutur. c1 və ya h5 kimi bir şey olar və ona .png əlavə edər. Lua dinamik bir dil olduğundan, obyektlərə yeni xüsusiyyətlər əlavə edə bilərik. Bu nümunədə, oyunçunun kartı əlində tutub saxlamadığını, seçilmiş göyərtə elementinin alt sətrini alaraq cardNumber xüsusiyyətini bizə bildirən bir isHolding xüsusiyyətini əlavə edirik və bunu cardSuit xassəsi üçün də edirik. Nəhayət, seçilmiş elementi göyərtə masasından çıxarırıq və massivi qaytarırıq.

8. getCard

GetCard -da, oyunun interfeysindəki ilk kartın x koordinatı olan cardPosition təyin edirik. Bir kart yaradırıq, playerHand cədvəlinə əlavə edirik və 5 kartdan birini təmsil edən 1 ilə 5 arasında bir rəqəm olacaq bir cardIndex dəyişəninə keçirik. Bu, kartları playerHand masasında düzgün qaydada yerləşdirməyimizə imkan verir. (93 * (cardIndex - 1)) ofsetindən istifadə edərək hər bir kartın mövqeyini təyin edirik. Bu o deməkdir ki, kartlar bir -birindən 93 piksel fərqlənir.

9. Kartı saxlayın

HoldCard -da əvvəlcə buttonNumber xüsusiyyətindən istifadə edərək basılan düyməyə istinad alırıq. Bu, kartın playerHand masasında olub olmadığını yoxlamağa imkan verir. Əgər belədirsə, biz isHolding -i false olaraq təyin edirik və kartın koordinatını yeniləyirik. Kart playerHand masasında deyilsə, isHolding -i doğru olaraq təyin edirik və kartın koordinatını yeniləyirik. Oyunçu kartı tutmağı seçərsə, koordinat azalır, bu da kartın bir qədər yuxarı qalxması deməkdir.

10. resetCardsYPosition

ResetCardsYPosition -da playerHand cədvəlini araşdırırıq və kartlardan hər hansı birinin tutulduğunu görürük. Olanlar, Keçidkitabxanasından istifadə edərək əvvəlki vəziyyətlərinə qaytarılır . Keçid kitabxanası cisimlərin ətrafında hərəkət etməyi və onların xüsusiyyətlərini tənzimləməyi çox asanlaşdırır.

11. Sessiyalar Arasında Məlumatların Davam etməsi

Oyununuzun seanslarda dəyərləri və ya məlumatları saxlaya bilməsini istəyirik. Corona'nın io kitabxanasını istifadə edərək özümüz bir həll qura bilərik, ancaq bu dərsdə üçüncü tərəf həllindən istifadə edəcəyik. Arturs Sosins, oyun seanslarında məlumatları saxlamaq üçün lazımlı bir kiçik modul hazırladı.

Kitabxananı yükləyin və içərisində olan iki faylı layihənizə əlavə edin. Kitabxanadan istifadə etmək üçün main.lua'nınüst hissəsinə aşağıdakı sətri əlavə edin.

Kitabxananın layihəmizdə işləməsiüçün dataSaver.lua -dabir neçə kiçik dəyişiklik etməliyik. Bu faylı açın və "json" tələbini yerli json = "json" tələb edin.

Dəyişdirin:

Kimə:

Etməyimiz lazım olan ikinci dəyişiklik, system.ResourceDirectory -nin bütün hadisələrini aşağıda göstərildiyi kimi system.DocumentsDirectory -ə dəyişdirməkdir.

Dəyişdirin:

Kimə:

12. createDataFile

Məlumat mağazası qurmaq üçün setupTextFields funksiyasının altına aşağıdakı kod parçasını daxil edin. Əvvəlki dərsdə bu funksiyanı təhrif etmədiyimiz üçün funksiya tərifini daxil etdiyinizə əmin olun.

CreateDataFile -də əvvəlcə oyun qoruyucusundan gameData açarını gameData dəyişəninə yükləməyə çalışırıq. LoadValue metodu açar yoxdursa sıfır qaytarır. Mövcud deyilsə, gameData cədvəlini işə salırıq, numberOfCredits və numberOfGames xüsusiyyətlərini əlavə edirik, müvafiq mətn sahələrini yeniləyirik və saveValue saxlayıcısına müraciət edərək gameData cədvəlini saxlayırıq. Açar varsa, bunu artıq etmişik və mətn sahələrini düzgün dəyərlərlə doldura bilərik.

Növbəti addımda, aşağıda göstərildiyi kimi, quraşdırma funksiyasında createDataFile funksiyasını işə salırıq.

13. betMax

BetMax -da məlumatlarımızı gameData'ya yükləməklə başlayırıq. Kreditlərin sayı 15 -dən çox və ya bərabərdirsə, davam edirik və doDeal -a zəng edirik. Əks təqdirdə, oyunçunun maksimum 15 krediti ödəmək üçün kifayət qədər krediti yoxdur və biz oyunçuya xəbərdarlıq göstəririk.

14. bahis

Bahis funksiyasında müqavilə düyməsini aktivləşdiririk və dinləyicini betMaxButton -dan çıxarırıq. Oyunçu müntəzəm bir bahis etdiyindən eyni anda maksimum bahis oynaya bilməz. Kredit sayının 5 -dən çox və ya bərabər olub olmadığını yoxlamalıyıq ki, oyunçunun buraxdıqlarından daha çox kredit qoymağa çalışmadığından əmin olaq. BetAmount 15 -ə bərabərdirsə, maksimum məbləği bahis etdikləri üçün doDeal çağırırıq.

15. doDeal

DoDeal funksiyası kartların satışını əlaqələndirir. Yeni bir oyundursa, ilk əlimizi veririk. Əks halda, oyunçuya yeni kartlar veririk.

16. dealInitialHand

DealInitialHanddakı bahis düymələrini deaktiv edirik və gözləmə düymələrini aktiv edirik. GetCard -ı beş dəfə çağırırıq ki, bu da ilk beş kartı yaradır. Daha sonra gameData'yı yükləyirik, cari kreditləri yeniləyirik, yeni kredit hesablayırıq, kredit mətn sahəsini yeniləyirik və gameDatanı saxlayırıq.

17. dealNewCards

DealNewCards -da oyunçunun kart tutub saxlamadığını yoxlayırıq. Əgər belədirsə, o zaman mövcud karta istinad alırıq, removeSelf -ə zəng vururuq, sıfıra qoyuruq və getCard (i) çağıraraq yeni bir kart alırıq.

18. getHand

GetHand funksiyası oyunçunun əlini təyin edir. Aşağıda gördüyünüz kimi, funksiya olduqca əlaqəlidir. Nə olduğunu görmək üçün ayrılaq. Aşağıda göstərildiyi kimi getHand funksiyasını tətbiq edərək başlayın.

PlayerHand masasında table.sort çağıraraq başlayırıq. Sıralama metodu yerində sıralama edir, cədvəl elementinin başqa bir elementdən əvvəl və ya sonra gəlməsini təyin etmək üçün

Daha sonra bir tezlik cədvəli yaradırıq, on üç sıfır (0) ilə doldururuq, playerHand cədvəlində döngə qururuq və playerHand bu nömrəni ehtiva edirsə hər indeksin sayını artırırıq. Məsələn, iki üç və üç beşliyiniz olsaydı, tezliklər cədvəli 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 olardı.

Növbəti addımda bir neçə dəqiqə ərzində ehtiyac duyduğumuz bir sıra yerli dəyişənləri elan edirik və təyin edirik. Daha sonra tezliklər cədvəlini araşdırırıq və indeksdə 2 -nin olub olmadığını yoxlamaq üçün ədədləri yoxlayırıq, yəni bir cütümüz var, 3 -ü var, bu da üç növə və ya 4 -ə malik olduğumuz deməkdir. mehriban Sonra, üç növ və dörd növ cüt sayını yoxlayırıq və buna görə də qalibHand və cashAward dəyərlərini yeniləyirik.

Royal Straight -ı yoxlamaq üçün ilk kartın ace ilə bərabər olub olmadığını yoxlamaq lazımdır, qalan kartlar isə on, Jack, Queen və King olacaq. Müntəzəm yoxlamaq üçün Straight playerHand vasitəsilə biz loop və hər bir sonrakı cardNumber əvvəlki bir böyük yoxlayın. Bir Flush yoxlamaq üçün , bütün kart cardSuit düymələrinin birinci kartın CardSuit düyməsinə bərabər olub olmadığını yoxlayırıq.

GetHand -ın sonunda mükafat qazanırıq.

19. mükafat Qaliblər

AwardWinninglərdə oyunçunun əlində nə əlinin olduğunu göstəririk və gameData parametrlərini yeniləyirik. GameData'yı saxlayırıq və üç saniyə gecikmə ilə newGame çağırırıq.

20. yeni oyun

NewGame -də bütün dəyişənləri yoxlayırıq və sıfırlayırıq, yeni bir kart dəsti yaradırıq və gameData.numberOfCredits -in sıfıra bərabər olub olmadığını yoxlayırıq. Əgər belədirsə, oyunçu bütün kreditlərini xərcləyib, ona görə də onlara daha 100 kredit veririk. Nəhayət, mətn sahələrini yeniləyirik.

21. Oyunun sınanması

Aşağıda göstərildiyi kimi createDeck funksiyasını çağıraraq quraşdırma funksiyasını yeniləyin və son nəticəni sınayın.

Nəticə

Bu dərsdə əyləncəli və maraqlı bir Poker oyunu yaratdıq. Nağdlaşdırma düyməsini hələ tətbiq etməmişik, ancaq oyunda bunu etməkdə sərbəstsiniz. Ümid edirəm bu dərsdə faydalı bir şey öyrənmisiniz. Aşağıdakı şərhlərdə geribildiriminizi buraxın.