Bez kevorda

By 08.09.2021 08.09.2021

Bu mashqlar oldingi qismlardagi mashqlarga qaraganda ancha murakkab. Bu bo'limlarning har biri foydali natijaga erishish uchun hamkorlik qilishi kerak bo'lgan bir nechta alohida sinflarni yaratishni talab qiladigan kichik loyihani tasvirlaydi.

Aktsiyalarni baholash

Qimmatli qog'ozlar to'plami bir qator xususiyatlarga ega, jumladan, sotib olish narxi, sotib olish sanasi va aktsiyalar soni. Odatda, aktsiyalarni sotib olish uchun sarflangan mablag'larning umumiy miqdorini va aktsiyalarning joriy qiymatini hisoblash usullari kerak. Pozitsiya - bu barcha aktsiyalar bloklarida aks ettirilgan kompaniyaning hozirgi mulki. Portfel - bu pozitsiyalar to'plami; u barcha aktsiyalar bloklarining umumiy qiymatini hisoblash usullariga ega.

Qachonki, biz bir vaqtning o'zida qimmatli qog'ozlarni sotib olsak, har bir blokning narxi boshqacha bo'ladi. Biz bloklar to'plamining umumiy qiymatini, shuningdek, bloklar to'plamining o'rtacha sotib olish narxini hisoblab chiqmoqchimiz.

StockBlock klassi.Birinchidan, sotib olish sanasi, aktsiya narxi va aktsiyalar soni bo'lgan StockBlock sinfini aniqlang. Mana, bu sinfda bo'lishi kerak bo'lgan usul funktsiyalari.

__Init__ usuli alohida sana, narx va aktsiyalar sonini to'ldiradi. Kompaniyaning nomi yoki belgisini kiritmang; bu alohida bloklar emas, balki pozitsiyaning bir qismi bo'lgan ma'lumotlar.

__Str__ usuli sana, narx va aktsiyalarni ko'rsatadigan yaxshi formatlangan qatorni qaytarishi kerak.

GetPurchValue usuli qiymatni har bir aksiya uchun × narxdagi aksiya hisobiga hisoblashi kerak.

GetSaleValue usuli uchun salePrice kerak ; u qiymatni har bir aksiya sotish narxi sifatida hisoblab chiqadi × aktsiyalar.

GetROI usuli uchun salePrice kerak ; u investitsiyalar rentabelligini (sotish qiymati - sotib olish qiymati) ÷ sotib olish qiymati sifatida hisoblab chiqadi.

Biz oddiy ma'lumotlar bazasini quyidagi kodli kod bilan yuklay olamiz. Birinchi bayonot to'rtta blokli ketma -ketlikni yaratadi. Biz o'zgarmaydigan nomni tanladik, bu bizga to'rtta belgining belgisi "GM" ekanligini eslatadi. Ikkinchi bayon to'rt blokli boshqa ketma -ketlikni yaratadi.

Lavozim klassi.Alohida sinf, Position, ma'lum bir kompaniyaning nomi, belgisi va StockBlocks ketma -ketligiga ega bo'ladi. Mana, bu sinfda bo'lishi kerak bo'lgan ba'zi usul funktsiyalari.

__Init__ usuli kompaniya nomini, belgi belgisini va StockBlock misollari to'plamini qabul qilishi kerak.

__Str__ usuli simvolni, barcha bloklardagi aktsiyalarning umumiy sonini va barcha bloklar uchun umumiy xarid narxini o'z ichiga olgan qatorni qaytarishi kerak.

GetPurchValue usuli ushbu pozitsiyadagi barcha StockBlocks uchun sotib olish qiymatlarini jamlaydi. U ishning og'ir qismini StockBlock -ning getPurchValue -ning har bir usuliga topshiradi.

GetSaleValue usuli uchun salePrice kerak ; u ushbu pozitsiyadagi barcha StockBlocks -ning sotish qiymatlarini jamlaydi. U har bir StockBlock -ning getSaleValue uslubiga ishning og'ir qismini topshiradi.

GetROI usuli uchun salePrice kerak ; u investitsiyalar rentabelligini (sotish qiymati - sotib olish qiymati) ÷ sotib olish qiymati sifatida hisoblab chiqadi. Bu umumiy rentabellikka asoslangan ROI.

Biz Position ob'ektlarini quyidagi turdagi boshlang'ich yordamida yaratishimiz mumkin. Bu uchta individual Position ob'ektlari ketma -ketligini yaratadi; birida GM bloklari ketma -ketligi, birida EK bloklari ketma -ketligi, uchinchisida bitta CAT bloki bor.

Tahlil dasturi.Endi siz portfeldagi har bir pozitsiya obyekti haqida oddiy hisobotlar yozadigan asosiy dasturni yozishingiz mumkin. Bitta hisobotda alohida bloklar va blokning sotib olish qiymati ko'rsatilishi kerak. Bu portfeldagi pozitsiyalarni takrorlashni, so'ngra har bir pozitsiya bo'yicha StockBlocks -ga batafsil hisobot berishni talab qiladi.

Boshqa hisobotda har bir pozitsiya belgisi, aktsiyalarning umumiy soni va sotib olingan aktsiyalarning umumiy qiymati aks ettirilishi kerak. To'langan umumiy o'rtacha narx - bu umumiy qiymatni aktsiyalarning umumiy soniga bo'lish.

Pozitsiyani tashkil etuvchi StockBlock to'plamlaridan tashqari, foydali bo'lgan yana bir ma'lumot - bu pozitsiyaning joriy savdo narxi. Birinchidan, currentPrice atributini va bu atributni o'rnatish usulini qo'shing. Keyin, har bir StockBlock -ning getSaleValue usuli yig'indisini hisoblaydigan getCurrentValue usulini qo'shing. Pozitsiyaning savdo narxidan foydalanib.

Investitsiyalarning yillik rentabelligi.Portfellarni solishtirish uchun biz yillik ROIni hisoblashni xohlashimiz mumkin. Bu ROI, xuddi aktsiyalar deyarli bir yil davomida saqlanganidek. Bu holda, har bir blokning egalik qilish muddati har xil bo'lgani uchun, har bir blokning yillik ROIini hisoblash kerak. Keyin biz har bir yillik ROI o'rtacha qiymatini sotish qiymati bo'yicha qaytaramiz.

Yillik hisobot aktsiyalarga egalik qilish muddatini hisoblashni talab qiladi. Bu vaqt modulidan foydalanishni talab qiladi. Biz bu haqda 32 -bobda "Sanalar va vaqtlar: vaqt va vaqt modullari"da batafsil ko'rib chiqamiz . Ammo asosiy xususiyat - vaqt ob'ektini yaratish uchun sana satrini tahlil qilish va keyin ikkita vaqtli ob'ektlar orasidagi kunlar sonini olish. Bu biz xohlagan narsani bajaradigan kod parchasi.

Bu misolda, timeObj1 va timeObj2 vaqt tuzilmalari bo'lib, tafsilotlari sana satridan time.strptime bo'yicha tahlil qilinadi. DayNumb1 va dayNumb2 - bu kunga to'g'ri keladigan kun raqami. Vaqt bir davrdan keyin soniyalarda o'lchanadi; odatda 1970 yil 1 yanvar. Aniq qiymat muhim emas, muhimi, bu davr mktime tomonidan izchil qo'llaniladi. Biz buni 24 soatga, soatiga 60 daqiqaga va 60 soniyaga ajratamiz, bu davrdan keyingi kunlarni soniya emas. Ikki kunlik raqamlarni hisobga olsak, farq ikki sana orasidagi kunlar soni. Bu holda, ikki sana o'rtasida 151 kun bor.

Bularning barchasi egalik muddatini hisoblaydigan usulga kiritilishi kerak.

def ownFor (o'zini, sotish sanasi):

Bu usul aktsiyalar egalik qilingan kunlarni hisoblab chiqadi.

def yilliklashtirilgan ROI (o'zini, sotish Narxi, sotish sanasi):

Yillik ROIni qaytarish uchun StockBlock -ga yalpi ROIni yillar davomiyligiga bo'linadigan yillik ROI usulini kiritishimiz kerak bo'ladi. Xuddi shunday, biz butun pozitsiya uchun yillik ROI bo'lgan o'rtacha og'irlikni hisoblash uchun yillik ROIdan foydalanish usulini qo'shamiz.

Sho'ng'inni kesish va er usti havo iste'moli darajasi

Yuzaki havo iste'moli darajasi SCUBA sho'ng'inchilari tomonidan ma'lum bir chuqurlikda ishlatiladigan havoni taxmin qilish uchun ishlatiladi. Agar bizda har bir sho'ng'in tafsilotlari ko'rsatilgan sho'ng'in ob'ektlari ketma -ketligi bo'lsa, biz havo iste'moli tezligi bo'yicha o'rtacha va diapazonlarni olish uchun oddiy hisob -kitoblarni amalga oshirishimiz mumkin.

Har bir sho'ng'in uchun biz sho'ng'in chuqurligidagi havo sarfini sirtdagi normal havo sarfiga aylantiramiz. Chuqurlik (oyoqlarda), d , boshlang'ich tank bosimi (psi), s , oxirgi tank bosimi (psi), f va t ( t ) ning vaqti (daqiqalarda) berilgan holda , SACR, c , quyidagi formula bo'yicha berilgan.

Odatda, siz bir xil o'xshash sho'ng'inlar bo'yicha SACRni o'rtacha hisoblab chiqasiz.

Sho'ng'in sinfi.Siz boshlang'ich bosimi, tugatish bosimi, vaqt va chuqurlikni o'z ichiga olgan atributlarni o'z ichiga olgan sho'ng'in sinfini yaratmoqchisiz. Oddiy qiymatlar - boshlang'ich bosimi 3000, oxirgi bosimi 700, chuqurligi 30 dan 80 futgacha va 30 daqiqadan (80 futda) 60 minutgacha (30 futda). SACR -lar odatda 10 dan 20 gacha. Sizning sho'ng'in sinfingizda bu sho'ng'in uchun SACR -ni qaytaradigan getSACR funktsiyasi bo'lishi kerak.

Ma'lumotni kiritish hayotni biroz soddalashtirish uchun biz vaqtni "HH: MM" qatori sifatida ko'rib chiqamiz va uni soat va daqiqalarga ajratish uchun string funktsiyalaridan foydalanamiz. Biz buni ikkita zanjir sifatida saqlashimiz mumkin: soat va daqiqa. Sho'ng'in davomiyligini hisoblash uchun, biz soatni soat 60 dan 60 minutgacha normallashtirishimiz kerak. Vaqtimiz yarim tundan bir necha daqiqaga to'g'ri kelganida, biz sho'ng'in davomiyligi sonini olish uchun osonlikcha ayirishimiz mumkin. Har bir sho'ng'in uchun bu hisobni bajarish uchun getDuration funktsiyasini yaratmoqchisiz.

__Init__ usuli PSIda boshlang'ich va tugash bosimi, kirish va chiqish vaqti, chuqurlik esa butun son sifatida sho'ng'ishni boshlaydi. Bu usul sho'ng'in davomiyligini hisoblab chiqishi uchun ichidagi va tashqarisidagi satrlarni ajratishi va har birini yarim tundan keyin bir necha daqiqaga to'g'ri kelishi kerak. E'tibor bering, amaliy sho'ng'in jurnalida sana, joy, havo va suv harorati, dengiz holati, ishlatilgan uskunalar va sho'ng'in haqidagi boshqa izohlar kabi qo'shimcha ma'lumotlar bo'lishi mumkin.

__Str__ usuli sho'ng'in ma'lumotining yaxshi satrli tasvirini qaytarishi kerak.

GetSACR usuli SACR qiymatini boshlang'ich bosimi, oxirgi bosim, vaqt va chuqurlik ma'lumotidan hisoblab chiqishi mumkin.

Sho'ng'in jurnali.Biz sho'ng'in jurnalini quyidagicha boshlashni xohlaymiz:

Dive s oddiy ketma -ketligini ishlatishning o'rniga, siz DiveL ketma -ketligi va getAvgSACR usuliga ega bo'lgan DiveLog sinfini yaratishingiz mumkin. Sizning DiveLog usulini sho'ng'in ketma -ketligi bilan boshlash mumkin va ketma -ketlikka boshqa sho'ng'in qo'yish uchun qo'shimchali usul bo'lishi mumkin.

Sho'ng'in va DiveLog mashg'ulotlarini bajarish.Mana, oxirgi ariza qanday ko'rinishi mumkin. E'tibor bering, biz __init__ funktsiyasida ixtiyoriy miqdordagi argument qiymatlaridan foydalanmoqdamiz, shuning uchun uni def __init __ (self, *listOfDives) deb e'lon qilish kerak.

Ko'p zar

Agar biz yaxta, Kismet, Yatzee, Zilch, Zork, ochko'zlik yoki o'n minglik kabi ko'p zarli o'yinlarni simulyatsiya qilmoqchi bo'lsak, bizga ikkitadan ortiq zarni o'z ichiga olgan to'plam kerak bo'ladi. Eng keng tarqalgan konfiguratsiya-bu beshta zar to'plami. Moslashuvchan bo'lish uchun biz Dice ob'ektini aniqlashimiz kerak bo'ladi, u yig'ilish, ro'yxat yoki individual Die holatlar to'plamidan foydalanadi. O'yindagi zarlar soni kamdan -kam hollarda o'zgarib turishi sababli biz FrozenSet -dan ham foydalanishimiz mumkin.

Zar to'plamini o'z ichiga oladigan Dice sinfiga ega bo'lgach, siz har xil ko'p o'yinchi o'yinlari haqida ba'zi statistik ma'lumotlarni to'plashingiz mumkin. Bu o'yinlar ikki turga bo'linadi. Ikkala holatda ham, o'yinchi navbatida barcha zarlarni siljitishdan boshlanadi, keyin o'yinchi tanlangan zarlarni qayta siljitish yoki saqlashni tanlashi mumkin.

Hisob kartalari o'yinlari.Yaxta, Kismet va Yatzida beshta zar ishlatilgan. O'yinchining navbatdagi birinchi qadami - bu beshta zarning hammasi. Buning ortidan ikkita qo'shimcha qadam bajarilishi mumkin, bunda o'yinchi qaysi zarni saqlash va qaysi zarni siljitish kerakligini hal qiladi. Futbolchi gol urishga harakat qilmoqda. Bu o'yinlar uchun odatiy ko'rsatkichlar kartasi o'nlab yoki undan ko'p "qo'llar" bilan bog'liq nuqta qiymatlari ro'yxatini ko'rsatadi. O'yinchi hisob kartasida ko'rsatilgan har xil turdagi qo'llardan birini yaratishga harakat qiladi. Har bir burilish balli kartaning bitta satrini to'ldirishi kerak; agar zar zarba berilmagan qo'lga to'g'ri kelsa, o'yinchi hisobga kiradi. Agar burilish natijasida qo'l ochilmagan qo'lga to'g'ri kelmasa, u holda nol ball kiritiladi.

Nuqtali o'yinlar.Zilchda, Zorkda, Yashilda yoki O'n mingda beshta zar odatda, lekin ba'zi farqlari bor. Bu o'yindagi o'yinchi o'z navbatida qadamlar soniga cheklov qo'ymaydi. Birinchi qadam - barcha zarlarni siljitish va hisobni aniqlash. Ularning navbatlari, agar ular boshqa qadamning xavfi juda yuqori bo'lishini sezsalar, tugaydi, yoki ular burilish uchun nol (yoki zilch) balini beradi. Odatda, agar yangi o'ralgan zarlar hisoblanmasa, ularning navbati nol bilan tugaydi. Har qadamda, o'yinchi yangi ochilgan zarlarni ko'rib chiqadi, bu esa o'z hisobini yaxshilaydi. To'g'ridan-to'g'ri ballar 1000. Uch xil turdagi ballar-100╳. Har qanday uch xil turni olib tashlaganingizdan so'ng, har bir o'lim 1 ball 100, har bir o'lim 5 ball 50 ko'rsatiladi. Bundan tashqari, ba'zi odamlar besh xil turdagi qolipning qiymatini 1000╳ ga baholaydilar.

Bizning MultiDice sinfimiz ushbu bobdagi Dice misolida quriladi. Die misollar to'plamidan tashqari (ketma -ketlik, Set yoki FrozenSet), sinfda quyidagi usullar bo'ladi.

MultiDice misolini ishga tushirganda, siz beshta individual Die holatlar to'plamini yaratasiz. Siz biron bir ketma -ketlikdan foydalanishingiz mumkin, To'plam yoki FrozenSet.

Roll usuli barcha zarlarni ketma -ketlikda yoki to'siqda siljitadi. E'tibor bering, sizning tanlovingiz bu usulni sezilarli darajada o'zgartirmaydi. Bu Python -ning ajoyib xususiyati.

Bu usul zar to'plamini qaytaradi, shunda mijozlar sinfi ularni tekshirib ko'rishi mumkin va zarlarning bir qismini yoki hammasini qaytarishi mumkin.

Bu usul qo'lni baholaydi va ikki juftlik ro'yxatini qaytaradi. Har bir ikkita o'yinchida qo'lning nomi va ma'lum o'yin uchun nuqta qiymati bo'ladi. Ba'zi hollarda, qo'l to'plashning bir qancha usullari bo'ladi va ro'yxat qo'lning barcha mumkin bo'lgan natijalarini aks ettiradi, eng qimmatidan eng pastigacha. Boshqa hollarda, ro'yxatda faqat bitta element bo'ladi.

Zar o'yinlarining barcha turlarini qamrab oladigan universal MultiDice sinfini yozishga urinish amaliy emas. Hamma narsa qila oladigan ulkan sinf yozishdan ko'ra, meros orqali bir-biriga asoslangan sinflar oilasini yaratish yaxshiroqdir. Biz buni "Merosxo'rlik" bo'limida ko'rib chiqamiz. Ushbu mashq uchun siz ikkita o'yin oilasidan birini tanlashingiz va ushbu o'yin uchun hisobni hisoblashingiz kerak bo'ladi. Keyinchalik, biz ikkita zarli Craps o'yini va bu ko'p zarli o'yinlarni qamrab oladigan meros ierarxiyasini qanday yaratishni ko'rib chiqamiz.

Hisob kartalari o'yinlari uchun (yaxta, Kismet, Yatzee), biz bilamizki, bu zarlar to'plami kartochkalarning qo'llariga mos keladimi. Ko'p hollarda zar to'plami bir qancha potentsial qo'llarga mos kelishi mumkin. Bir xil qiymatni ko'rsatadigan beshta zarning qo'li (masalan, 6) oltitaga, uchta turga, to'rtta turga, beshta turga va beshta kartochka qatoriga mos keladi. Besh zarning ketma -ketligi uzun va qisqa tekislarga mos keladi.

Umumiy baholash usullari.Qaysi o'yinlar oilasini tanlashingizdan qat'i nazar, sizga qo'l urishga yordam beradigan umumiy usul funktsiyalari kerak bo'ladi. Quyidagi usullar zarlar to'plamini baholashga yordam beradi, ular qaysi qo'l bo'lishi mumkin.

matchDie. Bu funksiya Die va Dice to'plamini oladi. Zarni berilgan Die qiymatiga qarab ajratish uchun matchValue -dan foydalaniladi.

matchValue. Bu funksiya matchDie -ga o'xshaydi, lekin u Die o'rniga raqamli qiymatdan foydalanadi. U zarlarni ikkita to'plamga ajratadi: "Zar" to'plamidagi zarlar berilgan Diega mos keladigan qiymatga ega, qolganlari esa qiymatga mos kelmaydi.

uchOfAKind, to'rtOfAKind, beshOfAKind. Bu uchta funktsiya Zar to'plamidagi har bir Die uchun matchDie ni hisoblab chiqadi. Agar biron bir Dieda 3 (yoki 4 yoki 5) zarlar mos keladigan matchDie bo'lsa, qo'l umuman shablonga mos keladi.

katta To'g'ri. Bu funktsiya barcha beshta zar 1 dan 5 gacha yoki 2 dan 6 gacha bo'lgan qiymatlar ketma -ketligini tashkil qilishi kerak. Bo'shliqlar bo'lmasligi va takrorlanuvchi qiymatlar bo'lmasligi kerak.

kichikTo'g'ri. Bu funktsiya beshta zarning to'rttasi qiymatlar ketma -ketligini tashkil qilishi kerak. Bunga turli xil yondashuvlar mavjud; bu aslida qiyin algoritm. Agar biz zarlar ketma -ketligini yaratib, ularni tartibiga ko'ra tartiblasak, biz o'sib borayotgan ketma -ketlikni qidiramiz, unda bitta "ahamiyatsiz" o'lim bor: bu ketma -ketlikdan oldin yoki keyin bo'shliq bo'lishi mumkin (1, 3, 4, 5, 6; 1, 2, 3, 4, 6) yoki ketma -ketlikda takrorlangan qiymat (1, 2, 2, 3, 4, 5).

imkoniyat Imkoniyat qo'li shunchaki zar qiymatlarining yig'indisidir. Bu 5 dan 30 gacha bo'lgan raqam.

Bu, albatta, buni qilishning eng yaxshi usuli emas. Ko'p hollarda, Strategiya dizayniga muvofiq, har xil turdagi qo'llar uchun bir qator sinflarni aniqlash yaxshiroqdir. Keyin Zarda Strategiya ob'ektlari to'plami bo'ladi, ularning har birida haqiqiy rolni o'ziga xos qo'l bilan solishtiradigan moslashtirish usuli mavjud. Strategiya ob'ektlarida balli usul ham, nomlash usuli ham bo'ladi. Buni "Strategiya" bo'limida ko'rib chiqamiz.

Yaxt, Kismet va Yatzining ballari.Bu qo'llarni baholash uchun siz umumiy skorirovka usuli funktsiyalaridan foydalanasiz. Sizning umumiy balli usul funktsiyangiz nomzod qo'lidan ma'lum tartibda o'tadi. Umuman olganda, siz avval FiveOfAKind -ni tekshirib ko'rishni xohlaysiz, chunki fourOfAKind va threeOfAKind ham bu qo'l uchun to'g'ri bo'ladi. Xuddi shunday, smallStraight -dan oldin, kattaStraight -ni tekshirishingiz kerak bo'ladi.

Sizning balli usulingiz har bir usulni baholaydi. Agar usul mos keladigan bo'lsa, sizning usulingiz ikkita ro'yxatni qo'shadi va ballar ro'yxatiga ishora qiladi.

Zilch, Zork va 10 000 ball.Bu zarbalarni urish uchun siz asosiy ThreeOfAKind usulini kengaytirishingiz kerak bo'ladi. Sizning balli usulingiz ThreeOfAKind usuli bilan yaratilgan ikkita natija to'plamidan foydalanadi.

E'tibor bering, qo'lning tavsifi nisbatan murakkab bo'lishi mumkin. Misol uchun, sizda 3, 2 va 1 bilan 5 qo'l bo'lishi mumkin. Bu qiymat 350. Tavsif ikki qismdan iborat: uch xil va qo'shimcha 1 va 5. Mana bu o'yinda gol urish bosqichlari.

LargeStraight usulini baholang. Agar qo'l mos keladigan bo'lsa, tegishli 2-bandli ro'yxatni qaytaring.

Agar siz o'yin turini yaratmoqchi bo'lsangiz, unda beshtasi baho beradi, keyin fiveOfAKind -ni baholang. Agar qo'l mos keladigan bo'lsa, tegishli 2-bandli ro'yxatni qaytaring.

3K. ThreeOfAKind usulini baholang. Bu qo'l tavsifining birinchi qismini yaratadi.

Agar Die aniq uchta zar bilan mos keladigan to'plamni yaratgan bo'lsa, unda teng bo'lmagan zarlar to'plami qo'shimcha 1 va 5 -raqamlar uchun tekshirilishi kerak. Qo'l ta'rifi satrining birinchi qismi uch xil.

Agar Die to'rt yoki beshta zar bilan moslik yaratgan bo'lsa, mos keladigan to'plamdan bitta yoki ikkita zar tashlanishi va mos bo'lmagan to'plamga qo'shilishi kerak. Tengsiz zarlar to'plami 1 va 5 -sonli qo'shimchalar uchun tekshirilishi kerak. Qo'l ta'rifi satrining birinchi qismi uch xil.

Agar uchta mos keladigan zarlar to'plami bo'lmaganida, barcha zarlar mos kelmaydigan to'plamda joylashgan bo'lib, ular 1 va 5-raqamlar uchun tekshiriladi. Qo'lni tasvirlaydigan ipning birinchi qismi yo'q, chunki uch xil bo'lmagan.

1-5. UchOfAKind testidan mos kelmaydigan zarlar matchValue yordamida tekshiriladi, agar 1 yoki 5 bo'lsa. Agar mavjud bo'lsa, bu qo'l tavsifining ikkinchi qismi. Agar yo'q bo'lsa, unda tavsifning ikkinchi qismi yo'q.

Oxirgi qadam - tavsifni yig'ish. To'rtta holat bor: hech narsa, 1-5 bo'lmagan 3K, 3K bo'lmagan 1-5 va 3K ortiqcha 1-5. Hech qanday holatda, bu qo'lni qo'lga kiritmaydi. Boshqa hollarda, bu qo'lni qo'lga olish.

Zarni mashq qilish.Sizning asosiy skriptingiz Zar to'plamini yaratishi, dastlabki rolni bajarishi va natijaga erishishi kerak. Keyin natijani qaytarish va to'plash uchun uchta zarni tanlash kerak. Nihoyat, u bitta qolipni tanlab olishi kerak, bu qolipni qaytadan siljitishi va natijasini berishi kerak. Bu murakkab strategik qarorlar qabul qilmaydi, lekin Dice and Die ob'ektlarini yaxshilab ishlatadi.

Hisob kartasi o'yinini o'ynaganda, potentsial qo'llar ro'yxati kartochkaning boshqa qatorini to'ldirish uchun tekshiriladi. Balli o'yin o'ynaganda, har bir otish oldingi to'pga qaraganda yuqori natijaga olib kelishi kerak yoki navbat tugadi.

Strategiya.Bu o'yinlarni o'ynaganda, odam zarlarga ko'z tashlab, naqsh hosil qilib, zarlar berilgan qo'llardan biriga "yaqin" bo'ladimi -yo'qligini aniqlay oladi. Bu juda qiyin qaror va mumkin bo'lgan natijalar to'g'risida to'g'ri qaror qabul qilish uchun juda murakkab dasturiy ta'minot talab qilinadi. Faqat 5 778 ta zar tashlashning mumkin bo'lgan usullari mavjudligini hisobga olsak, bu har xil turdagi takrorlashlarning mumkin bo'lgan natijalarini to'liq ro'yxatga olish masalasidir. Bu qiziqarli, ammo ancha rivojlangan mashq.

Ratsional raqamlar

Ratsional son - bu ikkita butun sonning nisbati. Misollar 1/2, 2/3, 22/7, 355/113 va boshqalarni o'z ichiga oladi. Biz ratsional sonlarga arifmetik amallarni bajarishimiz mumkin. Biz ularni to'g'ri kasrlar (3 1/7), noto'g'ri kasrlar (22/7) yoki o'nli kasrlar (3.1428571428571428) ko'rinishida ko'rsatishimiz mumkin.

Bu sinfning mohiyati arifmetik amallarni bajarishdir. Biz ikkita ratsional qiymatni qo'shish va ko'paytirish usullarini belgilashdan boshlaymiz. Keyinchalik, biz mustahkam va to'liq amalga oshirish uchun siz yozishingiz kerak bo'lgan qo'shimcha usullarni o'rganamiz.

Sizning qo'shish va mulohaza qilish usullari ularni ikkita ratsional qiymat bilan bajaradi: o'zini va boshqa. Ikkala holatda ham, boshqa o'zgaruvchi boshqa Ratsional sonlar misoli bo'lishi kerak. Buni type funksiyasi yordamida tekshirishingiz mumkin: agar type (self)! = Type (other) bo'lsa, TypeException ni ko'tarish kerak.

Shuni ham ta'kidlash joizki, barcha arifmetik amallar kirishlar hisobidan yangi Ratsional sonni yaratadi.

Ratsional sinf ikkita atributga ega: qiymat va maxraj. Bu ikkalasi ham butun sonlar. Bu erda siz yaratishingiz kerak bo'lgan turli xil usullar.

__Init__ konstruktori hisoblagich va maxraj qiymatlarini qabul qiladi. Bu denominator uchun standart qiymatga ega bo'lishi mumkin. Bu bizga ikkita konstruktor beradi: Ratsional (2,3) va Ratsional (4). Birinchisi, 2/3 qismini yaratadi. Ikkinchisi 4/1 kasrini yaratadi.

Bu usul kasrni to'g'ri kamaytirilishini ta'minlash uchun kamaytirish usulini chaqirishi kerak. Masalan, Ratsional (8,4) avtomatik ravishda 2 ga va 1ga bo'linishga kamaytirilishi kerak.

__Str__ usuli ratsional son uchun, odatda noto'g'ri kasr sifatida, yaxshi satr tasvirini qaytaradi. Bu sizga ratsional raqamingizning eng aniq ko'rinishini beradi.

Butun son va kasrli to'g'ri kasrlar qatorini ta'minlash uchun alohida usulni taqdim etish kerak. Bu boshqa usul butun ism va qoldiqni chiqarish uchun qo'shimcha ishlov beradi.

Agar siz __float__ nomli usulni taqdim qilsangiz, bu kasr uchun suzuvchi nuqta qiymatini qaytarishi mumkin. Bu usul dastur suzuvchi ( ratsionalValue ) bo'lganda chaqiriladi .

Qo'shish usuli yangi Ratsional raqamni yaratadi va qaytaradi. Hisoblagichga ega bo'lgan bu yangi fraktsiya (o'z -o'zini hisoblagich × boshqa.shakl + boshqasi

Tenglama 21.1. Kasrlarni qo'shish

Misol: 3/5 + 7/11 = (33 + 35)/55 = 71/55.

Mul usuli yangi Ratsional raqamni yaratadi va qaytaradi. Bu yangi fraktsiya (o'z -o'zini hisoblagich × boshqasi) va ayirmasi (o'z -o'zidan bo'luvchi × boshqa.danominator) ga ega.

Tenglama 21.2. Kasrlarni ko'paytirish

Misol: 3/5 × 7/11 = 21/55.

Ikkita ratsional sonni qo'shish va ko'paytirishdan tashqari, siz eng katta umumiy bo'linuvchini hisoblagich va denominatordan olib tashlash orqali kasrni kamaytiradigan kamaytirish usulini ham taqdim etishingiz kerak bo'ladi. Buni __init__ chaqirishi kerak, bu barcha fraktsiyalar kamayishiga ishonch hosil qiladi.

Qisqartishni amalga oshirish uchun biz son va maxraj o'rtasidagi eng katta umumiy bo'linuvchini topamiz va keyin ikkisini ham bu bo'luvchi bilan ajratamiz. Masalan, 8/4 GCD 4 ga ega va 2/1 ga kamayadi. Eng katta umumiy bo'luvchi (GCD) algoritmi eng katta umumiy bo'luvchi va eng buyuk umumiy bo'linishda berilgan. Agar self.numerator va self.denominatorning GCD 1 bo'lsa, kamaytirilgan funksiya o'zini qaytarishi mumkin. Aks holda, kamaytirilgan fraksiyon bilan yangi Ratsional yaratish kerak.

O'yin kartalari va taxtalar

Standart o'yin kartalari unvonga ega (ace, ikkidan o'ngacha, jek, malika va qirol) va kostyum (tayoqlar, olmoslar, yurak, belkurak). Ular ikkita oddiy atributga ega bo'lgan chiroyli karta ob'ektini tashkil qiladi. Biz bir nechta umumiy foydali funktsiyalarni qo'shishimiz mumkin.

Bu erda sizning karta sinfingiz usullari.

__Init__ usuli kartaning unvonini va kostyumini belgilaydi. Kostyumlarni bitta belgi bilan kodlash mumkin ("C", "D", "H", "S") va qatorlarni 1 dan 13 gacha raqam bilan kodlash mumkin. 1 raqami - ace. 11, 12, 13 raqamlari mos ravishda Jek, qirolicha va qiroldir. Bu darajalar emas, balki nuqta qiymatlari.

__Str__ usuli "2C" yoki "AS" yoki "JD" shaklidagi unvon va kostyumni qaytarishi mumkin. 1 daraja "A" ga, 11, 12 yoki 13 daraja mos ravishda "J", "Q" yoki "K" ga aylanadi.

Agar siz __cmp__ usulini aniqlasangiz, bu cmp funktsiyasi tomonidan ishlatiladi; Agar taqqoslash uchun ishlatiladigan asosiy funktsiyani bermasangiz, cmp funktsiyasi ro'yxatning tartiblash usulida ishlatiladi. O'z sinfingizda __cmp__ usulini taqdim etish orqali siz kartalar mos ravishda navbati bo'yicha saralanganligiga ishonch hosil qilishingiz mumkin. Siz kartalar orasida ,>= va

Ba'zida cmp (self.rank, other.rank) yoki cmp (self.suit, other.suit) kabi hayratlanarli darajada yaxshi ishlaydi.

Savdo va taxtalar.Kartalar kartadan chiqariladi; aralashtirish va muomala qilishning ba'zi usullarini o'z ichiga olgan kartalar to'plami. Bu erda taxtani o'z ichiga olgan usullar.

__Init__ usuli barcha 52 ta kartani yaratadi. U kostyumlar ketma -ketligini ("C", "D", "H", "S") takrorlash va qatorlar oralig'ida (1,14) takrorlash uchun ikkita halqadan foydalanishi mumkin. Har bir kartani yaratgandan so'ng, u har bir kartani kartalar qatoriga qo'shishi mumkin.

Shartnoma usuli ikkita narsani bajarishi kerak: ketma -ketlikni takrorlash, har bir kartani tasodifiy tanlangan karta bilan almashtirish. Ma'lum bo'lishicha, tasodifiy modul aynan shu funktsiyani bajaradi.

Ishlash eng yaxshi generator usuli funktsiyasi yordamida amalga oshiriladi. Shartnoma usuli funktsiyasida har bir kartani chiqaradigan oddiy for-loop bo'lishi kerak; Bu mijozlar ilovasi tomonidan qo'llarni yaratish uchun ishlatilishi mumkin. Hosildorlikbayonnomasining mavjudligi bu usul funktsiyasini mijoz ilovasi skriptidagi foriborasi yordamida ishlatishga imkon beradi.

Asosiy test.Taqqoslash operatsiyalariga to'g'ri javob berishiga ishonch hosil qilish uchun siz karta ob'ektlarining asosiy testlarini o'tkazishingiz kerak. Misol uchun,

Siz oddiy karta skriptini yozishingiz mumkin, u kartani pastki qismdan olish uchun quyidagilarni bajarishi mumkin. Bu misolda, o'zgaruvchi diler for foroperatori ichki ishlatadigan iterator ob'ekti bo'ladi .

Qo'llar.Ko'p karta o'yinlari karta qo'llarini yig'ishni o'z ichiga oladi. Qo'l - bu kartalar to'plami, shuningdek, qo'lingizni berilgan o'yinga mos keladigan tarzda to'plash usullari. Bizda foydalanish mumkin bo'lgan bir nechta yig'ish darslari bor: ro'yxat, yig'ish, lug'at va to'plam.

Blackjack haqida o'ylab ko'ring. Qo'lga dastlab ikkita karta beriladi; unga ball beriladi. Keyin o'yinchi boshqa kartani (zarba) qabul qilishni, bu qo'lni dilerga qarshi (tik turgan holda) ishlatishni, garovni ikki baravar oshirishni va yana bitta kartani olishni yoki qo'lni ikki qo'lga bo'lishni tanlashi kerak. Split variantiga hozircha e'tibor bermay, Card s to'plamining o'sishi va keyin yana gol urish kerakligi aniq. Ro'yxat, to'plam, to'plam va lug'atning ijobiy va salbiy tomonlari nimada?

Poker haqida o'ylang. Pokerda son -sanoqsiz xilma -xilliklar mavjud; biz oddiy beshta kartali pokerni ko'rib chiqamiz. Etti kartali o'q kabi o'yinlar potentsial qo'llarni faqat ikkita kartani va ettita kartadan yasalgan 21 ta beshta kartali qo'llarni to'plashni talab qiladi. Texas Hold-Em uchdan beshtagacha umumiy kartalar va ikkita shaxsiy kartalarga ega, bu esa natijalarni ancha murakkablashtiradi. Besh kartali tiraj uchun Handga dastlab beshta karta beriladi va u balli bo'ladi. Keyin ba'zi kartalarni olib tashlash va almashtirish mumkin, va qo'l yana gol urdi. To'g'ri poker qo'li to'g'ridan -to'g'ri deb nomlangan kartalarning ketma -ket ketma -ketligi bo'lgani uchun, kartalar to'plamini saralash qulay. Ro'yxat, to'plam, to'plam va lug'atning ijobiy va salbiy tomonlari nimada?

Blackjack qo'llari

Karta sinfidagi o'zgarishlar.Biz karta sinfini Blackjack -da qo'l to'plash uchun uzaytiramiz, bu erda qo'l ushlab turgan qo'lni aniqlash uchun ishlatiladi. Blackjack -da ishlatilganda, karta unvon va kostyumga qo'shimcha ravishda balli qiymatga ega. Aces - 1 yoki 11; ikkitadan o'ngacha 2-10 gacha; yuz kartalari hammasi 10 ball. Ace 1 ball deb hisoblansa, bu umumiy qattiq yig'indisi deb ataladi. Ace 11 ball sifatida hisoblansa, bu umumiy yumshoq yig'ma deb ataladi.

Siz karta sinfiga nuqta atributini qo'shishingiz mumkin. Buni __init__ ishlov berish qismi sifatida o'rnatish mumkin. Bunday holda, oddiy usullar nuqta qiymatini qaytaradi.

Shu bilan bir qatorda, har safar so'ralganda nuqta qiymatini hisoblashingiz mumkin. Bu sekin harakat qilishning aniq kamchilikiga ega. Biroq, mavjud __init__ usulini qayta ko'rib chiqmasdan, sinfga usullarni qo'shish ancha sodda.

Blackjack qo'llarini boshqarish uchun siz karta sinfiga qo'shishingiz kerak bo'lgan usullar.

GetHardValue usuli, quyidagi istisnolardan tashqari, unvonni qaytaradi: 11, 12 va 13 -darajali darajalar 10 ball qiymatini qaytaradi.

GetSoftValue usuli quyidagi istisnolardan tashqari unvonni qaytaradi: 11, 12 va 13 -darajali darajalar 10 balllik qiymatni qaytaradi; 1 -darajali ball 11 qiymatini qaytaradi.

Keyingi bobning tizeri sifatida shuni ta'kidlaymizki, bu usullar umumiy karta sinfining Blackjack-ga tegishli kichik sinfining bir qismi bo'lishi kerak. Hozircha, biz faqat "Card class" ta'rifini yangilaymiz. "Meros" deb nomlangan bo'limda merosxo'rlikni ko'rib chiqsak, sinf ierarxiyasi getHardValue va getSoftValue usullaridagi if-iboralarga qaraganda sodda bo'lishi mumkinligini ko'ramiz. .

Blackjack qo'llarini to'plash.Blackjack -ning maqsadi umumiy balli 21 dan kichik yoki teng bo'lgan qo'l to'plashdir. Ace 1 yoki 11 deb hisoblanishi mumkin, chunki qo'lda faqat bitta bittasi 11 ga teng bo'lishi mumkin. va boshqa har qanday aes 1 qiymatiga ega bo'lishi kerak.

Har bir karta umumiy va qattiq nuqtalarni ishlab chiqaradi. Qo'l umuman qattiq va yumshoq nuqtalarga ega. Ko'pincha qattiq va yumshoq jami tengdir. Ace bo'lganda, qo'l uchun qattiq va yumshoq yig'indilar boshqacha bo'ladi. Biz ikkita holatni ko'rib chiqishimiz kerak.

Aces yo'q. Qo'lning qattiq va yumshoq jami bir xil bo'ladi; Bu har bir kartaning qattiq qiymati. Agar qattiq summa 21dan kam bo'lsa, qo'l o'ynaydi. Agar u 21 ga teng bo'lsa, bu potentsial g'olibdir. Agar 21 yoshdan oshgan bo'lsa, qo'l büstü ketgan. Ikkala jami ham barcha kartalarning qattiq qiymati sifatida hisoblanadi.

Bir yoki bir nechta Aces. Qo'lning qattiq va yumshoq umumiyligi boshqacha. Qo'l uchun qattiq summa - bu barcha kartalarning qattiq nuqta qiymatlari yig'indisi. Qo'l uchun yumshoq summa - bu bitta ace yumshoq qiymati va qolgan kartalarning umumiy miqdori. Agar qattiq yoki yumshoq jami 21 bo'lsa, qo'l potentsial g'olibdir. Agar qattiq summa 21dan kam bo'lsa, qo'l o'ynaydi. Agar qattiq yig'indisi 21 dan oshsa, qo'l büstü ketdi.

Hand sinfida kartalar to'plami bor, odatda ketma -ketlik, lekin to'plam ham ishlaydi. Bu erda Hand sinfining usullari.

__Init__ usuliga dastlabki bitimni ko'rsatish uchun ikkita karta nusxasi berilishi kerak. Bu ikkita boshlang'ich karta bilan ketma -ketlik yoki Set yaratish kerak.

__Str__ usuli - barcha individual kartalar. Quyidagi kabi konstruktsiya yaxshi ishlaydi: ",". Join (map (str, self.cards). Bu self.cards to'plamidagi har bir kartaning mag'lubiyatini oladi va keyin yig'ilish uchun mag'lubiyatning qo'shilish usulidan foydalanadi. kartalarning oxirgi namoyishi.

HardTotal usuli har bir kartaning qattiq qiymatini jamlaydi.

SoftTotal usuli ancha murakkab. Kartalarni ikkita to'plamga bo'lish kerak. Agar har xil qattiq va yumshoq nuqta qiymatiga ega kartalar bo'lsa (bu ace bo'ladi), unda bu kartalardan biri softSet -ni tashkil qiladi. Qolgan kartalar hardSet -ni tashkil qiladi. SoftSet bo'sh bo'lishi mumkin. SoftSet -ning bir qismi bo'lishi mumkin bo'lgan bir nechta kartalar bo'lishi mumkin. Bu funktsiyaning qiymati - hardSet -dagi barcha kartalar uchun qattiq qiymatlar yig'indisi va softSet -dagi kartaning yumshoq qiymati.

Qo'shish usuli qo'lda boshqa kartani qo'shadi.

Mashq kartasi, pastki va qo'l.Sizda karta, peshtaxta va qo'l darslari bo'lganida, siz ularni oddiy funktsiyadan foydalanib, bir qo'li bilan blackjackda o'ynashingiz mumkin. Ushbu dastur pastki va qo'lni yaratadi; u ikkita kartani qo'lga o'tkazadi. Qo'l jami yumshoq 16 yoki undan kam bo'lsa -da, u kartalarni qo'shib qo'yadi. Nihoyat, natijada qo'lni chop etadi.

Qo'lni to'ldirishning ikkita qoidasi mavjud. Diler qattiq cheklangan, lekin futbolchilar o'zlari qaror qabul qilishda erkinroq. E'tibor bering, diler bilan nima bo'lishidan qat'i nazar, o'yinchining busti qo'llari darhol hal qilinadi. Boshqa tomondan, diler kartalarni olishni tugatmaguncha, o'yinchining 21 ta qo'llari hal qilinmaydi.

Diler kartalari yumshoq 16 yoki undan kam bo'lgan qo'liga qo'shishi kerak. Agar dilerda 17 dan 21 gacha yumshoq summa bo'lsa, ular to'xtaydi. Agar dilerda jami 21 dan oshsa, lekin jami 16 yoki undan kam bo'lsa, ular kartalarni oladi. Agar dilerda jami 17 yoki undan ko'p bo'lsa, ular to'xtaydi.

O'yinchi kartalari 21 yoki undan ko'p bo'lmaguncha kartalarni erkin qo'shishi mumkin. Odatda, o'yinchi yumshoq 21da to'xtaydi; bundan tashqari, deyarli hamma narsa mumkin.

Qo'shimcha o'yinlar.Biz qo'lni ikkiga bo'lish yoki pul tikish variantlarini muhokama qilishdan qochdik. Bu karta, pastki va qo'lni aniqlash asoslariga unchalik aloqasi bo'lmagan yanada rivojlangan mavzular. Bo'linish shunchaki qo'shimcha qo'llarni yaratadi. Ikki baravar ko'paytirish garovni o'zgartiradi va faqat bitta qo'shimcha kartani oladi.

Poker qo'llari

Biz "O'yin kartalari va plyajlar" bo'limida yaratgan kartalar sinfini Pokerda qo'l to'plash uchun kengaytiramiz, bu erda qo'l va qo'lni ushlab turish uchun kostyum ham ishlatiladi.

Poker qo'llari quyidagi tartibda, eng kerakli (va ehtimol) pastdan istalgangacha (va juda keng tarqalgan) tartibda joylashtirilgan.

To'g'ri yuvish.Qo'shni darajadagi beshta karta, hammasi bir xil.

To'rt turdagi.Xuddi shu darajadagi to'rtta karta, shuningdek boshqa karta.

Uy to'la.Bir xil darajadagi uchta karta, bir xil darajadagi ikkita karta.

Yuvish.Xuddi shu kostyumning beshta kartasi.

Streyt.Qo'shni darajadagi beshta karta. Bunday holda, Ace Kingdan yuqori yoki 2dan past bo'lishi mumkin.

Uch xil.Xuddi shu darajadagi uchta karta, shuningdek, boshqa darajadagi ikkita karta.

Ikki juftlik.Bir martalik ikkita karta, shuningdek, boshqa darajadagi ikkita karta, uchinchi darajali bitta karta.

Juftlik.Bir martalik ikkita karta, shuningdek, boshqa darajadagi uchta karta.

Yuqori karta.Qo'lda eng yuqori reyting kartasi.

E'tibor bering, to'g'ri yuvish ham tekis, ham tekis; to'rt xil - bu ikkita juftlik va bitta juftlik; To'liq uy - bu ikkita juftlik, shuningdek bitta juftlik. Shunday qilib, eng yaxshi qo'lni topish uchun poker qo'llarini ahamiyatini kamaytirish tartibida baholash muhim.

Ikki tekis yoki ikkita to'liq uyni ajratish uchun, eng yuqori ball kartasini yozib olish ham muhim. Qirolicha kartasi baland bo'lgan tekis, baland karta bilan 10 ni uradi. Xuddi shunday, to'la uy yoki ikkita juftlik "uchdan oshgan malikalar" deb ta'riflanadi, ya'ni qo'lni uchta malika va ikki uchtasi tashkil qiladi. Bizga raqamlar reytingi kerak bo'ladi, u qo'llarning reytingini 9dan 1gacha, shuningdek, kartalarning "muhimligi" bo'yicha qo'llar balini o'z ichiga oladi.

Kartaning ahamiyati qo'lga bog'liq. To'g'ridan-to'g'ri yoki tekis yuvish uchun eng muhim karta-bu eng yuqori darajadagi kartadir. To'liq uy uchun, eng muhim kartalar uchta kartochka bo'lib, undan keyin juft kartalar. Biroq, ikkita juftlik uchun eng muhim kartalar-bu yuqori martabali juftlik, keyin esa past darajali juftlik. Bu bizga "ikki juftlik 10 va 4" ni "ikki juftlik 10 va 9" lar bilan solishtirish imkonini beradi. Ikkala qo'lda ham 10 -sonli juftlik bor, ya'ni g'olibni aniqlash uchun biz uchinchi kartaga qarashimiz kerak.

Poker qo'llarini to'plash.Hand klassi quyidagicha ko'rinishi kerak. Bu ta'rif kartalarning to'g'ri, tekis va mos kelishini tekshirish uchun bir qancha usullarni taqdim etadi. Bu funktsiyalar quyida ko'rsatilgan ball usulida qo'llaniladi.

Qo'l to'plash funktsiyasi poker qo'li qoidalarining har birini kamayish tartibida tekshiradi.

Siz PokerHand sinfiga quyidagi usullarni qo'shishingiz kerak bo'ladi.

to'g'ri qaytaradi, agar kartalar to'g'ri shakllansa. Buni osonlikcha hal qilish mumkin, chunki kartalarni navbati bo'yicha kamayish tartibiga ko'ra saralash, so'ngra ularning hammasi bir xil farq qilishini tekshirish.

flush qaytaradi, agar barcha kartalar bir xil kostyumga ega bo'lsa.

matchlar martabalar bo'yicha guruhlangan kartalar sonini qaytaradi. Self.rankCount lug'atining kaliti sifatida kartaning unvonidan foydalanib, har bir karta orqali takrorlash mumkin; bu lug'at yozuvining qiymati - bu martabaning necha marta ko'rilganligi. Lug'atning qiymatlarini saralash mumkin va oltita alohida naqsh hosil qilish mumkin, ulardan beshtasi yuqorida ko'rsatilgan. Oltinchisi oddiy (1, 1, 1, 1, 1), ya'ni ikkita karta bir xil darajaga ega emas edi.

sortByRank kartalarni navbati bo'yicha saralaydi.

sortByMatch self.rankCount lug'atidagi hisoblardan foydalanib, har bir kartani o'yinlar soni bilan yangilaydi va keyin kartalarni o'yinlar soni bo'yicha saralaydi.

sortByMatchAndRank, self.rankCount lug'atidagi hisoblardan foydalanib, har bir kartani mos keladigan soni bilan yangilaydi va keyin kartalarni o'yinlar soni bo'yicha saralaydi va ikkita alohida kalit sifatida saralaydi.

Mashq kartasi, pastki va qo'l.Sizda "Card, Deck" va "Hand" darslari mavjud bo'lganda, siz ularni bir qo'li bilan o'ynashingiz mumkin bo'lgan oddiy funktsiyadan foydalanishingiz mumkin. Ushbu dastur pastki va qo'lni yaratadi; Qo'lga beshta karta kiradi. Bu qo'lni urishi mumkin. U noldan uchta kartani almashtirishi va natijada qo'lni urishi mumkin.