Python Video Poker Maşın

Video Poker oyunuüzərində işlədiyim üçün son yazımdan bir müddət keçdi.Adını Poker Maşını qoyuram.V1.1 hazırdır, buna görə proqramı və komediya tərzimi kodlaşdırma səyahətimi sizinlə bölüşəcəyimi düşündüm.

Yeniləmə: dekabr 2019.

V1.1. Bahis düyməsindəki əsas səhvlərin düzəldilməsi, kodu səliqəyə salmaq və bir neçə bahis. İndi GitHub -da da mövcuddur.

Geri Hekayə

( Bu qədər Skipbir qamış, əgər mənim geri hekayələr qazma və ya qayğı yoxdur tapmaq! )

Təxminən 1998 \ 1999 -cu illər idi (bəli, 20 il əvvəl uşaqlar idi) və Visual Basic V4 -ün öyrənilməsində populyar idim.

Amos Basic -dən bəri öyrənməyə çalışdığım bütün digər dillərdə uğursuzluğa düçar olduğumu nəzərə alaraq, işə başlamağın nə qədər sürətli və asan olduğuna xoş təəccübləndim.

Daxilində sürükle -buraxma GUI istehsalçısı olan parlaq intuitiv Visual Basic Kod Redaktoru ilə bir neçə saniyədə bir GUI yıxa bilərdim.

Beş yaşlı bir uşaq, bir neçə dəqiqə ərzində layiqli görünüşlü bir GUI dizayn edə bilər. Ancaq GUI -nin arxasındakı kodlaşdırma, əlbəttə ki, çürüyən balıqların başqa bir qazanı idi!

İlk Visual Basic layihəm üçün Video Poker oyunuetmək istədiyimə qərar vermişdim . O vaxt mənə çox sadə gəlirdi. Yalnız bir faylı yüklədiyiniz və gözəl bir kart qrafikindən istifadə edə biləcəyiniz bir kart göyərtəsi sinifini tapmışdım, əla.

Qədər hər şey əla idi…

Əl aşkarlama qaydalarına çatana qədər hər şey yaxşı getdi. Yüksək kart, cütlük və s kimi sadə əllərdən başqa, bəzilərini necə aşkar edəcəyimi ömrüm boyu işləyə bilmədim. Yəqin ki, ən çox əziyyət çəkdiyim düz axıntılar idi, amma indi xatırlaya bilmirəm və kod çoxdan getdi.

Kömək istədim, amma heç bir şey tapmadım, bu mənim liqamdan kənar idi. Bir neçə həftəlik sınaqdan sonra ümidsizliyə qapıldım və digər proqramlaşdırılmayan maraqlara keçdim və Visual Basic, əldə edə bilmədiyim bir çox başqa dildə olduğu kimi getdi.

İyirmi il sonra proqramlaşdırmaya qayıtdım və Python və TKinter ilə bir Video Poker Makinası hazırlamaq qərarına gəldim, amma bu dəfə haradan başlayacağımı dəqiq bildim.

Əl Algılama Rutinləri

Poker əllərini aşkar etmək üçün kod axtardıqdan sonra burada tapdığım natamam bir həll ilə getməyi qərara aldım-əsasən dərslərdən istifadə etmədiyinə görə və nəticədə əldə edə biləcəyimi düşündüm. başımın necə işlədiyi ətrafında.

Bir çox təcrübədən sonra onu əsas bir quruluş üzərində işləməyə başladım və əlləri düzgün aşkarlayır.

Əl aşkarlama prosedurlarında bir kral axını aşkar etmək üçün bir funksiya yox idi və ürəyim ən azından başlamaq üçün Jacks və ya daha yaxşı bir oyun hazırlamağa başladım. Rutinlər avtomatik olaraq yüksək bir kartdan alınıb, qalibiyyət kimi düzdür, amma mən qalibiyyət üçün bir cütə qədər görməməsini istədim.

Dediyim kimi et, etdiyim kimi yox!

Bir gün The Poker Machine -in ikiqat, ikiqat bonus versiyasını etmək istərdim, çünki bu, onlayn həyatda oynadığım şeydir və bu illər ərzində böyük uğurlar qazandım (MicroGaming versiyası). heç kəsi qumara başlamağa təşviq etməz, çünki zaman keçdikcə qazana bilməyəcəyiniz ehtimallara görə, tək döyüşdə qalib gələ bilərsiniz, amma ümumiyyətlə qumara pul itirmək ölüm və vergilər qədər qaçılmazdır.

Əl aşkarlama rejiminə qayıdın. Bir kral axını aşkar etmək üçün bu funksiyanı əlavə etdim:

Hər şeydən əvvəl, funksiya bir flush (eyni kostyumun 5 kartı) və düz, (ardıcıl ədədlər 2,3,4,5,6 və ya 9,10, J, Q, K və s.) və sonra digər kartın bitlərini istədiyim kimi işlətmək üçün funksiyaları aşkar edərək kopyaladım və redaktə etdim. Lüğətlər, Lambdalar və dəstlər haqqında heç bir şey bilmədiyimi nəzərə alsaq pis deyil.

Royal Crush

Düşündüm ki, bir axma və düzlük aşkarlansa da, heç bir qalibiyyət tapılmasa, onu standart olaraq kral axını olaraq geri qaytara bilərəmmi? Ancaq bu asanlıqla gözlənilməz hallara səbəb ola bilərdi və mən möhkəm bir əl yoxlayıcısı istədim, çünki təsəvvür edin ki, oyunu saatlarla oynayırsan və nəhayət bir kral flushu alırsan, amma oyun bunun itirən bir əl olduğunu düşünür. Yaxşı, nə edəcəyimi bilirəm!

Jacks or Better

Bir cütdəki qazancın bir cüt kriko ilə məhdudlaşdırılmasına gəlincə, bunu belə həll etdim. Yəqin ki, zərif, səmərəli və ya Pythonic deyil, amma möhkəmdir və işləyir.

İndi əl yoxlama hissəsini sıraladığım üçün inamla GUI -yə keçə bildim, çünki bu dəfə bütün oyunu başa vurmaq üçün çox yaxşı şansım var.

Kart Şəkilləri

Əvvəlki kart oyunum Hi-Lo-dan əvvəlcədən qurduğum bir paket olduğu üçün oyun kartları üçün şəkillər heç bir problem yaratmadı, buna görə çox vaxt qənaət edərək həmin şəkillərdən istifadə etdim. Onlar pulsuzdur və istəsəniz də istifadə edə bilərsiniz.

Maksimum qisas

Tezliklə standart "Max Bet" düyməsinin fikrini atdım. Gerçək dünyada sizi sınamaq və yaxalamaq üçün həmişə müqavilə düyməsinin yanında yerləşən artıq bir düymədir. Bu illər ərzində slot maşınlarında bir neçə dəfə başıma gəldi.

Bir dəfə təsadüfən "Max Bet" ə vurdum və avtomatik olaraq 37.50 funt sterlinqlik çarxlar yuvarlandı. Dəli kimi əsəbləşdim. Aydındır ki, bu spin-də qalib gəlsəydim, hər şey fərqli olardı, ha-ha, amma cəmi 10 funt-sterlinqdən başlayaraq bir az gözəl zolaqda olduqdan sonra bankda 50 funt sterlinq qaldığım üçün gecəmi məhv etdim. İndi bir döngədən sonra cəmi 12.50 funt sterlinq qalmışdı. Hər halda, buna görə də indi maksimum düymə qisasını ala biləcəyimi düşündüm.

Bahis, Çək, Bank, Algıla

V0.26 ilə pay düyməsini əlavə etdim, hər dəfə tıkladığınızda bu 1 -dən 5 -ə qədər dəyişir. Bunun üçün bir spinbox istifadə edə bilərdim və daha asan olardı, amma sonradan xüsusi düymələr əlavə etməyi planlaşdırırdım.

Yuxarıdakı ekrandan gördüyünüz kimi bankı və çəkmə düyməsini də əlavə etdim. Adətən razılaşma və çəkiliş eyni düymənin payına düşür, amma mən bu şəkildə üstünlük verdim. Ən yaxşı əlinizin nə olduğunu bildirən bir çərçivə də əlavə etdim (kartların üstündə).

Bütün bunlar bir anda dörd saatlıq sessiyaların təxminən iki gününü aldı. Üç -dörd saat mənim şəxsi idealımdır. Bundan sonra fikrimi cəmləməkdə çətinlik çəkirəm, sonra tənbəl və tənbəl olmağa başlayıram, çoxlu səhvlər və pis qərarlar verirəm. Bir -dörd saatlıq fasilədən sonra ümumiyyətlə özümü yaxşı hiss edirəm.

Aralıq Bugmare

Yeni bir söz " Bugmare" icad etdim .

Bu mərhələdə dublikat kartlarının açılmaması, kostyumların düzgün oxunmaması və tutma düymələrinin həmişə olduğu kimi işləməməsi ilə çox pis vaxt keçirdim. Fasiləli səhvləri izləmək demək olar ki, həmişə çətindir. Düşünürəm ki, bu proqramda səhvlər tapmaq və düzəltmək üçün üç dörd saatlıq sessiya keçirdim, çox güman ki, proqramın zəif quruluşuna görə.

Alət göstərildi

Alət ipuçlarım modulunu bu proqramda istifadə etməməyə qərar verdim, çünki bunları tələb etməyən sadə bir interfeysdir. Bir test sınağı etdim və xoşbəxt deyildim. Siçanınız çox vaxt eyni düymələrin üzərində gəzdiyinə görə, alət ipuçları çıxmağa və yoxa çıxmağa davam etdikdə tezliklə çox qıcıqlandırıcı olacaq.

Bunu həll etmək üçün onları açmaq və söndürmək üçün bir menyu seçimini qoydum, yaxşı işlədi, amma sonunda hər şeyin yuxarıdan çox mənasız olduğunu düşündüm və alət ipuçlarını tamamilə sildim.

Paytable

Ödəniş masası görüntüsünü koda əlavə etdiyim hər şeyi düzəltdikdən sonra oyun əslində bir az Poker Machine oyununa bənzəməyə başladı, o seansdan sonra xoşbəxt yatdım.

Yeri gəlmişkən, oyunun bütün xarici faylları oyunun kök qovluğundakı "kartlar" qovluğunda yerləşir. İstədiyiniz təqdirdə, oradakı hər şeyi fərdiləşdirməyi asanlaşdırır.

Butt fabriki

Daha sonra əvvəllər qeyd etdiyim xüsusi düymələri yaratmaq istədim. Telifsiz qrafikada istədiklərimi heç bir yerdə tapa bilmədim, buna görə özüm yaratmağa qərar verdim. Bunu nəzərə alaraq Da Button Factory adlı çox gözəl və tamamilə pulsuz bir saytdan kömək istədim.

Uzun hekayə qısa kəsmək üçün, mən DBF bəzi sadə düymələri etdi çəkmək təşkil gözləməyə, pay bir d məşğul , və sonra onları həyata keçirilir. Mükəmməl deyillər, amma mənim üçün məqbuldur və mənimdirlər!

Menyu maddələri

İndiyə qədər, haqqında, bloqu ziyarət etmək və kömək etmək kimi bəzi menyu maddələrini də doldurmuşdum. V1 tamamlanana qədər faktiki kömək mətnini açıq səbəblərdən tərk etdim. Bir uşaq pəncərəsində mətn görüntüləyicisi olaraq sürüşdürülmüş mətn qutusundan istifadə etdim , kod parçasına baxın 104

Yüksək hesab

Yüksək hesab bu tip oyun üçün bir az qeyri -adi haldır, amma əlavə etdim, çünki oyunçuya məqsəd qoyacaq bir şey verir, əks halda oyunu oynamaq olduqca darıxdırıcı ola bilər. Bir neçə yüz əldən sonra öz -özümə düşünməyə başladım ki, bunun nə mənası var?

İndi məsələ, yeri gəlmişkən, diskdə saxlanılan yüksək hesabınızı məğlub etməkdir ki, növbəti dəfə oyunu oynadığınız zaman yenə də oradadır. Bilmirsinizsə bunu necə edəcəyinizə dair 46 -cı parçaya baxın.

Qlobal böhran yoxdur

Bu mərhələdə, ehtimal ki, 50 qlobal dəyişəndən istifadə etdim. Mən buna hazır idim və kodda heç bir qlobal bəyanat olmamaq üçün həmişə sinif fırıldağımdan istifadə etmək niyyətində idim. Bilmirəm niyə bu işlə maraqlanıram. Düşünürəm ki, bacardığım qədər Python nasistlərini sevindirməyə çalışıram.

Yeni başlayanlar üçün qeyd.Bir geliştirici olmaq istəyirsinizsə, bu kod qəbul etmək üçün bir yol deyil. Şəxsən mən buna əhəmiyyət vermirəm, buna görə də ən az müqavimət və ən asan tapdığım yolu seçirəm. Hələ də dərsləri düzgün istifadə etmək üçün mübarizə aparıram ki, bu da ilk növbədə bütün qlobal miqyasları rədd edəcək. Bir pro kodlayıcı və ya inkişaf etdirici olmaq istəyirsinizsə, başınızı düzgün şəkildə dərslərə çevirməlisiniz, bunun iki yolu yoxdur. Özümə gəlincə, öz vaxtımda ora çatacağam, ya da gəlməyəcəyəm! Bu arada bunu necə idarə edirəm.

Səs FX

Bu tam bir fəlakət idi. Əvvəlcə 100 -dən çox nümunə olan gözəl dizaynlı bir Shareware proqramı olan WavePad -ı yüklədim. Səsləri düzəltməyə və saxlamağa imkan verir, bunu etmək kifayət qədər asan idi. İndi işləyə biləcək məqbul səslər var idi.

Gözləmə düymələrinə bir klik effekti əlavə etdim, amma düyməni basmaqla səsin çalınması arasında çox az gecikmə oldu, ehtimal ki, saniyədə 20 saniyə gecikdi, amma o qədər nəzərə çarpırdı ki, çox əsəbi oldu və oyuna əlavə et, fikrimcə, bundan məhrum oldu.

Həqiqətən çalışdım, amma boşa çıxmadı

İnanın ki, bir saniyəlik hissəni geri qaytarmaq üçün hər şeyi sınadım, amma bacarmadım. Bəlkə Pygame -dir? Bəlkə nümunələrin yaddaşda və ya başqa bir yerdə olması lazımdır ki, diskin yükləmə gecikməsi aradan qaldırılsın? Bilmirəm. [bəli, nümunənin əvvəlindən bütün səssizliyi düzəltdim].

Mən öyrənənə qədər bu oyuna səs effektləri əlavə edə bilmərəm. Həqiqətən ayıbdır, çünki işləsəydilər, çox yaxşı olardı.

Bu fəlakətdən öyrəndiyim yeni bir şey, bir menyu elementini necə deaktiv etmək idi. Daha əvvəl bunu etməyimə ehtiyac olmadığından baxdım:

Buna ehtiyacım var, çünki oyunçunun səs FX -i aça və ya söndürə biləcəyi bir menyu maddəsi var idi. Oyunun müəyyən hissələrində onları dəyişdirsələr, problem yarada bilər. Bu problemlərin indi nə olduğunu dəqiq xatırlaya bilmirəm, amma müəyyən vaxtlarda menyu elementini deaktiv etmək və sonra yenidən aktivləşdirmək üçün kifayət qədər pis idilər (sadəcə "Əlil" i "NORMAL" olaraq dəyişdirin).

Sonda hər şey getməli idi, çünki bu, mənim məmnuniyyətimə uyğun olmadı.

Arxa planda səssizcə çalmaq üçün ətraf mühit musiqisi və ya incə bir kazino fon səsləri axtardım, amma təəssüf ki, kifayət qədər yaxşı olan royalti pulsuz bir şey tapa bilmədim.

Müqavilənin dayandırılması problemi

Qarşılaşa biləcəyimi düşündüyüm bütün problemlərdən, bu, qətiyyən hər hansı bir problem olacağını düşündüyüm problem deyildi.

Oyunçu müqavilə düyməsini basdıqdan sonra beş yeni kart göstərilir. Hər bir kart arasında heç bir fasilə olmadan bir anda göründülər.

Bu şəkildə buraxmaqla qurtula bilsəm də, nə düzgün görünürdü, nə də hiss olunurdu. O zaman sadə bir fasilə idi.

Time.sleep (n) in Tkinter üzündən işləməyəcəyini bilirdim, amma nə demək istədiyimi görürsünüzsə bunun necə işləməyəcəyini anlamadım?

Proqram, bütün yuxuları birlikdə götürsün (hər biri .25 deyək) və bütün yuxuların ümumi sayını (bu nümunədə 0.75 saniyə, 3 x .25) dayandırmağa davam edir. əvvəllər olduğu kimi kartlar birlikdə.

Cavabın root.after () metodundan və ya bu xətlər boyunca bir şeydən istifadə edəcəyini düşündüm, sadəcə bu ssenaridə bunu necə edəcəyimi bilmirdim.

Bu layihə üçün ilk dəfə bir kömək istədim. Cavab aldım, amma düşündüyüm kimi olmadı, amma mükəmməl işləyir.

Bəli, yuxu funksiyasından istifadə edə biləcəyinizətəəccübləndim , sadəcə dərhal sonra çərçivəni yeniləmək lazımdır. Bir az təcrübədən sonra deal_pause -ı 0.10 olaraq təyin etdim və bundan olduqca məmnunam. Lazımsız şəkildə yeniləndikdə "titrədikləri üçün" tutulan kartları yeniləməməklə məşğul olmaq məcburiyyətində qaldım, bu bir müddət çəkdi, amma sonunda həll etdim.

Ediləcək işlər siyahısı

Beləliklə, Poker MaşınV1.0 -a çatırıq . Dəyişdirmək istədiyim bir neçə şey var və bu kiçik siyahı:

  • Hər əldən sonra açılan mesaj qutusundan o qədər də məmnun deyiləm, xüsusən də Linux versiyasında çox zəhlətökən və əsəbiləşir. Buna daha yaxşı bir yanaşma haqqında düşünəcəyəm.
  • İstifadə qaydaları
  • Fayl yoxlamaları
  • Oyun jurnalı, hər tərəfdən yazılır
  • Səs FX
  • Musiqi
  • Kodun yazılması
  • Double, Double Bonus kimi digər Video Poker oyunları.

Bu oyunda səhvləri yoxlamaq üçün bəzi ekstremal oyun testləri lazımdır. Əllə edə biləcəyimi etdim və deyə bildiyim qədər olduqca səhvsiz görünür, amma tamamilə səhvsiz olsa çox təəccüblənərəm.